日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像识别:利用KNN实现手写数字识别(mnist数据集)

發(fā)布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像识别:利用KNN实现手写数字识别(mnist数据集) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖像識別:利用KNN實現(xiàn)手寫數(shù)字識別(mnist數(shù)據(jù)集)

步驟:

1、數(shù)據(jù)的加載(trainSize和testSize不要設(shè)置的太大)

2、k值的設(shè)定(不宜過大)

3、KNN的核心:距離的計算

4、k個最近的圖片-->根據(jù)下標(biāo)尋找對應(yīng)的標(biāo)簽

5、根據(jù)標(biāo)簽轉(zhuǎn)化成相應(yīng)的數(shù)字

6、檢測概率統(tǒng)計

?

?在我看來,KNN算法最大的優(yōu)點是簡單,準(zhǔn)確率較高;

最大的缺點是:當(dāng)數(shù)據(jù)量較大時,計算量成倍增長,測試集與訓(xùn)練集之間的任意兩個元素之間都要計算距離。

注意1:trainSize和testSize不要設(shè)置的太大,如果過大,數(shù)據(jù)處理中產(chǎn)生更加龐大的數(shù)據(jù),內(nèi)存溢出,導(dǎo)致程序崩潰。

注意2:k值的設(shè)定太大會提高計算機的計算量,而且會一定程度上降低準(zhǔn)確率。

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] # 訓(xùn)練圖片 trainLabel = mnist.train.labels[trainIndex] # 訓(xùn)練標(biāo)簽 testData = mnist.test.images[testIndex] # 測試圖片 testLabel = mnist.test.labels[testIndex] # 測試標(biāo)簽# 利用placeholder來完成數(shù)據(jù)的加載 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) # 維度擴(kuò)展 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表示的是數(shù)據(jù) f6表示的該數(shù)據(jù)所處的下標(biāo) f7 = tf.gather(trainLabelInput, f6) # 根據(jù)f6下標(biāo)去尋找trainLabelInput中對應(yīng)的標(biāo)簽 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('預(yù)測值:', p9)print('真實值:', p10)j = 0 for i in range(0, testSize):if p10[i] == p9[i]:j += 1 print('accuracy:', j*100/testSize)

?

作死設(shè)置了一回,電腦是游戲本,屏幕出現(xiàn)卡頓,加速球爆滿,還好運行出來了?

?

?設(shè)置的過高,直接報錯,資源耗盡。

?訓(xùn)練集數(shù)量和K值該如何確定

從上圖可以看出,trainSize不是設(shè)置的越高越好,在滿足較高準(zhǔn)確率的同時,又不能使計算量過于龐大,需要把握訓(xùn)練數(shù)據(jù)集的大小。?

從上圖可以看出,K值的設(shè)置過大反而會在一定程度上降低預(yù)測的準(zhǔn)確率 ,所以設(shè)置k值時,需要對數(shù)據(jù)集有一定的了解,并且在一定的范圍內(nèi)取值。

總結(jié)

以上是生活随笔為你收集整理的图像识别:利用KNN实现手写数字识别(mnist数据集)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。