Nic*_*ick 22 python neural-network theano conv-neural-network keras
真的很难理解keras中卷积1d 层的输入维度:
输入形状
具有形状的3D张量:(样本,步骤,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'))
Run Code Online (Sandbox Code Playgroud)
为了改善这一点,我想从输入层创建一个特征映射,该映射具有长度为10的本地接收字段(因此具有10个共享权重和1个共享偏差).然后,我想使用最大池并将其馈入40个左右神经元的隐藏层,然后在外层输出4个带有softmax的神经元.
理想情况下,卷积层将采用2d张量维度:
(minibatch_size,101)
并输出3d张量的尺寸
(minibatch_size,91,no_of_featuremaps)
但是,keras层似乎需要输入中称为step的维度.我已经尝试了解这一点,但仍然没有完全理解.在我的情况下,步骤为1,因为向量中的每个步骤都是1的时间增加?另外,new_step是什么?
另外,如何将汇集层的输出(3d张量)转换为适合标准隐藏层(即密集keras层)的输入,形式为2d张量?
更新:在给出非常有用的建议之后,我尝试制作一个卷积网络,如下所示:
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'))
Run Code Online (Sandbox Code Playgroud)
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())
Run Code Online (Sandbox Code Playgroud)
干
print conv.input_shape
print conv.output_shape
Run Code Online (Sandbox Code Playgroud)
结果是
(None, 1, 101
(None, -256)
Run Code Online (Sandbox Code Playgroud)
被退回
更新2:
变
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
Run Code Online (Sandbox Code Playgroud)
至
conv.add(Convolution1D(10, 10, input_shape=(101,1))
Run Code Online (Sandbox Code Playgroud)
它开始工作了.但是,输入(无,101,1)到1d转换层或(无,1,101)之间是否有任何重要的区别?为什么(无,1,101)不起作用?
Mar*_*jko 16
它看起来像这样的原因是Keras设计者打算将1维卷积框架解释为处理序列的框架.要完全理解差异 - 试着想象你有一系列多个特征向量.然后,您的输出将至少为二维 - 其中第一维与时间相关,其他维与特征相关联.一维卷积框架在某种程度上设计为大胆的时间维度,并尝试在数据中找到重新定位模式 - 而不是执行经典的多维卷积变换.
在您的情况下,您必须简单地重塑您的数据以具有形状(dataset_size,101,1) - 因为您只有一个功能.可以使用numpy.reshape函数轻松完成.要理解新步骤意味着什么 - 您必须了解您正在进行卷积 - 因此您需要更改数据的时间结构 - 这会导致新的时间连接结构.为了使您的数据采用适合密集/静态层的格式,请使用keras.layers.flatten图层 - 与传统的卷积格式相同.
更新:正如我之前提到的 - 输入的第一个维度与时间有关.因此,(1, 101)和之间的区别(101, 1)在于,在第一种情况下,您有一个时间步骤具有101个功能,在第二个情况下 - 101个时间步长具有1个功能.您在第一次更改后提到的问题源于在此类输入上使用大小2进行池化.只有一个时间步长 - 你不能在大小为2的时间窗口上汇集任何值 - 只是因为没有足够的时间步长来做到这一点.