08-KNN手寫數字識別

標簽下載地址

文件內容備注
train-images-idx3-ubyte.gz訓練集圖片:55000張訓練圖片,5000張驗證圖片
train-labels-idx1-ubyte.gz訓練集圖片對應的數字標簽
t10k-images-idx3-ubyte.gz測試集圖片:10000張圖片t表示test,測試圖片,10k表示10*1000一共一萬張圖片
t10k-labels-idx1-ubyte.gz測試集圖片對應的數字標簽

對于每一個樣本都有一個對應的標簽進行唯一的標識,故為一個監督學習
操作的每個圖片必須是灰度圖(單通道0是白色,1是黑色)
對于標簽5401
在這里插入圖片描述
標簽中的4,并不是存儲4這個數字,而是存儲十位(0-9),第五行為黑色,則為1,即0000100000,因為1所處于第5個,即描述為:4
在這里插入圖片描述

KNN最近鄰域法

KNN的根本原理:一張待檢測的圖片,與相應的樣本進行比較,如果在樣本圖片中存在K個與待檢測圖片相類似的圖片,那么就會把當前這K個圖片記錄下來。再在這K個圖片中找到相似性最大的(例如10個圖片中有8個描述的當前數字都是1,那么這個圖片檢測出來的就是1)

裝載圖片:
input_data.read_data_sets('MNIST_data',one_hot=True)
參數一:當前文件夾的名稱
參數二:one_hot是個布爾類型,one_hot中有一個為1,其余都為0

隨機獲取訓練數組的下標:
np.random.choice(trainNum,trainSize,replace=False)
參數一:隨機值的范圍
參數二:生成trainSize這么多個隨機數
參數三:是否可以重復
在0-trainNum之間隨機選取trainSize這么多個隨機數,且不可重復

