在Keras中输入形状和Conv1d

时间:2017-08-03 10:56:11

标签: python keras

我的神经网络的第一层是这样的:

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 个答案:

答案 0 :(得分:13)

它不是“忽略”90%的输入,问题很简单,如果你在大小的输入上使用大小 K 的内核执行一维卷积X 卷积的结果将具有 X - K + 1的大小。如果您希望输出具有与输入相同的大小,那么您需要扩展或“填充”您的数据。有几种策略,例如添加零,在末尾复制值或环绕。 Keras'Convolution1D有一个padding参数,您可以将其设置为"valid"(默认值,无填充),"same"(在输入的两侧添加零以获取与输入相同的输出大小)和"causal"(仅在一端用零填充,从WaveNet获取的想法)。

更新

关于评论中的问题。所以你说你的输入是(600, 10)。我认为,这是一个示例的大小,并且您有一批大小为(N, 600, 10)的示例。从卷积运算的角度来看,这意味着你有N个例子,每个例子的长度最多为600(这个“长度”可能是时间或其他任何东西,它只是维度卷积的工作方式),并且在每个600点,你有大小为10的向量。这些矢量中的每一个都被认为是具有10特征的原子样本(例如价格,高度,大小等等),或者在卷积的上下文中有时被称为“通道”(来自2D中使用的RGB通道)图像卷积)。

重点是,卷积具有内核大小和多个输出通道,这是Keras中的filters参数。在您的示例中,卷积所做的是采用每个可能的25个连续10矢量切片,并为每个矢量生成一个40矢量(当然,对于批处理中的每个示例)。因此,您将输入中的10个要素或通道转换为卷积后的40个要素或通道。并不是说它只使用了最后一个维度中的10个元素中的一个,而是使用它们来生成输出。

如果输入中维度的含义不是卷积解释的含义,或者它正在执行的操作不是您期望的操作,则可能需要重新整形输入或使用不同类型的图层。