有關于CNN的細節請參考CNN相關概念,這裡不在贅述。下面的說明中将直接使用英文術語(不同人對中文術語叫什麼也許有歧義)
也許有不少人像我一樣,對在深入MNIST中卷及神經網絡部分中的常數有很多不解。下面讓我說明一下各種奇妙的常數的來曆。
同時推薦大家,如果對函數有疑惑的話,看看官網對于api的說明Tensorflow API documentation
從頭梳理吧。
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides = [, , , ], padding = 'SAME')
其中,strides的第0個元素和第3個元素必須固定為1,第1個和第2個元素指的是horizontal stride和vertical stride都為1。
對于padding參數的作用,本着不做重複勞動的原則0.0,請大家參考這篇文章padding參數作用
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize = [, , , ],
strides = [, , , ], padding = 'SAME')
其中,ksize第0,1,2,3個元素指的是在第0,1,2,3次元的kernel size,可以了解為輸出神經元的receptive field是2x2的。strides第0,1,2,3個元素指的是在第0,1,2,3次元的stride。
這個函數的功能是将整個圖檔分割成2x2的塊,對每個塊提取出最大值輸出。可以了解為對整個圖檔做寬度減小一半,高度減小一半的降采樣。
W_conv1 = weight_variable([, , , ])
其中前兩個5是指:第一個卷積層的輸出神經元對應的receptive field是高度為5,寬度為5的。後面的1是指輸入的channel為1。之後的32是指輸出的channel為32。
可以了解為對輸入做32次卷積,每次卷積中不同的神經元享有同樣參數;但是不同次卷積所用的參數是不同的。
b_conv1 = bias_variable([])
中32是指分别對應32次卷積的bias
x_image = tf.reshape(x, [-, , , ])
就是輸入的784維向量重新處理成[28,28]的矩陣,因為圖檔隻有灰階資訊,于是最後一維的channel數為1
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
這段代碼進行了卷積,然後用relu函數作為激勵函數,然後做2x2卷積。此時,h_conv1的大小是[None, 28, 28, 32],h_pool1的大小是[None, 14, 14, 32]。
(如果不了解這裡,請大家回頭看一下我在前面有關于conv2d和max_pool_2x2的解釋= ̄ω ̄=)
W_conv2 = weight_variable([, , , ])
是對[None, 14, 14, 32]的h_pool1所用的權重。
b_conv2 = bias_variable([])
就是在對h_pool1做卷積所用的偏置。
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
經過這一串代碼之後,h_conv2的大小為[None, 14, 14, 64],h_pool2的大小為[None, 7, 7, 64]。
随後的一個全連接配接層和一個softmax層就不做解釋了。是應該在前面的那個用softmax做估計的那個例子中應該弄明白的。