Neural Network 學習3 Top-k的學習例項
阿新 • • 發佈:2020-11-05
import tensorflow as tf
tf.random.set_seed(2467) # 隨機種子,我也沒搞明白是什麼玩意
output = tf.random.normal([10, 6]) # 模擬預測的結果,10個樣本,6類分類
output = tf.math.softmax(output, axis=1) # 使得每一行的總和為1(歸一化的感覺)
target = tf.random.uniform([10], maxval=6, dtype=tf.int32) # 10個樣本的真實標籤
print('原始資料:', output.numpy())
pred = tf.argmax(output, axis=1) # 10個樣本預測的類別是
print('預測類別:', pred.numpy())
print('實際類別:', target.numpy())
def accuracy(output, target, topk=(1,)): # 定義求精確度的函式
maxk = max(topk) # maxk=6
batch_size = target.shape[0] # batch_size的值為10
pred = tf.math.top_k(output, maxk).indices # 獲得每個樣本最符合的前6個類別的索引 (10,6)
pred = tf.transpose(pred, perm=[1, 0]) # 轉置一下pred矩陣 (6,10)
target_ = tf.broadcast_to(target, pred.shape) # 將真實類別廣播到相同大小的矩陣,方便比較 (6,10)
correct = tf.equal(pred, target_) # 得到一個由True和False組成的(6,10)的矩陣
res = [] # 這是要返回的精確值
for k in topk:
# 計算前k行的所有1的和,所有預測對的值
correct_k = tf.reduce_sum(tf.cast(tf.reshape(correct[:k], [-1]), dtype=tf.int32))
acc = float(correct_k / batch_size) # 求精確度
res.append(acc)
return res
acc = accuracy(output, target, topk=(1, 2, 3, 4, 5, 6))
print('top1-6的accuracy是:', acc)