損失函式用於評價模型的準確度。無論什麼樣的網路結構,如果損失函式不正確,都難以訓練出正確的模型。
損失值用於描述**值與真實值之間的差距大小。
常用的損失函式是 均方差函式和交叉熵函式。
均方差mse = tf.reduce_mean(tf.pow(tf.sub(logits,outputs),2.0))
tensorflow中常見交叉熵函式
sigmoid交叉熵
softmax交叉熵
sparse 交叉熵
sigmoid 交叉熵
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits 計算輸出值與實際值的softmax交叉熵
tf.nn.sparse_cross_entropy_with_logits 不要求**值one-hot編碼,但是必須從0開始分類。3分類只能是0,1,2
tf.nn.sigmoid_cross_entropy_with_logits 在交叉熵的基礎上給第一項乘以乙個係數,用於改變正樣本在計算交叉熵時的損失值。
實驗,
import tensorflow as tf
import numpy as np
labels = np.array([[0,0,1],[0,1,0]]).astype(np.float)
logits = np.array([[2, 0.5, 6],[0.1, 0, 3]]).astype(np.float)
print(labels)
logits_scaled = tf.nn.softmax(logits)
logits_scaled2 = tf.nn.softmax(logits_scaled)
result1= tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits= logits)
result2= tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits= logits_scaled)
result3= -tf.reduce_sum(labels*tf.log(logits_scaled),1)
with tf.session() as sess:
print("scaled=",sess.run(logits_scaled))
print("scaled2=",sess.run(logits_scaled2))
print("rel1",sess.run(result1),"\n")
print("rel2", sess.run(result2),"\n")
print("rel3", sess.run(result3))
輸出結果:
scaled= [[0.01791432 0.00399722 0.97808846]
[0.04980332 0.04506391 0.90513277]]
scaled2= [[0.21747023 0.21446464 0.56806514]
[0.23002143 0.22893385 0.54104472]]
rel1 [0.02215516 3.09967364]
rel2 [0.56551919 1.4743222 ]
rel3 [0.02215516 3.09967364]
可以看出,softmax_cross_entropy_with_logits函式自帶softmax功能,所以傳入的值就不需要提前啟用,如果已經啟用過了就需要自行寫交叉熵函式計算,而不能直接使用tensorflow提供的演算法。
如果標籤沒有one-hot編碼,softmax交叉熵的效果會很差。
labels = np.array([[0.4,0.1,0.5],[0.3,0.6,0.1]]).astype(np.float)
輸出結果,可以看出錯誤資料和正確資料誤差區別不大,而上面的誤差查了幾百倍。
rel1 [2.17215516 2.76967364]
如果標籤是從0開始的分類,使用下面的誤差函式,效果和one-hot編碼的是一樣的。
label2 = [2,1]
result4= tf.nn.sparse_softmax_cross_entropy_with_logits(labels=label2,logits=logits)
梯度下降
梯度下降是最優化演算法,也叫最速下降法。使用負梯度為搜尋方向,沿著梯度下降的方向求解極小值。
尋找最小的損失值,推出最小的學習引數b和w,常用梯度下降演算法分為:批量梯度下降、隨機梯度下降、小批量梯度下降。
操作描述
tf.train.gradientdescentoptimizer
一般的梯度下降演算法
tf.train.adadeltaoptimizer
adadelta優化器
tf.train.adagradoptimizer
adagrad優化器
tf.train.momentumoptimizer
momentum優化器
tf.train.adamoptimizer
adam優化器
tf.train.ftlroptimizer
ftlr優化器
tf.train.rmspropoptimizer
rmsprop優化器
梯度下降演算法需要使用學習率,而學習率的選擇可以使用「退化學習率」。
def exponential_decay(learning_rate,global_step,decay_step,decay_rate,staircase=false,name=none)
學習率衰減速度由 global_step,decay_steps決定。
decayed_learning_rate = learning_rate_*decay_rate^(global_step/decay_steps)
使用方法:
global_step= tf.variable(0.,trainable=false)
inital_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(inital_learning_rate,global_step= global_step,decay_steps=10,decay_rate=0.9)
opt = tf.train.gradientdescentoptimizer(learning_rate)
add_global = global_step.assign_add(1)
with tf.session() as sess:
tf.global_variables_initializer().run()
print(sess.run(learning_rate))
for i in range(20):
g,rate = sess.run([add_global,learning_rate])
print(g,rate)
maxout網路是單個神經元的擴充套件,主要是擴充套件單個神經元的啟用函式,將多個神經元並列放在一起,找出輸出結果中最大的那個,代表對特徵響應最敏感,然後取這個神經元的結果參與後面的運算。 TensorFlow 損失函式
import numpy as np import tensorflow as tf sess tf.interactivesession 1.多分類中的softmax函式在多分類的神經網路中,通常在最後一層接乙個softmax層。對於n分類問題,softmax層就有n個結點,每個結點輸出的就是該類...
TensorFlow損失函式
tensorflow損失函式 正如前面所討論的,在回歸中定義了損失函式或目標函式,其目的是找到使損失最小化的係數。本文將介紹如何在 tensorflow 中定義損失函式,並根據問題選擇合適的損失函式。宣告乙個損失函式需要將係數定義為變數,將資料集定義為佔位符。可以有乙個常學習率或變化的學習率和正則化...
tf 損失函式 TensorFlow裡面損失函式
2 交叉熵 交叉熵 crossentropy 也是loss演算法的一種,一般用在分類問題上,表達的意識為 輸入樣本屬於某一類的概率 其表示式如下,其中y代表真實值分類 0或1 a代表 值。在tensorflow中常見的交叉熵函式有 sigmoid交叉熵 softmax交叉熵 sparse交叉熵 加權...