-1

我看到一個關於帶張量流的CNN的示例代碼,但我不明白爲什麼完全連接的層是(3456,784),你能告訴如何從卷積層獲取這些數字。輸入是一個80 * 100的圖像和4個輸入通道。如何獲得完全連接層中神經元的數量?

這是代碼。

def convolutional_neural_network(input_image): 
    weights = {'w_conv1':tf.Variable(tf.zeros([8, 8, 4, 32])), 
       'w_conv2':tf.Variable(tf.zeros([4, 4, 32, 64])), 
       'w_conv3':tf.Variable(tf.zeros([3, 3, 64, 64])), 
       'w_fc4':tf.Variable(tf.zeros([3456, 784])), 
       'w_out':tf.Variable(tf.zeros([784, output]))} 

    biases = {'b_conv1':tf.Variable(tf.zeros([32])), 
       'b_conv2':tf.Variable(tf.zeros([64])), 
       'b_conv3':tf.Variable(tf.zeros([64])), 
       'b_fc4':tf.Variable(tf.zeros([784])), 
       'b_out':tf.Variable(tf.zeros([output]))} 

    conv1 = tf.nn.relu(tf.nn.conv2d(input_image, weights['w_conv1'], strides = [1, 4, 4, 1], padding = "VALID") + biases['b_conv1']) 
    conv2 = tf.nn.relu(tf.nn.conv2d(conv1, weights['w_conv2'], strides = [1, 2, 2, 1], padding = "VALID") + biases['b_conv2']) 
    conv3 = tf.nn.relu(tf.nn.conv2d(conv2, weights['w_conv3'], strides = [1, 1, 1, 1], padding = "VALID") + biases['b_conv3']) 
    conv3_flat = tf.reshape(conv3, [-1, 3456]) 
    fc4 = tf.nn.relu(tf.matmul(conv3_flat, weights['w_fc4']) + biases['b_fc4']) 

    output_layer = tf.matmul(fc4, weights['w_out']) + biases['b_out'] 
    return output_layer 

非常感謝。

+0

你輸入的大小是多少? –

+0

輸入是一個80 * 100的圖像和4個輸入通道。 – Entel

+1

好的,請閱讀[這裏](http://cs231n.github.io/convolutional-networks/)。在你決定繼續使用它們之前,建議在CNN上有一些背景知識。 –

回答

0

完全連接圖層中的神經元數量爲,與前一圖層中的單元數量沒有任何相關性。你甚至可以把1個神經元連接到10000個神經元的層後。

術語「完全連接」是指從上一層到當前層連接神經元。所以那裏沒有維度要求。

類似的問題here

0

神經元在該層的數量實際上是784,這完全是你的選擇,在這一點上,你可以將其設置爲1或10000,只不過是改變了下一層的權重形狀。

(3456, 784)是關聯於該層的權重矩陣,這是爲了從尺寸3456(的向量輸入其是以前的層conv3_flat的大小獲得大小784的輸出向量所需的矩陣形狀的形狀)。

3456conv3_flat的大小,它是conv3中的神經元數量,它是該層的width*height*depth。你可以通過考慮你輸入圖像的大小(作爲元組),在每個卷積或者合併圖層上將它按照元素進行劃分(作爲一個元組,並且用padding = valid,它應該是積分除法),然後相乘結果的寬度,高度和最後一個卷積層(這裏爲64)的深度(即通道數量)。

我也建議你在嘗試使用它們之前,確保你理解了CNN的理論,@ Coldspeed的鏈接似乎是一個很好的鏈接。

相關問題