


一、誤差值
度量兩個張量或者一個張量和零之間的損失誤差,這個可用於在一個回歸任務或者用於正則的目的(權重衰減)。
l2_loss
tf.nn.l2_loss(t, name=None)解釋:這個函數的作用是利用 L2 范數來計算張量的誤差值,但是沒有開方並且只取 L2 范數的值的一半,具體如下:
output = sum(t ** 2) / 2輸入參數:
t: 一個Tensor。數據類型必須是一下之一:float32,float64,int64,int32,uint8,int16,int8,complex64,qint8,quint8,qint32。雖然一般情況下,數據維度是二維的。但是,數據維度可以取任意維度。name: 為這個操作取個名字。輸出參數:
一個
Tensor,數據類型和t相同,是一個標量。
使用例子
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(2, 3), dtype = tf.float32 )
output = tf.nn.l2_loss(input_data)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
二、分類器
sigmoid_cross_entropy_with_logits
sigmoid_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)解釋:這個函數的作用是計算
logits經 sigmoid 函數激活之后的交叉熵。對於一個不相互獨立的離散分類任務,這個函數作用是去度量概率誤差。比如,比如,在一張圖片中,同時包含多個分類目標(大象和狗),那么就可以使用這個函數。
為了描述簡潔,我們規定
x = logits,z = targets,那么 Logistic 損失值為:x - x * z + log( 1 + exp(-x) )為了確保計算穩定,避免溢出,真實的計算實現如下:
max(x, 0) - x * z + log(1 + exp(-abs(x)) )輸入參數:
logits: 一個Tensor。數據類型是以下之一:float32或者float64。targets: 一個Tensor。數據類型和數據維度都和logits相同。name: 為這個操作取個名字。輸出參數:
一個
Tensor,數據維度和logits相同。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(1,3), dtype = tf.float32 )
output = tf.nn.sigmoid_cross_entropy_with_logits(input_data, [[1.0,0.0,0.0]])
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
早期使用,后來多使用softmax。


softmax
tf.nn.softmax(logits, name=None)解釋:這個函數的作用是計算 softmax 激活函數。
對於每個批
i和 分類j,我們可以得到:softmax[i, j] = exp(logits[i, j]) / sum(exp(logits[i]))輸入參數:
logits: 一個Tensor。數據類型是以下之一:float32或者float64。數據維度是二維[batch_size, num_classes]。name: 為這個操作取個名字。輸出參數:
一個
Tensor,數據維度和數據類型都和logits相同。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( [[0.2, 0.1, 0.9]] , dtype = tf.float32 )
output = tf.nn.softmax(input_data)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
log_softmax
tf.nn.log_softmax(logits, name=None)解釋:這個函數的作用是計算 softmax 激活函數。
對於每個批
i和 分類j,我們可以得到:softmax[i, j] = log(exp(logits[i, j]) / sum(exp(logits[i])))輸入參數:
logits: 一個Tensor。數據類型是以下之一:float32或者float64。數據維度是二維[batch_size, num_classes]。name: 為這個操作取個名字。輸出參數:
一個
Tensor,數據維度和數據類型都和logits相同。
softmax_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)解釋:這個函數的作用是計算
logits經 softmax 函數激活之后的交叉熵。對於每個獨立的分類任務,這個函數是去度量概率誤差。比如,在 CIFAR-10 數據集上面,每張圖片只有唯一一個分類標簽:一張圖可能是一只狗或者一輛卡車,但絕對不可能兩者都在一張圖中。(這也是和
tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)這個API的區別)警告:輸入API的數據
logits不能進行縮放,因為在這個API的執行中會進行 softmax 計算,如果logits進行了縮放,那么會影響計算正確率。不要調用這個API區計算 softmax 的值,因為這個API最終輸出的結果並不是經過 softmax 函數的值。
logits和labels必須有相同的數據維度[batch_size, num_classes],和相同的數據類型float32或者float64。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( [[0.2, 0.1, 0.9]] , dtype = tf.float32 )
output = tf.nn.softmax_cross_entropy_with_logits(input_data, [[1,0,0]])
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))


sparse_softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None)解釋:這個函數的作用是計算
logits經 softmax 函數激活之后的交叉熵,同softmax_cross_entropy_with_logits,只是logits的shape是[batch, class], label的shape是[batch],不用人為one_hot編碼。
weighted_cross_entropy_with_logits

