图像识别:利用KNN实现手写数字识别(mnist数据集)
生活随笔
收集整理的這篇文章主要介紹了
图像识别:利用KNN实现手写数字识别(mnist数据集)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖像識別:利用KNN實現手寫數字識別(mnist數據集)
步驟:
1、數據的加載(trainSize和testSize不要設置的太大)
2、k值的設定(不宜過大)
3、KNN的核心:距離的計算
4、k個最近的圖片-->根據下標尋找對應的標簽
5、根據標簽轉化成相應的數字
6、檢測概率統計
?
?在我看來,KNN算法最大的優點是簡單,準確率較高;
最大的缺點是:當數據量較大時,計算量成倍增長,測試集與訓練集之間的任意兩個元素之間都要計算距離。
注意1:trainSize和testSize不要設置的太大,如果過大,數據處理中產生更加龐大的數據,內存溢出,導致程序崩潰。
注意2:k值的設定太大會提高計算機的計算量,而且會一定程度上降低準確率。
import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets('D:/MNIST_data', one_hot=True) trainNum = 55000 testNum = 10000 trainSize = 500 testSize = 5 k = 4# data 分解 trainIndex = np.random.choice(trainNum, trainSize, replace=False) testIndex = np.random.choice(testNum, testSize, replace=False) trainData = mnist.train.images[trainIndex] # 訓練圖片 trainLabel = mnist.train.labels[trainIndex] # 訓練標簽 testData = mnist.test.images[testIndex] # 測試圖片 testLabel = mnist.test.labels[testIndex] # 測試標簽# 利用placeholder來完成數據的加載 trainDataInput = tf.placeholder(shape=[None, 784], dtype=tf.float32) trainLabelInput = tf.placeholder(shape=[None, 10], dtype=tf.float32) testDataInput = tf.placeholder(shape=[None, 784], dtype=tf.float32) testLabelInput = tf.placeholder(shape=[None, 10], dtype=tf.float32)# KNN的距離 f1 = tf.expand_dims(testDataInput, 1) # 維度擴展 f2 = tf.subtract(trainDataInput, f1) # 二者之差 f3 = tf.reduce_sum(tf.abs(f2), reduction_indices=2) f4 = tf.negative(f3) # 取反 f5, f6 = tf.nn.top_k(f4, k=k) # 最大的四個值 f5表示的是數據 f6表示的該數據所處的下標 f7 = tf.gather(trainLabelInput, f6) # 根據f6下標去尋找trainLabelInput中對應的標簽 f8 = tf.reduce_sum(f7, reduction_indices=1) f9 = tf.argmax(f8, dimension=1)with tf.Session() as sess:p9 = sess.run(f9, feed_dict={trainDataInput: trainData, testDataInput: testData, trainLabelInput: trainLabel})p10 = np.argmax(testLabel, axis=1)print('預測值:', p9)print('真實值:', p10)j = 0 for i in range(0, testSize):if p10[i] == p9[i]:j += 1 print('accuracy:', j*100/testSize)?
作死設置了一回,電腦是游戲本,屏幕出現卡頓,加速球爆滿,還好運行出來了?
?
?設置的過高,直接報錯,資源耗盡。
?訓練集數量和K值該如何確定
從上圖可以看出,trainSize不是設置的越高越好,在滿足較高準確率的同時,又不能使計算量過于龐大,需要把握訓練數據集的大小。?
從上圖可以看出,K值的設置過大反而會在一定程度上降低預測的準確率 ,所以設置k值時,需要對數據集有一定的了解,并且在一定的范圍內取值。
總結
以上是生活随笔為你收集整理的图像识别:利用KNN实现手写数字识别(mnist数据集)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习笔记(十二):边缘检测:
- 下一篇: 【linux】设置镜像源