Keras中的输入形状和Conv1d

9

我的神经网络的第一层如下:

model.add(Conv1D(filters=40,
                 kernel_size=25,
                 input_shape=x_train.shape[1:],
                 activation='relu',
                 kernel_regularizer=regularizers.l2(5e-6),
                 strides=1))

如果我的输入形状是(600,10)
则输出形状为(None, 576, 40)
如果我的输入形状是(6000,1)
则输出形状为(None, 5976, 40)
那么我的问题是,这里到底发生了什么?第一个例子只是忽略了输入的90%吗?
1个回答

14
这并不是忽略了输入的90%,问题在于如果你对大小为X的输入执行具有大小为K的卷积核的一维卷积,则卷积的结果将具有大小X - K + 1。如果要使输出与输入大小相同,则需要扩展或“填充”数据。有几种策略可以实现这一点,例如添加零、复制末尾的值或包装。Keras的Convolution1D具有一个padding参数,您可以将其设置为"valid"(默认值,无填充)、"same"(在输入的两侧添加零以获得与输入大小相同的输出)和"causal"(仅在一端用零进行填充,这个点子来自WaveNet)。
更新:关于您在评论中提出的问题。因此,您的输入大小为(600, 10)。我假设这是一个示例的大小,并且您有一个示例批次,大小为(N, 600, 10)。从卷积运算的角度来看,这意味着您有N个示例,每个示例的长度最多为600(此“长度”可能是时间或其他任何东西,它只是卷积工作的维度),并且在这600个点中,您具有大小为10的向量。每个向量都被认为是具有10特征的原子样本(例如,价格、高度、大小等),或者在卷积的上下文中有时称为“通道”(来自2D图像卷积中使用的RGB通道)。

重点是,卷积操作有一个核大小和输出通道数,这在Keras中用filters参数表示。在你的示例中,卷积操作对于每个长度为10的连续25向量片段产生一个40维向量(当然,对于批处理中的每个样本都是如此)。因此,经过卷积操作后,输入从原先的10个特征或通道变成了40个。它并不是仅使用最后一个维度中的一个元素,而是使用所有元素来生成输出。

如果输入的维度意义与卷积操作解释的不同,或者其执行的操作与您所期望的不同,您可能需要重新调整输入或使用不同类型的层。


这并不是我要问的。假设我用0填充,那么我的输出形状将分别为(None, 600, 40)(None, 6000, 40)。我想知道的是其他9个数组在(600,10)中会发生什么,换句话说,输出形状是否应该像(None, 576, 40, 10)而不仅仅是(None, 576, 40) - drulludanni
@drulludanni 我已经更新了答案并加入了更多的解释。 - jdehesa
因此,每个样本中有10个长度为600的序列。每个序列代表一个特征。因此,我们在每个样本中有例如600个连续的温度值、600个连续的湿度值等。Conv1D层分别查找每个序列中的模式。我理解得对吗? - Andrzej Gis
大多数情况下是这样的。每个输入样本都是一个包含600个温度值、湿度值等序列。然而,卷积层通常不会单独处理每个特征(“通道”),而是会学习跨所有特征的模式(例如,您可以从10个“通道”转换为5个“通道”,每个通道都是从原始10个通道的组合信息计算出来的)。如果您想单独处理每个通道,可以拆分数据或进行“可分离卷积”(例如,在TensorFlow中使用tf.nn.separable_conv2d)。 - jdehesa

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