生活随笔
收集整理的這篇文章主要介紹了
09-CNN手写数字识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CNN卷積神經網絡的本質就是卷積運算
維度的調整:
tf.reshape(imageInput,[-1,28,28,1])
imageInput為[None,784],N行* 784維 調整為 M28行28列*1通道 即:二維轉化為四維數據
參數一:等價于運算結果M
參數二:28 28 表示圖片的寬高信息 1表示channel通道個數,因為當前讀取的是灰度圖故為1
定義變量:
tf.Variable(tf.truncated_normal([5,5,1,32],stddev = 0.1))
參數一:最終生成的維度,這里設置為5*5的卷積內核大小,輸入的維度;輸入的維度或當前通道數或imageInputReshape最后一位為1,輸出為32維
參數二:期望方差
layer1:激勵函數+卷積運算
imageInputReshape : w0:5,5,1,32
通過激勵函數,來完成當前的卷積運算
tf.nn.relu(tf.nn.conv2d(imageInputReshape,w0,strides=1,1,1,1],padding='SAME')+b0)
參數一:輸入圖像數據,imageInputReshape是一個M2828*1
參數二:權重矩陣 w0是一個5,5,1,32的維度
參數三:每次移動的步長,這里的步長是個四維的
參數四:SAME表示卷積核可以停留在圖像的邊緣
其實池化就等價于采樣
創建池化層,是得數據量大大減少;
tf.nn.max_pool(layer1,ksize=[1,4,4,1],strides=[1,4,4,1],padding='SAME')
參數一:layer1
參數二:ksize=[1,4,4,1] 表明輸入數據是一個M282832 這個數據與對應的ksize相除即M/1 28/4 28/4 32/1=M7732即為池化層的輸出結果
參數三:池化層的步長
參數四:池化層是否可以停留在圖像的邊緣
而max_pool即將[1 2 3 4]結果池化層后變為一維[4],即原來數組中最大的內容
import tensorflow
as tf
import numpy
as np
from tensorflow
.examples
.tutorials
.mnist
import input_data
mnist
= input_data
.read_data_sets
('E:\\Jupyter_workspace\\study\\DL\\MNIST_data',one_hot
= True)
imageInput
= tf
.placeholder
(tf
.float32
,[None,784])
labeInput
= tf
.placeholder
(tf
.float32
,[None,10])
imageInputReshape
= tf
.reshape
(imageInput
,[-1,28,28,1])
w0
= tf
.Variable
(tf
.truncated_normal
([5,5,1,32],stddev
= 0.1))
b0
= tf
.Variable
(tf
.constant
(0.1,shape
=[32]))
layer1
= tf
.nn
.relu
(tf
.nn
.conv2d
(imageInputReshape
,w0
,strides
=[1,1,1,1],padding
='SAME')+b0
)
layer1_pool
= tf
.nn
.max_pool
(layer1
,ksize
=[1,4,4,1],strides
=[1,4,4,1],padding
='SAME')
w1
= tf
.Variable
(tf
.truncated_normal
([7*7*32,1024],stddev
=0.1))
b1
= tf
.Variable
(tf
.constant
(0.1,shape
=[1024]))
h_reshape
= tf
.reshape
(layer1_pool
,[-1,7*7*32])
h1
= tf
.nn
.relu
(tf
.matmul
(h_reshape
,w1
)+b1
)
w2
= tf
.Variable
(tf
.truncated_normal
([1024,10],stddev
=0.1))
b2
= tf
.Variable
(tf
.constant
(0.1,shape
=[10]))
pred
= tf
.nn
.softmax
(tf
.matmul
(h1
,w2
)+b2
)
loss0
= labeInput
*tf
.log
(pred
)
loss1
= 0
for m
in range(0,500):for n
in range(0,10):loss1
= loss1
- loss0
[m
,n
]
loss
= loss1
/500
train
= tf
.train
.GradientDescentOptimizer
(0.01).minimize
(loss
)
with tf
.Session
() as sess
:sess
.run
(tf
.global_variables_initializer
())for i
in range(100):images
,labels
= mnist
.train
.next_batch
(500)sess
.run
(train
,feed_dict
={imageInput
:images
,labeInput
:labels
})pred_test
= sess
.run
(pred
,feed_dict
={imageInput
:mnist
.test
.images
,labeInput
:labels
})acc
= tf
.equal
(tf
.arg_max
(pred_test
,1),tf
.arg_max
(mnist
.test
.labels
,1))acc_float
= tf
.reduce_mean
(tf
.cast
(acc
,tf
.float32
))acc_result
= sess
.run
(acc_float
,feed_dict
={imageInput
:mnist
.test
.images
,labeInput
:mnist
.test
.labels
})print(acc_result
)
總結
以上是生活随笔為你收集整理的09-CNN手写数字识别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。