【发布时间】: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) 不起作用?
【问题讨论】:
标签: python neural-network theano conv-neural-network keras