2016-07-29 138 views
12

一个维卷积网络确实发现很难理解输入尺寸到卷积1D layer在keras:输入尺寸在keras

输入形状

三维张量与形状:(样本,步骤, input_dim)。

输出形状

三维张量与形状:(样本,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个左右神经元的隐藏层中,然后在外层输出带有softmax的4个神经元。

picture (it's quite awful sorry!)

所以理想情况下,卷积层将采取尺寸的二维张量:

(minibatch_size,101)

和输出一个三维尺寸

的张量(minibatch_size, 91,no_of_featuremaps)

但是,keras层似乎需要输入调用中的维度ed步骤。我试过了解这一点,但仍然不太明白。在我的情况下,步骤应该是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(拼合())抛出一个范围超过有效边界错误。有趣的是,这个错误是抛出恰好这个代码:

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,1,101),我应该知道的有什么重要的不同?为什么(无,1,101)不起作用?

回答

11

它看起来像这样的原因是Keras设计者打算将1维卷积框架解释为处理序列的框架。为了充分理解这种差异 - 尝试想象你有一个多个特征向量的序列。那么你的输出将至少是二维的 - 第一个维度与时间连接,其他维度与特征连接。一维卷积框架被设计为以某种方式加粗这个时间维度,并试图找到数据中的重复模式 - 而不是执行经典的多维卷积变换。

在你的情况下,你必须简单地重塑你的数据来形状(dataset_size,101,1) - 因为你只有一个特征。使用numpy.reshape函数可以轻松完成。要理解新的步骤意味着什么 - 你必须了解你正在进行卷积 - 所以你改变了数据的时间结构 - 这导致了新的时间连接结构。为了将数据转换为适合密集/静态图层的格式,请使用keras.layers.flatten图层 - 与经典卷积情况相同。

更新:正如我前面提到的 - 输入的第一维与时间有关。所以(1, 101)(101, 1)之间的区别在于,在第一种情况下,您有一个时间步与101个功能,第二个101时间步与1个功能。你在第一次改变之后提到的问题,起源于在这样的输入上创建大小为2的池。只有一个时间步 - 你无法在大小为2的时间窗上汇集任何值 - 仅仅因为没有足够的时间步数来做到这一点。

+0

啊好的我有点看。因此,如果我的数据不仅仅是价格与时间的关系,而且还包括价格,降雨量和每次市场的交易量,我会给第一层提供一些维度(sample_size,101,3)? – Nick

+0

我也尝试过类似这样的事情,而flatten图层会抛出一个奇怪的错误(某种溢出?) – Nick

+0

conv = Sequential() conv.add(Convolution1D(64,10,input_shape =(1,101) )) conv.add(激活( 'RELU')) conv.add(MaxPooling1D(2)) conv.add(拼合()) conv.add(密集(10)) conv.add(激活( 'tanh')) conv.add(Dense(4)) conv.add(Activation('softmax')) – Nick