2016-07-29 92 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