【问题标题】:How to get the number of the neurons in the fully-connected layer?如何获得全连接层的神经元个数?
【发布时间】:2017-06-15 17:22:42
【问题描述】:

我看到一个关于带有tensorflow的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

非常感谢。

【问题讨论】:

  • 你输入的大小是多少?
  • 输入为80*100的图片,4个输入通道。
  • 好的,请阅读here。在您决定继续使用它们之前,最好先了解一下 CNN 的背景。

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


【解决方案1】:

全连接层中的神经元数量与前一层中的单元数量没有任何关系。您甚至可以在具有 10000 个神经元的层之后放置一个具有 1 个神经元的全连接。

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

类似问题here

【讨论】:

    【解决方案2】:

    你在那个层的神经元个数实际上是784,这完全是你的选择,你可以设置为1或10000,它只会改变下一层的权重形状。

    (3456, 784) 是与层关联的权重矩阵 的形状,它是从大小为3456 的向量输入中获得大小为784 的输出向量所需的矩阵形状(这是你上一层的大小conv3_flat)。

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

    我还建议您在尝试使用 CNN 之前确保您了解它们的理论,@Coldspeed 的链接似乎是一个不错的链接。

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 2015-07-04
      • 2017-05-21
      • 2019-05-05
      • 2016-09-02
      • 2018-09-23
      相关资源
      最近更新 更多