tensorflow 損失函式與啟用函式

2021-09-24 05:35:13 字數 3816 閱讀 7999

損失函式用於評價模型的準確度。無論什麼樣的網路結構,如果損失函式不正確,都難以訓練出正確的模型。

損失值用於描述**值與真實值之間的差距大小。

常用的損失函式是 均方差函式和交叉熵函式。

均方差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交叉熵 加權...