【问题标题】:confused about the output of convolutional layer in CNN对 CNN 中卷积层的输出感到困惑
【发布时间】:2017-09-27 23:06:24
【问题描述】:

我正在实现卷积神经网络,但是我对tensorflow中卷积层的输出大小感到困惑,所以我看到了这个规则来计算卷积的输出,即(Size - Filter + 2P)/ Stride +1,所以如果我们有一个 sie 256 x 256 灰度的图像,即通道 = 1,过滤器大小为 11,零填充 = 0,步幅 = 2。然后根据该规则,通过替换。输出将是 (256 - 11)/2 + 1 = 123.5 即 = 123 x 123 。但实际上通过在 tensorflow 中实现相同的值,在打印出结果时,我已经看到,输出是 128 x 128 !这是怎么回事?

更新

IMAGE_H = 256
IMAGE_W = 256
batch_size = 10
num_hidden = 64
num_channels = 1
depth = 32

input = tf.placeholder(
     tf.float32, shape=(batch_size, IMAGE_H, IMAGE_W, num_channels))

w1 = tf.Variable(tf.random_normal([11, 11, num_channels,depth],stddev=0.1))
w2 = tf.Variable(tf.random_normal([7, 7, depth, depth], stddev=0.1))

b1 = tf.Variable(tf.zeros([depth]))
b2 = tf.Variable(tf.constant(1.0, shape=[depth]))

....
# model

conv1 = tf.nn.conv2d(input, w1 , [1, 2, 2, 1], padding='SAME')
print('conv1', conv1)
hidden_1 = tf.nn.relu(conv1 + b1)  

【问题讨论】:

  • 数学是对的,输出不应该是 128² 而是 123²。错误在您的代码中:显示它
  • @nessuno 请查看更新

标签: python tensorflow conv-neural-network


【解决方案1】:

在行中使用填充 VALID:

conv1 = tf.nn.conv2d(input, w1 , [1, 2, 2, 1], padding='VALID')

填充“SAME”表示保持相同的输入大小,填充“VALID”表示计算公式( Size - Filter + 2P)/ Stride +1并给出有效数字输出。

【讨论】:

  • 但是 padding = 'SAME' 的输出是 128x128 吗?那么根据步幅输入大小的一半?
  • 具有相同的填充将在输出中具有相同的大小,并且网格周围的零。实际上,它将 128x128 转换为 123x123,再加上 5 行和零列,因此它将是 128x128 agian。测试“有效”填充,并在此处发布您的结果,我有兴趣查看结果
  • 我将尝试使用 'VALID' 填充并将其发布在这里没问题,但正如你之前所说的使用 SAME 填充,输出将与输入大小相同,那么为什么我得到输出大小 128 x 128 对于尺寸为 256 x 256 的输入图像?
  • 我用 VALID 试了一下,你说的答案是 123x123
  • 好,输入 256x256 输出 128x128 ???也许你还有池化层,它将你的输入除以 2,
最近更新 更多