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



真的很难理解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的时间窗口上汇集任何值——仅仅是因为没有足够的时间步长来实现这一点。

相关内容

  • 没有找到相关文章

最新更新