import tensorflow as tf
import numpy as np
import random 
from tensorflow.examples.tutorials.mnist import input_data
# load data 2 one_hot : 1 0000 1 fileName 
mnist = input_data.read_data_sets('E:\\Jupyter_workspace\\study\\DL\\MNIST_data',one_hot=True)#完成數據的裝載,將裝載的圖片放入mnist中
# 屬性設置
trainNum = 55000#總共需要訓練多少張圖片
testNum = 10000#測試圖片
trainSize = 500#訓練是需要多少張圖片
testSize = 5#測試多少張圖片
k = 4#從訓練樣本中找到K個與測試圖片相近的圖片,并且統計這K個圖片中類別最多的幾,并且把這個數作為最終的結果
# data 分解 1 trainSize   2范圍0-trainNum 3 replace=False #數據的分解
#這里使用的是隨機獲取測試圖片和訓練圖片的下標,故每次運行的結果都會不一樣
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]
print('trainData.shape=',trainData.shape)#訓練數據的維度 500*784  500表示圖片個數  圖片的寬高為28*28 = 784,即圖片上有784個像素點
print('trainLabel.shape=',trainLabel.shape)#訓練標簽的維度 500*10
print('testData.shape=',testData.shape)#測試數據的維度 5*784
print('testLabel.shape=',testLabel.shape)#測試標簽的維度 5*10
print('testLabel=',testLabel)
#testLabel是個五行十列的數據,在標簽中,所有的數據都放在數組中進行表示
'''
testLabel= [[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]    3--->testData [0][0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]               1--->testData [1][0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]               9--->testData [2][0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]               6--->testData [3][0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]              4--->testData [4]
'''# tf input  784->image
trainDataInput = tf.placeholder(shape=[None,784],dtype=tf.float32)#定義訓練的數組,784列的數據表示一張完整的圖片,前面的行表示圖片的個數這里用None表示
trainLabelInput = tf.placeholder(shape=[None,10],dtype=tf.float32)#列為10,因為每個數字都是10維的
testDataInput = tf.placeholder(shape=[None,784],dtype=tf.float32)#定義測試數據
testLabelInput = tf.placeholder(shape=[None,10],dtype=tf.float32)#定義測試標簽#KNN的距離公式:
#knn distance 5*785.  5*1*784
# 5 500 784 (3D) 2500*784#計算trainData測試圖片和trainData訓練圖片的距離之差,測試圖片有5張,訓練圖片有500張,每個維度都是784維,故最后計算的結果為一個三維數據,(測試數據,訓練數據,二者之差),會產生5*500*784個數據,故需要擴展testDataInput的維度f1 = tf.expand_dims(testDataInput,1) # 完成當前的維度轉換,原本的testDataInput是一個5*785,經過維度轉換則成為5*1*784  維度擴展
f2 = tf.subtract(trainDataInput,f1)# 完成測試圖片與訓練圖片二者之差,得到的結果放入784維中,可以通過sum將這784維的差異累加到一塊,即sum(784)
f3 = tf.reduce_sum(tf.abs(f2),reduction_indices=2)# 所有的數據都裝載到f2中,因為有的距離是負數,需要取絕對值;設置在第二個維度上進行累加 即:完成數據累加取絕對值之后的784個像素點之間的差異 
#所有的差異距離都放入在放f3中,是個5*500數組f4 = tf.negative(f3)# 取反
f5,f6 = tf.nn.top_k(f4,k=4) # 選取f4中所有元素最大的四個值,因為f4是f3的取反,故選取f3中最小的四個數值
#f5為f3中最小的數,f6為這個最下的數所對應的下標# f6 index->trainLabelInput
#f6存儲的是最近的圖片的下標,通過這些下標作為索引去獲取圖片的標簽
f7 = tf.gather(trainLabelInput,f6)#根據f6的下標來# f8 f9都是表示數字的獲取# f8 num reduce_sum  reduction_indices=1 '豎直'
f8 = tf.reduce_sum(f7,reduction_indices=1)#完成數字的累加,將f7這個三維通過豎直的方向進行累加# tf.argmax 選取f8中,某一個最大的值,并記錄其所處的下標index
f9 = tf.argmax(f8,dimension=1)#
# f9為5張測試圖片中最大的下標 test5 image -> 5 num
with tf.Session() as sess:# f1 <- testData 5張圖片p1 = sess.run(f1,feed_dict={testDataInput:testData[0:testSize]})#運行f1并給其一個參數,這個參數是testData測試圖片,testData中總共有5張圖片,這5張圖片維待檢測的手寫數字print('p1=',p1.shape)# p1= (5, 1, 784) 每個圖片必須用784維來表示p2 = sess.run(f2,feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize]})#運行f2 表示訓練數據和測試二者對應數據做差print('p2=',p2.shape)#p2= (5, 500, 784) 例如:(1,100)表示第2張測試圖片和第101張訓練圖片所有的像素對應做差都放入784中,784都為具體的值,故需要對784進行累加  p3 = sess.run(f3,feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize]})#print('p3=',p3.shape)#p3= (5, 500)表示(測試圖片是哪一張,訓練圖片是哪一張)print('p3[0,0]=',p3[0,0]) #130.451表示第1張測試圖片和第1張訓練圖片的距離差   knn distance p3[0,0]= 155.812p4 = sess.run(f4,feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize]})print('p4=',p4.shape)print('p4[0,0]',p4[0,0])p5,p6 = sess.run((f5,f6),feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize]})#p5= (5, 4) 每一張測試圖片(5張)分別對應4張最近訓練圖片#p6= (5, 4)print('p5=',p5.shape)print('p6=',p6.shape)print('p5[0,0]',p5[0])# 第1張測試圖片分別對應4張最近訓練圖片的值print('p6[0,0]',p6[0])# 第1張測試圖片分別對應4張最近訓練圖片的下標p7 = sess.run(f7,feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize],trainLabelInput:trainLabel})print('p7=',p7.shape)#p7= (5, 4, 10)表示5組4行10列print('p7[]',p7)#5組表示5個測試圖片,4行每行表示一個最近的測試圖片,每一行中又有10個元素,這10個元素分別對應10個lable標簽p8 = sess.run(f8,feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize],trainLabelInput:trainLabel})print('p8=',p8.shape)#p8=(5,10)print('p8[]=',p8)#5行10列,每一行為f7每一組所對應的豎直方向上的累加p9 = sess.run(f9,feed_dict={trainDataInput:trainData,testDataInput:testData[0:testSize],trainLabelInput:trainLabel})print('p9=',p9.shape)#p9=(5,)是一個一維數組,5列print('p9[]=',p9)#每一個元素表示p8中最大值所對應的下標p10 = np.argmax(testLabel[0:testSize],axis=1)#最終標簽中的內容,統計一下第2個維度上的標簽print('p10[]=',p10)#若p9和p10的內容相同,則檢測概率為100%j = 0
for i in range(0,5):if p10[i] == p9[i]:j = j+1
print('ac=',j*100/testSize)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378521.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MFC odbc訪問遠程數據庫

