我在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