[英]Input shape and Conv1d in 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%输入的例子?
它不是“忽略”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
参数。 在您的示例中,卷积所做的是采用每个可能的25个连续10矢量切片,并为每个矢量生成一个40矢量(当然,对于批处理中的每个示例)。 因此,您将输入中的10个要素或通道转换为卷积后的40个要素或通道。 并不是它只使用最后一个维度中的10个元素中的一个,而是使用它们来生成输出。
如果输入中维度的含义不是卷积解释的含义,或者它正在执行的操作不是您期望的操作,则可能需要重新整形输入或使用不同类型的图层。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.