-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的链接似乎是一个很好的链接。

相关问题