生活随笔
收集整理的這篇文章主要介紹了
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
mnist
= input_data
.read_data_sets
('E:\\Jupyter_workspace\\study\\DL\\MNIST_data',one_hot
=True)
trainNum
= 55000
testNum
= 10000
trainSize
= 500
testSize
= 5
k
= 4
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
)
print('trainLabel.shape=',trainLabel
.shape
)
print('testData.shape=',testData
.shape
)
print('testLabel.shape=',testLabel
.shape
)
print('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]
'''
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
)
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
=4)
f7
= tf
.gather
(trainLabelInput
,f6
)
f8
= tf
.reduce_sum
(f7
,reduction_indices
=1)
f9
= tf
.argmax
(f8
,dimension
=1)
with tf
.Session
() as sess
:p1
= sess
.run
(f1
,feed_dict
={testDataInput
:testData
[0:testSize
]})print('p1=',p1
.shape
)p2
= sess
.run
(f2
,feed_dict
={trainDataInput
:trainData
,testDataInput
:testData
[0:testSize
]})print('p2=',p2
.shape
)p3
= sess
.run
(f3
,feed_dict
={trainDataInput
:trainData
,testDataInput
:testData
[0:testSize
]})print('p3=',p3
.shape
)print('p3[0,0]=',p3
[0,0]) p4
= 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
]})print('p5=',p5
.shape
)print('p6=',p6
.shape
)print('p5[0,0]',p5
[0])print('p6[0,0]',p6
[0])p7
= sess
.run
(f7
,feed_dict
={trainDataInput
:trainData
,testDataInput
:testData
[0:testSize
],trainLabelInput
:trainLabel
})print('p7=',p7
.shape
)print('p7[]',p7
)p8
= sess
.run
(f8
,feed_dict
={trainDataInput
:trainData
,testDataInput
:testData
[0:testSize
],trainLabelInput
:trainLabel
})print('p8=',p8
.shape
)print('p8[]=',p8
)p9
= sess
.run
(f9
,feed_dict
={trainDataInput
:trainData
,testDataInput
:testData
[0:testSize
],trainLabelInput
:trainLabel
})print('p9=',p9
.shape
)print('p9[]=',p9
)p10
= np
.argmax
(testLabel
[0:testSize
],axis
=1)print('p10[]=',p10
)j
= 0
for i
in range(0,5):if p10
[i
] == p9
[i
]:j
= j
+1
print('ac=',j
*100/testSize
)
總結
以上是生活随笔為你收集整理的08-KNN手写数字识别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。