我的神经网络的第一层是这样的:
model.add(Conv1D(filters=40,
kernel_size=25,
input_shape=x_train.shape[1:],
activation='relu',
kernel_regularizer=regularizers.l2(5e-6),
strides=1))
Run Code Online (Sandbox Code Playgroud)
如果我的输入形状是 (600,10)
我得到(None, 576, 40) 输出形状
如果我的输入形状是 (6000,1)
我得到(None, 5976, 40)输出形状
所以我的问题是这里到底发生了什么?是第一个简单地忽略90%输入的例子?
jde*_*esa 13
它不是"忽略"90%的输入,问题很简单,如果你在大小为X的输入上使用大小为K的内核执行一维卷积,卷积的结果将具有X - K +的大小1.如果希望输出具有与输入相同的大小,则需要扩展或"填充"数据.有几种策略,例如添加零,在末尾复制值或环绕.Keras' 有一个你可以设置的参数(默认,没有填充),(在输入的两边添加零以获得与输入相同的输出大小)和(仅在一端用零填充,想法取自WaveNet).Convolution1Dpadding"valid""same""causal"
更新
关于您评论中的问题.所以你说你的输入是(600, 10).我认为,这是一个例子的大小,你有一批大小的例子(N, 600, 10).从卷积运算的角度来看,这意味着你有N一些例子,每个都有一个最多的长度600(这个"长度"可能是时间或其他任何东西,它只是卷积工作的维度),并且每个这些600点,你有大小的向量10.这些矢量中的每一个被认为是具有10特征(例如价格,高度,大小等)的原子样本,或者有时在卷积的上下文中称为"通道"(来自2D图像卷积中使用的RGB通道).
关键是,卷积具有内核大小和多个输出通道,这是filtersKeras中的参数.在您的示例中,卷积所做的是采用每个可能的25个连续10矢量切片,并为每个矢量生成一个40矢量(当然,对于批处理中的每个示例).因此,您将输入中的10个要素或通道转换为卷积后的40个要素或通道.并不是它只使用最后一个维度中的10个元素中的一个,而是使用它们来生成输出.
如果输入中维度的含义不是卷积解释的含义,或者它正在执行的操作不是您期望的操作,则可能需要重新整形输入或使用不同类型的图层.
| 归档时间: |
|
| 查看次数: |
10551 次 |
| 最近记录: |