我的神经网络的第一层是这样的:
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%输入的例子吗?
答案 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个元素中的一个,而是使用它们来生成输出。
如果输入中维度的含义不是卷积解释的含义,或者它正在执行的操作不是您期望的操作,则可能需要重新整形输入或使用不同类型的图层。