【发布时间】: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