真的很难理解keras:中卷积1d层的输入维度
输入形状
具有形状的三维张量:(样本、步长、input_dim)。
输出形状
具有形状的3D张量:(samples,new_steps,nb_filter)。步长值可能由于填充而更改。
我希望我的网络接收价格的时间序列(按顺序为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。
图片(非常抱歉!)
因此,理想情况下,卷积层将采用二维维度张量:
(minibatch_size,101)
并输出维度的三维张量
(minibatch_size,91,no_of_featuremaps)
然而,keras层似乎需要一个名为step的输入中的维度。我试着理解这个,但仍然没有完全理解。在我的情况下,步长应该是1吗,因为向量中的每一步都是时间的增加1?另外,什么是new_step?
此外,如何将池化层(三维张量)的输出转换为适用于二维张量形式的标准隐藏层(即密集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)输入到1d conv层,或者输入我应该知道的(None,1101)?为什么(无,1101)不起作用?
它看起来像这样的原因是Keras设计器打算将一维卷积框架解释为处理序列的框架。为了完全理解差异,试着想象你有一个多个特征向量的序列。然后你的输出将至少是二维的——第一个维度与时间相连,其他维度与特征相连。一维卷积框架的设计是为了在某种程度上突出这个时间维度,并试图在数据中找到重复出现的模式,而不是执行经典的多维卷积变换。
在您的情况下,您必须简单地将数据整形为shape(dataset_size,101,1),因为您只有一个特性。使用CCD_ 1函数可以很好地完成。为了理解新的步骤意味着什么——你必须理解你正在随着时间的推移进行卷积——所以你改变了数据的时间结构——这导致了新的时间连接结构。为了将数据转换为适合密集/静态层的格式,请使用keras.layers.flatten
层,与经典卷积情况相同。
更新:正如我之前提到的,输入的第一个维度与时间有关。因此,(1, 101)
和(101, 1)
之间的区别在于,在第一种情况下,您有一个具有101个特征的时间步长,而在第二种情况下-101个具有1个特征的时步长。您在第一次更改后提到的问题源于对此类输入进行大小为2的池化。只有一个时间步长——不能在大小为2的时间窗口上汇集任何值——仅仅是因为没有足够的时间步长来实现这一点。