首先&#xff0c;MFC通過ODBC訪問數據庫&#xff0c;主要使用兩個類&#xff0c;一個是CDataBase&#xff0c;一個是CRecordset。第一個是用于建立數據庫連接的&#xff0c;第二個是數據集&#xff0c;用來查詢的。步驟如下&#xff1a;1.實例化一個CDataBase對象&#xff0c;并…

微機原理——擴展存儲器設計

目錄【1】存儲器的層次結構【2】存儲器的分類【3】SRAM1、基本原理&#xff1a;2、結構&#xff1a;3、芯片參數與引腳解讀&#xff1a;4、CPU與SRAM的連接方式【4】DRAM1、基本原理&#xff1a;2、結構3、芯片引腳解讀&#xff1a;【5】存儲器系統設計【6】存儲器擴展設計&…

floatvalue 重寫_Java Number floatValue()方法與示例

floatvalue 重寫Number類floatValue()方法 (Number Class floatValue() method) floatValue() method is available in java.lang package. floatValue()方法在java.lang包中可用。 floatValue() method is used to return the value denoted by this Number object converted …

array_column php什么版本可以用,array_column兼容php5.5以下版本

gistfile1.txt// ----------------------------------------------------------------------// |獲取二維數組中指定的一列&#xff0c;PHP5.5以后有專用函數array_column()// ----------------------------------------------------------------------// |param array $arr// …

。net學習之控件的使用注意點

