如何计算完全连接层的神经元数量?

2024-09-24 20:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到了一个关于CNN和tensorflow的示例代码,但是我不明白为什么完全连接层是(3456784),你能告诉我如何从卷积层得到这些数字吗。输入是一个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

非常感谢。在


Tags: outputtfzerosnnoutvariablereluweights
2条回答

在一个完全连接的层中,神经元的数量与前一层的单元数没有任何关系。你甚至可以在一个有10000个神经元的层之后,再加上一个完全连接的神经元。在

术语“完全连接”是指将前一层的每个神经元连接到当前层。所以这里没有维度要求。在

类似的问题here。在

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

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

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

我也建议你在使用CNNs之前一定要先了解它的理论,@Coldspeed的链接似乎是个不错的链接。在

相关问题 更多 >