keras中一维卷积网络的输入维度

Posted

技术标签:

【中文标题】keras中一维卷积网络的输入维度【英文标题】:input dimensions to a one dimensional convolutional network in keras 【发布时间】:2016-12-04 00:54:54 【问题描述】:

真的很难理解 keras 中卷积 1d layer 的输入尺寸:

输入形状

具有形状的 3D 张量:(samples, steps, input_dim)。

输出形状

具有形状的 3D 张量:(samples, new_steps, nb_filter)。由于填充,steps 值可能已更改。

我希望我的网络接收价格的时间序列(按顺序排列为 101)并输出 4 个概率。我当前的非卷积网络做得相当好(训练集为 28000)如下所示:

standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))

为了改善这一点,我想从输入层制作一个特征图,该图具有长度为 10 的局部感受野。(因此有 10 个共享权重和 1 个共享偏差)。然后我想使用最大池化并将其输入到大约 40 个神经元的隐藏层,然后在外层使用 4 个带有 softmax 的神经元输出。

picture (it's quite awful sorry!)

因此,理想情况下,卷积层将采用二维张量:

(minibatch_size, 101)

并输出一个 3d 维度张量

(minibatch_size, 91, no_of_featuremaps)

但是,keras 层似乎需要输入中的一个维度,称为 step。我已经尝试理解这一点,但仍然不太明白。就我而言,步长是否应该为 1,因为向量中的每一步都将时间增加 1?另外,什么是new_step?

此外,如何将池化层的输出(3d 张量)以 2d 张量的形式转换为适合标准隐藏层(即 Dense keras 层)的输入?

更新:在给出非常有用的建议后,我尝试制作一个卷积网络,如下所示:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))

conv.Add(Flatten()) 行抛出范围超出有效边界错误。有趣的是,仅此代码不会抛出此错误:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())

在做

print conv.input_shape
print conv.output_shape

结果

(None, 1, 101
(None, -256)

被退回

更新 2:

改变了

conv.add(Convolution1D(64, 10, input_shape=(1,101)))

conv.add(Convolution1D(10, 10, input_shape=(101,1))

它开始工作了。但是,两者之间有什么重要的区别吗? 将 (None, 101, 1) 输入到一维卷积层或 (None, 1, 101) 我应该注意的?为什么 (None, 1, 101) 不起作用?

【问题讨论】:

【参考方案1】:

之所以看起来像这样,是因为 Keras 的设计者打算将一维卷积框架解释为处理序列的框架。要完全理解差异 - 尝试想象您有一个由多个特征向量组成的序列。那么您的输出将至少是二维的 - 其中第一个维度与时间相关,而其他维度与特征相关。一维卷积框架被设计成在某种程度上加粗了这个时间维度,并试图找到数据中重复出现的模式——而不是执行经典的多维卷积变换。

在您的情况下,您必须简单地将数据重塑为具有形状 (dataset_size, 101, 1) - 因为您只有一个功能。使用numpy.reshape 函数可以轻松完成。要了解新步骤的含义 - 您必须了解您正在随着时间的推移进行卷积 - 因此您会更改数据的时间结构 - 这会导致新的时间连接结构。为了将您的数据转换为适合密集/静态层的格式,请使用keras.layers.flatten 层 - 与经典卷积情况相同。

更新:正如我之前提到的 - 输入的第一个维度与时间有关。所以(1, 101)(101, 1) 之间的区别在于,在第一种情况下,您有一个具有 101 个特征的时间步长,而在第二种情况下 - 具有 1 个特征的 101 个时间步长。您在第一次更改后提到的问题源于对此类输入进行大小为 2 的池化。只有一个时间步 - 您不能在大小为 2 的时间窗口上汇集任何值 - 仅仅是因为没有足够的时间步来执行此操作。

【讨论】:

啊好吧,我明白了。因此,如果我的数据不仅是价格与时间的关系,而且是价格、降雨量和每次市场交易量,我会给第一层一些维度(sample_size, 101, 3)? 我刚才也试过做类似的事情,flatten层抛出了一个奇怪的错误(某种溢出?)

以上是关于keras中一维卷积网络的输入维度的主要内容,如果未能解决你的问题,请参考以下文章

卷积神经网络(CNN)之一维卷积二维卷积三维卷积详解

神经网络中的卷积

keras中卷积的两种padding方式

在 Keras 的卷积层上使用 Dropout

如何在 Keras 中建模卷积循环网络 (CRNN)

神经网络的输出维度为2,怎么取