jQuery使用 1、自定義屬性的使用<script>$(#xwjj_i_main br[brinfoPd_KangQiao_Subject_Xwjj_br_1]).hide();</script> 2、ready代碼塊$(document).ready(function(){ //你的代碼}); 3、簡單的特效hide&#xff08;&#xff09;$("a").click(function()…

09-CNN手寫數字識別

CNN卷積神經網絡的本質就是卷積運算 維度的調整&#xff1a; tf.reshape(imageInput,[-1,28,28,1]) imageInput為[None,784]&#xff0c;N行* 784維 調整為 M28行28列*1通道 即&#xff1a;二維轉化為四維數據 參數一&#xff1a;等價于運算結果M 參數二&#xff1a;28 28 表示…

【轉】左值與右值

出處&#xff1a;http://www.embedded.com/electronics-blogs/programming-pointers/4023341/Lvalues-and-Rvalues C and C enforce subtle differences on the expressions to the left and right of the assignment operator If youve been programming in either C or C for…

Opencv將處理后的視頻保存出現的問題

問題描述&#xff1a; 代碼運行過程中&#xff0c;imshow出來的每幀的效果圖是正確的&#xff0c;但是按照網上的方法保存下來卻是0kb&#xff0c;打開不了。 參考的網上的一些方法&#xff0c;均是失敗的&#xff0c;具體原因我也不清楚&#xff1a; 1、例如我這樣設置&#x…

Java Number shortValue()方法與示例

Number類shortValue()方法 (Number Class shortValue() method) shortValue() method is available in java.lang package. shortValue()方法在java.lang包中可用。 shortValue() method is used to return the value denoted by this Number object converted to type short (…

MATLAB可以打開gms文件嗎,gms文件擴展名,gms文件怎么打開?

.gms文件類型&#xff1a;Gesture and Motion Signal File擴展名為.gms的文件是一個數據文件。文件說明&#xff1a;Low-level, binary, minimal but generic format used to organize and store Gesture and Motion Signals in a flexible and optimized way; gesture-related…

黑白圖片顏色反轉并保存

將圖像的黑白顏色反轉并保存 import cv2 # opencv讀取圖像 img cv2.imread(rE:\Python-workspace\OpenCV\OpenCV/YY.png, 1) cv2.imshow(img, img) img_shape img.shape # 圖像大小(565, 650, 3) print(img_shape) h img_shape[0] w img_shape[1] # 彩色圖像轉換為灰度圖…

家貓WEB系統

現在只放源碼在些.為它寫應用很簡單有空整理文檔演示地址:jiamaocode.com/os/ 源碼&#xff1a;http://jiamaocode.com/ProCts/2011/04/14/1918/1918.html轉載于:https://www.cnblogs.com/jiamao/archive/2011/04/16/2018339.html

C# DataRow數組轉換為DataTable

public DataTable ToDataTable(DataRow[] rows) { if (rows null || rows.Length 0) return null; DataTable tmp rows[0].Table.Clone(); // 復制DataRow的表結構 foreach (DataRow row in rows) tmp.Rows.Add(row); // 將DataRow添加…

plesk 運行不了php,如何在Plesk中使用composer(使用其他版本的PHP運行Composer)

對于基于Plesk的服務器, composer的默認安裝將使用系統安裝的PHP版本, 而不使用Plesk所安裝的任何版本。盡管Composer至少需要PHP 5.3.2, 但是當你嘗試在需要特定版本PHP的項目中安裝依賴項時, 就會出現問題。例如, 如果你有一個至少需要PHP 7.2的項目, 并且系統的默認PHP安裝是…

Java Calendar hashCode()方法與示例

日歷類hashCode()方法 (Calendar Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to retrieve the hash code value of this Calendar. hashCode()方法用于檢索此Calendar的哈…

Error: Flash Download failed - Target DLL has been cancelled

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 由于換了新電腦,keil重裝了下,然而之前的MCU的支持包沒有安裝,以及一些其他的問題,導致可以編譯但是不能將程序燒錄到單片…

設計一個較為合理的實驗方案來研究芳綸纖維的染色熱力學性能

請你設計一個較為合理的實驗方案來研究芳綸纖維的染色熱力學性能?包括吸附等溫線、親和力、染色熱和染色熵的測定,并指出實驗中應注意哪些事項來減少實驗誤差? 標準答案: 染色熱力學理論研究染色平衡問題。研究染色熱力學性能:首先研究選擇適宜的染料 吸附等溫線類型測定…

我也談委托與事件

雖然在博客園里面已經有很多關于C#委托和事件的文章&#xff0c;但是為了自己在學習的過程中&#xff0c;加深對委托的理解&#xff0c;我還是決定寫一下自己的心得體會。以備他日在回來復習。委托&#xff08;delegate&#xff09;是一個類&#xff0c;但是這個類在聲明的時候…

php錯誤攔截機制,php攔截異常怎么寫-PHP問題

php攔截異常可以通過PHP的錯誤、異常機制及其內建數set_exception_handler、set_error_handler、register_shutdown_function 來寫。首先我們定義錯誤攔截類&#xff0c;該類用于將錯誤、異常攔截下來&#xff0c;用我們自己定義的處理方式進行處理&#xff0c;該類放在文件名為…

智能車復工日記【4】:關于圖像的上下位機的調整問題總結

系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能車Code review】——坡道圖像與控制處理 【智能車Code review】——拐點的尋找 【智能車Code review】——小S與中S道路判斷 【智能車Code review】——環島的判定與補線操作 智能車復工日記【1】——菜單索引…