本篇文章介紹一下tensorflow中必須要掌握的基礎知識點,就是損失函式,因為最終訓練迭代優化就是損失函式,那麼總體來說它可以分為兩大類:
1 以回歸為主:mse-均方根誤差
2 以分類為主:softmax-交叉熵
3 根據特定場景:自定義損失函式
接下來我們具體來通過**講解每種具體的例項:
首先我們看一下均方根誤差-mse
import tensorflow as tf關於交叉熵有兩種使用方法,一種是自定義交叉熵,一種是使用tensorflow自帶的幾種,接下來分別來講解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))
& 自定義交叉熵
import tensorflow as tfclib_by_value為了防止出現log0這種情況,還有不要忘記前面的'-',實際使用中建議使用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)
& 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())
# 基於單標籤多分類注意:前4個函式,返回的不是乙個具體的數值,而是乙個向量,所以如果要求交叉熵需要使用tf.reduce_sum()進行求和,如果還想求解最終的loss,需要再使用tf.reduce_mean()....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()
& 自定義損失函式:這個根據業務場景可以很簡單也可以很複雜,接下來我們看乙個比較簡單的使用場景
# -*- 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,也比較好理解,就是 值和真實值直接的差距最小。分類損失函式 分類損失函式的種模擬較多,常見的分類...