【问题标题】:Output shape of a convolutional layer卷积层的输出形状
【发布时间】:2017-10-06 13:50:12
【问题描述】:

我在 Keras 中构建了一个卷积神经网络。

model.add(Convolution1D(nb_filter=111, filter_length=5, border_mode='valid', activation="relu", subsample_length=1))

根据CS231 lecture,卷积操作会为每个过滤器创建一个特征图(即激活图),然后将其堆叠在一起。在我的例子中,卷积层有一个 300 维的输入。因此,我期望以下计算:

  • 每个过滤器的窗口大小为 5。因此,每个过滤器产生 300-5+1=296 个卷积。
  • 由于有 111 个过滤器,因此卷积层的输出应该是 111*296。

但是,实际的输出形状看起来不同:

convolutional_layer = model.layers[1]
conv_weights, conv_biases = convolutional_layer.get_weights()

print(conv_weights.shape) # (5, 1, 300, 111)
print(conv_biases.shape)  # (,111)

偏差值的形状是有意义的,因为每个过滤器都有一个偏差值。但是,我不明白权重的形状。显然,第一个维度取决于过滤器的大小。第三个维度是输入神经元的数量,应该已经被卷积减少了。最后一个维度可能是指过滤器的数量。这没有意义,因为我应该如何轻松获取特定过滤器的特征图?

Keras 使用 Theano 或 Tensorflow 作为后端。根据他们的文档,卷积操作的输出是 4d 张量(batch_size、output_channel、output_rows、output_columns)。

有人可以根据 CS231 讲座解释一下输出形状吗?

【问题讨论】:

  • 嗯...实际的输出形状不是权重形状。您可以在创建模型并制作model.summary() 时看到输出形状。但是,也许您在“输入”中得到了反转维度:(通道 x 1d 长度)与(1d 长度 x 通道)。尝试使用“Reshape((1,300))”或“Reshape((300,1))”反转输入——这取决于您的 keras 是先配置通道还是最后配置通道。 (另外,我不知道subsample_length=1 是什么意思,它似乎不在keras 文档中)。

标签: keras theano conv-neural-network convolution keras-layer


【解决方案1】:
  • 您的体重维度必须是[filter_height, filter_width, in_channel, out_channe]
  • 在您的示例中,我认为作为输入深度的输入通道为 300,而您希望输出通道为 111
  • 过滤器总数为 111 而不是 300*111
  • 正如您自己所说,每个过滤器都有每个偏差,所以 111 个过滤器有 111 个偏差
  • 111 个过滤器中的每个过滤器都会在输入上产生一个卷积
  • 您的情况下的权重形状意味着您正在使用形状为 5*1 的内核补丁
  • 第三维表示输入特征图的深度为300
  • 第四维表示输出特征图的深度为111

【讨论】:

    【解决方案2】:

    其实这很有意义。您了解过滤器的权重。每个过滤器依次产生一个输出(也就是与您的输入数据相对应的激活图)。

    conv_weights.shape 的前两个轴是正在学习的过滤器的尺寸(正如您已经提到的)。您的filter_length 是 5 x 1。您的输入有 300 个维度,并且您希望获得 111 个过滤器每个维度,因此您最终得到 300 * 111 个大小为 5 * 1 权重的过滤器。

    我假设#0 维度的过滤器#0 的特征图类似于your_weights[:, :, 0, 0]

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      相关资源
      最近更新 更多