TensorFlow經典案例2:實現最近鄰算法


本次案例需要大家了解關於手寫數字識別(mnist)的數據集的特點和結構:

#TensorFlow實現最近鄰算法
#次案例的前提是了解mnist數據集(手寫數字識別)
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
#導入mnist數據集
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

#5000樣本作為訓練集 每一個訓練和測試樣本的數據都是1*784的矩陣,標簽是1*10的矩陣並且采用one-hot編碼
X_train , Y_train = mnist.train.next_batch(5000)
#600樣本作為測試集
X_test , Y_test = mnist.test.next_batch(200)

#創建占位符 None代表將來可以選多個樣本的,如:[60,784]代表選取60個樣本,每一個樣本的是784列
x_train = tf.placeholder("float",[None,784])
x_test = tf.placeholder("float",[784])#x_test代表只用一個樣本
#計算距離
#tf.negative(-2)的輸出的結果是2
#tf.negative(2)的輸出的結果是-2
#reduce_sum的參數reduction_indices解釋見下圖
#計算一個測試樣本和訓練樣本的的距離
#distance 返回的是N個訓練樣本的和單個測試樣本的距離
distance = tf.reduce_sum(tf.abs(tf.add(x_train,tf.negative(x_test))),reduction_indices=1)
#的到距離最短的訓練樣本的索引
prediction = tf.arg_min(distance,0)
accuracy = 0
#初始化變量
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)

    for i in range(len(X_test)):#遍歷整個測試集,每次用一個的測試樣本和整個訓練樣本的做距離運算
        #獲得最近鄰
        # 獲得訓練集中與本次參與運算的測試樣本最近的樣本編號
        nn_index = sess.run(prediction,feed_dict={x_train:X_train,x_test:X_test[i,:]})
        #打印樣本編號的預測類別和准確類別
        print("Test",i,"Prediction:",np.argmax(Y_train[nn_index]),"True Class:",np.argmax(Y_test[i]))
        if np.argmax(Y_train[nn_index]) == np.argmax(Y_test[i]):
            #如果預測正確。更新准確率
            accuracy += 1./len(X_test)
    print("完成!")
    print("准確率:",accuracy)

  輸出:

Test 196 Prediction: 7 True Class: 9
Test 197 Prediction: 9 True Class: 9
Test 198 Prediction: 1 True Class: 9
Test 199 Prediction: 9 True Class: 9
完成!
准確率: 0.9150000000000007

公眾號:一個有趣的機器學習社區

(分享大量AI大數據資源)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM