首页 文章

在Keras中输入形状和Conv1d

提问于
浏览
4

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

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 回答

  • 11

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

    更新

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

    关键是,卷积具有内核大小和多个输出通道,这是Keras中的 filters 参数 . 在您的示例中,卷积所做的是采用每个可能的25个连续10向量的切片,并为每个向量生成单个40向量(当然,对于批处理中的每个示例) . 因此,您在输入中将10个要素或通道转换为卷积后的40个要素或通道 . 它's not that it'只使用最后一个维度中的10个元素中的一个,它使用所有这些元素来产生输出 .

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

相关问题