卷积层的输出形状

3

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

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

根据CS231讲座,卷积操作为每个滤波器创建一个特征图(即激活图),然后将它们堆叠在一起。在我的情况下,卷积层具有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文档中,看起来是这样)。 - Daniel Möller
2个回答

2
  • 您的重量维度必须为[filter_height,filter_width,in_channel,out_channe]
  • 根据您的示例,我认为输入通道(即输入深度)为300,您希望输出通道为111。
  • 过滤器的总数为111,而不是300 * 111。
  • 正如您自己所说,每个过滤器都有一个偏置,因此111个过滤器需要111个偏置。
  • 111个过滤器中的每个都将在输入上产生卷积。
  • 在您的情况下,Weight形状意味着您正在使用5 * 1的内核补丁。
  • 第三个维度表示输入特征图的深度为300。
  • 第四个维度表示输出特征图的深度为111。

0

实际上这很有道理。您学习过滤器的权重。每个滤波器依次产生一个输出(也称为激活映射,与您的输入数据相关)。

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

我假设第0个维度的滤波器#0的特征映射类似于your_weights [:,:,0,0]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接