我的神经网络的第一层是这样的:
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%的输入吗?
这并不是“忽略”90%的输入,问题很简单,如果对大小为X的输入执行大小为K的核的一维卷积,卷积的结果将具有大小为X-K+1的结果。如果希望输出与输入具有相同的大小,则需要扩展或“填充”数据。有几种策略可以实现这一点,例如加零、在结尾复制值或环绕。Keras'^{} 有一个
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个元素中的一个,而是使用了所有元素来生成输出。如果输入中维度的含义不是卷积所解释的,或者它执行的操作不是您所期望的,则可能需要重塑输入或使用其他类型的层。
相关问题 更多 >
编程相关推荐