0

我有一個Conv2D圖層產生形狀張量(batch_size, 600, 105, 8)。這是一批feature_map爲8的歌譜圖。現在我想在每個時幀(600)上應用一個大小爲48的「密集」圖層,以生成形狀(batch_size, 600, 48)的張量。默認Keras Dense層似乎並沒有削減它...如何將時間分佈的密集層應用於形狀張量(batch_size,600,105,8)以生成輸出(batch_size,600,48)

有什麼建議嗎?

這是我的功能

def build_cnn(input_shape=(None, None, 1), 
      feature_map_size=8, 
      num_layers=5, 
      kernerl_size=(5, 5), 
      dropout=0.2, 
      pool_size=(2, 2), 
      epochs=100, 
      lr=0.001, 
      momentum=0.9, 
      verbose=False): 

    model = Sequential() 

    # Add the convolutional layers 
    for _ in range(num_layers):  
     # Conv layer 
     model.add(Conv2D(
      feature_map_size, 
      kernerl_size, 
      input_shape=input_shape, 
      padding='same', 
      activation='elu') 
     ) 
     # Dropout layer 
     # model.add(Dropout(dropout)) 

    # Dense layer 
    model.add(TimeDistributed(Dense(48, activation='elu'))) 
+0

如果時間trame是600,105是什麼? –

+0

@在對數壓縮的梅爾刻度幅度頻譜 –

回答

0

做它的最基本,最不敏感的方式,也正在改變數據:

#after the convolutions: 

model.add(Reshape((600,105*8))) 
model.add(Dense(48,...)) 

但是,這未必是最好的選擇。不幸的是,我不太瞭解這些譜圖,所以建議採用其他方法。但是這個基本上把所有的箱子和功能都放在密集層中,它們會混合在一起。


在殼體與-1重塑失敗

有與內部拉姆達層未知的形狀與後端功能處理的可能性。但這隻適用於tensorflow作爲後端。 Theano不喜歡這個想法。因爲這個,我放棄了theano。

#valid in tensorflow only 
import keras.backend as K 

def reshape(x): 
    shp = K.shape(x) 
    shp = K.concatenate([shp[:2],shp[2:3]*shp[3:]]) 
    return K.reshape(x,shp) 

model.add(Lambda(reshape)) 
+0

如果第一維(600)是可變的倉的數量DanielMöller,我可以說 #after盤旋: 'model.add(整形(( - 1105 * 8 )))?? –

+0

嗯,不知道,內部會有兩個'-1'值(一個用於批量維度,另一個用於輸入)。你可以試試,但如果它不起作用,我有可能會回答我的答案。 –

+0

更新了答案。 –

相關問題