【tensorflow】tf.one_hot,tf.reduce_mean,tf.argmax,tf.equal,tf.cast學習
阿新 • • 發佈:2019-02-06
由於使用tensorflow訓練時經常用到一些對求準確率、損失值、預測值等資料處理的函式,特此記錄一下。
0、準備資料
首先準備一些資料,作為計算後的y值和真實標籤t。
一維,長度是10,代表10組資料,每個數字代表一種類別,共4種類別,0 1 2 3。
可以看到一共10組資料,有兩組不一樣,所以後面計算得到的準確率應該是0.8。
import numpy as np
import tensorflow as tf
y_ = [0,0,0,1,1,1,2,2,2,3]
t_ = [0,0,1,1,1,2,2,2,2,3]
y_ = np.array(y_)
t_ = np.array(t_)
print y_.shape
print y_
print t_.shape
print t_
1、tf.one_hot
由於拿到的標籤是數字,在tensorflow中經常要轉換為一組向量,長度是資料的個數,比如10,如果一個數據類別是3,則座標為3的值為1,其他皆為0,如[0 0 0 1 0 0 0 0 0 0]。
所以需要用到tf.one_hot函式。第一個引數代表要轉換的資料,第二個引數代表類別個數。
y_label = tf.one_hot(y_, 4)
t_label = tf.one_hot(t_, 4)
print y_label.shape
print y_label
print t_label.shape
print t_label
sess = tf.Session()
print sess.run(y_label)
print "############"
print sess.run(t_label)
2、tf.reduce_mean
求平均值,第一個引數是輸入的tensor。如果沒有指定axis,則預設所有的值求平均值。如果指定axis,則以axis的維度求平均值。
如:
x = tf.constant([[1., 1.], [2., 2.]])
tf.reduce_mean(x) # 1.5
tf.reduce_mean(x, 0) # [1.5, 1.5]
tf.reduce_mean(x, 1 ) # [1., 2.]
這裡是對取得loss後做的求平均值。
loss = tf.losses.softmax_cross_entropy(y_label,t_label)
loss_t = tf.reduce_mean(loss)
print loss
print loss_t
print sess.run(loss)
print sess.run(loss_t)
3、tf.argmax
返回某一維度上最大值的下標。獲得輸出值類別和真實標籤類別。
y_111 = tf.argmax(y_label, 1)
t_111 = tf.argmax(t_label, 1)
print y_111
print t_111
print sess.run(y_111)
print sess.run(t_111)
4、tf.equal
返回比較結果後的一組true或false的向量。
pre = tf.equal(y_111, t_111)
print pre
print sess.run(pre)
5、tf.cast
轉換資料型別。如:
x = tf.constant([1.8, 2.2], dtype=tf.float32)
tf.cast(x, tf.int32) # [1, 2], dtype=tf.int32
以下,將bool值轉換為float32。
pre_f = tf.cast(pre, tf.float32)
print pre_f
print sess.run(pre_f)
6、綜合程式碼
import numpy as np
import tensorflow as tf
y_ = [0,0,0,1,1,1,2,2,2,3]
t_ = [0,0,0,1,1,1,2,2,2,3]
y_ = np.array(y_)
t_ = np.array(t_)
print y_.shape
print y_
print t_.shape
print t_
y_label = tf.one_hot(y_, 4)
t_label = tf.one_hot(t_, 4)
print y_label.shape
print y_label
print t_label.shape
print t_label
sess = tf.Session()
print sess.run(y_label)
print sess.run(t_label)
loss = tf.losses.softmax_cross_entropy(y_label,t_label)
loss_t = tf.reduce_mean(loss)
print loss
print loss_t
print sess.run(loss)
print sess.run(loss_t)
y_111 = tf.argmax(y_label, 1)
t_111 = tf.argmax(t_label, 1)
print y_111
print t_111
print sess.run(y_111)
print sess.run(t_111)
pre = tf.equal(y_111, t_111)
print pre
print sess.run(pre)
pre_f = tf.cast(pre, tf.float32)
print pre_f
print sess.run(pre_f)
acc = tf.reduce_mean(pre_f)
print acc
print sess.run(acc)