損失函式總結

2021-08-28 21:46:19 字數 3593 閱讀 8960

本篇文章介紹一下tensorflow中必須要掌握的基礎知識點,就是損失函式,因為最終訓練迭代優化就是損失函式,那麼總體來說它可以分為兩大類:

1 以回歸為主:mse-均方根誤差

2 以分類為主:softmax-交叉熵

3 根據特定場景:自定義損失函式

接下來我們具體來通過**講解每種具體的例項:

首先我們看一下均方根誤差-mse

import tensorflow as tf

session = tf.interactivesession()

y_ = tf.constant([1,2,3],dtype=tf.float32,shape=[3,1])

y1 = tf.constant([1,2,3],dtype=tf.float32,shape=[3,1])

y2 = tf.constant([3,5,5],dtype=tf.float32,shape=[3,1])

#先求差的平方,然後再求平均

mes = tf.reduce_mean(tf.square(y2-y_))

# reduce_sum 使用它的目的 如果當求差的平法之後是乙個向量,需要先用這個函式求和

mes1 = tf.reduce_mean(tf.reduce_sum(tf.square(y2-y_)))

print(session.run(mes))

print(session.run(mes1))

關於交叉熵有兩種使用方法,一種是自定義交叉熵,一種是使用tensorflow自帶的幾種,接下來分別來講解

& 自定義交叉熵

import tensorflow as tf

session = tf.interactivesession()

y_ = tf.constant([[1.0, 0, 0]]) # 正確標籤

y1 = tf.constant([[0.9, 0.06, 0.04]]) # **結果1

y2 = tf.constant([[0.5, 0.3, 0.2]]) # **結果2

# 自定義交叉熵

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y1, 1e-10, 1.0)))

print('cross_entropy',cross_entropy)

clib_by_value為了防止出現log0這種情況,還有不要忘記前面的'-',實際使用中建議使用tf自帶的損失函式

& tensorflow自帶實現的交叉熵

# -*- coding: utf-8 -*-

import tensorflow as tf

session = tf.interactivesession()

y_ = tf.constant([[1.0, 0, 0]]) # 正確標籤

y3 = tf.constant([[10.0, 3.0, 2.0]])

y4 = tf.constant([[5.0, 3.0, 1.0]])

# 該操作應該施加在未經過softmax處理的logits上,否則會產生錯誤結果

# labels為期望輸出,且必須採用labels=y_, logits=y的形式將引數傳入

cross_entropy_v2_1 = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y3)

cross_entropy_v2_2 = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y4)

print('v2_1', cross_entropy_v2_1.eval())

print('v2_2',cross_entropy_v2_2.eval())

我們舉了其中的乙個實現方法講解,其實它提供了幾大類,分別對應不同的場景實現:

# 基於單標籤多分類

tf.nn.softmax_cross_entropy_with_logits()

#基於單標籤單分類

tf.nn.sparse_softmax_cross_entropy_with_logits()

#基於多標籤多分類

tf.nn.sigmoid_cross_entropy_with_logits()

# 基於權重的損失函式

tf.nn.weighted_cross_entropy_with_logits()

# 基於詞向量的nce

tf.nn.nce_loss()

注意:前4個函式,返回的不是乙個具體的數值,而是乙個向量,所以如果要求交叉熵需要使用tf.reduce_sum()進行求和,如果還想求解最終的loss,需要再使用tf.reduce_mean()....

& 自定義損失函式:這個根據業務場景可以很簡單也可以很複雜,接下來我們看乙個比較簡單的使用場景

# -*- coding: utf-8 -*-

import tensorflow as tf

from numpy.random import randomstate

batch_size=8

# 定義兩個輸入節點

x=tf.placeholder(tf.float32,shape=(none,2),name='x-input')

# 回歸問題一般只有乙個輸出節點

y_=tf.placeholder(tf.float32,shape=(none,1),name='y-input')

# 定義乙個單層的神經網路

w1=tf.variable(tf.random_normal([2,1],stddev=1,seed=1))

y=tf.matmul(x,w1)

#自己定義損失函式

# 如果y>y_ 取(y-y_)* 1

# 如果y<=y_ 取(y_-y)*10

# 根據loss結果可以自動調節這個計算方式和係數的值

loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*1,(y_-y)*10))

train_step=tf.train.adamoptimizer(0.001).minimize(loss)

# 隨機生成乙個模擬資料集

rdm=randomstate(1)

dataset_size=128

x=rdm.rand(dataset_size,2)

# 設定隨機雜訊,範圍在-0.05~0.05

y = [[x1+x2+rdm.rand()/10.0-0.05] for (x1,x2) in x]

# 訓練神經網路

with tf.session() as sess:

init_op = tf.global_variables_initializer()

sess.run(init_op)

steps=5000

for i in range(steps):

start=(i*batch_size) % dataset_size

end = min(start+batch_size,dataset_size)

sess.run(train_step,feed_dict=)

print(sess.run(w1))

損失函式總結

1.什麼是損失函式 損失函式 loss function 是用來估量模型的 值f x 與真實值y的不一致程度,它是乙個非負實值函式,通常使用l y,f x 來表示,損失函式越小,模型認為效能就越好。2.損失函式,代價函式和目標函式的區別 損失函式 計算的是乙個樣本的誤差 代價函式 是整個訓練集上所有...

損失函式總結

注意 當我們用mse做為損失函式的時候,最好別用sigmoid,tanh這類的啟用函式。從數學的角度來理解,sigmoid函式當x趨於正無窮或者負無窮的時候,函式值接近於1和0,也就是當自變數大於一定值的時候,函式變得非常平緩,斜率比較小,甚至變為0。然後當斜率很小的時候,他的導數就很小,而bp在反...

損失函式總結

損失函式對於機器學習演算法來說是至關重要的一環,大部分機器學習演算法都是通過梯度下降來進行學習的。下降的目標就是讓損失函式達到最小值。回歸損失函式 回歸的損失函式比較少,常見的有mse,mae,rmse,也比較好理解,就是 值和真實值直接的差距最小。分類損失函式 分類損失函式的種模擬較多,常見的分類...