如何获得完全连接层中的神经元数量?

时间:2017-06-15 04:53:59

标签: python machine-learning tensorflow neural-network deep-learning

我看到了一个关于具有张量流的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

非常感谢。

2 个答案:

答案 0 :(得分:2)

完全连接层中的神经元数量与前一层中的单元数无关。。您甚至可以在具有10000个神经元的图层之后将1个神经元完全连接起来。

术语“完全连接”意味着您将从前一层的每个神经元连接到当前层。所以那里没有维度要求。

类似问题here

答案 1 :(得分:0)

该图层中神经元的数量实际上是784,完全是您的选择,您可以将其设置为1或10000,它只会更改下一个图层的权重形状。

(3456, 784)是与图层关联的权重矩阵的形状,它是从矢量输入获取大小为784的输出向量所需的矩阵形状大小3456(前一层conv3_flat的大小)。

3456conv3_flat的大小,是conv3中的神经元数量,即此图层的width*height*depth。您可以通过考虑输入图像大小(作为元组)来获得它,在每个卷积或池化层将元素方式除以步幅(作为元组;并使用padding = valid,它应该是积分除法),然后乘以最后一个卷积层的结果宽度,高度和深度(即通道数)(此处为64)。

我还建议你在尝试使用它们之前确保理解理论上的CNN,@ Coldspeed的链接似乎很好。