2017-07-14 82 views
0

一直試圖在Keras中建立神經網絡,但遇到了我的密集層和激活層之間存在形狀不匹配的問題。我錯過了明顯的東西嗎?使用Tensorflow後端。Keras:密集層和激活層之間的形狀不匹配

print(x_train.shape) 
print(y_train.shape) 
(1509, 476, 4) 
(1509,) 

然後我的模型如下:

###Setup Keras to create a bidirectional convolutional recurrent NN based on DanQ NN 
###See https://github.com/uci-cbcl/DanQ 
model = Sequential() 

model.add(Conv1D(filters=320, 
       kernel_size=26, 
       padding="valid", 
       activation="relu", 
       strides=1, 
       input_shape=(476, 4) 
       )) 

model.add(MaxPooling1D(pool_size=13, strides=13)) 

model.add(Dropout(0.2)) 

model.add(keras.layers.wrappers.Bidirectional(LSTM(320, return_sequences=True, input_shape=(None, 320)))) 

model.add(Flatten()) 

model.add(Dense(input_dim=34*640, units=925)) 
model.add(Activation('relu')) 

model.add(Dense(input_dim=925, units=919)) 
model.add(Activation('sigmoid')) 

print('compiling model') 
model.compile(loss='binary_crossentropy', optimizer='rmsprop', class_mode="binary") 

print('running at most 60 epochs') 

model.fit(x_train, y_train.T, batch_size=100, epochs=60, shuffle=True, verbose=2, validation_split=0.1) 

tresults = model.evaluate(x_test, y_test, verbose=2) 

print(tresults) 

print(model.output_shape) 

,但我得到了以下錯誤:

ValueError: Error when checking target: expected activation_48 to have shape (None, 919) but got array with shape (1509, 1) 

的錯誤似乎從輸入使用始發到第二激活層一個S形激活。例如:

model.add(Dense(input_dim=925, units=919)) 
model.add(Activation('sigmoid')) 

爲什麼會出現不匹配?

+0

您不必在密集圖層中指定input_dim和單位。恩。最後密集層應該是'model.add(Dense(1,activation ='sigmoid'))' – DJK

+0

謝謝!這似乎解決了不匹配問題,但彈出一個新的錯誤:'ValueError:無效的參數「class_mode」通過Tensorflow backend傳遞給K.function,源自'model.fit()'。對此有何想法? –

+0

是的,你不需要在'model.compile()'中有'class_mode ='binary''參數' – DJK

回答

1

正如@ djk47463的評論所述,您的輸出現在每個樣本有919個值,因爲這是網絡最後一層中的單位數。要糾正這種情況,請將您的最後一個圖層的單位設置爲1,或者添加輸出尺寸爲1的新最終圖層。

0

在你的代碼,

model.add(Conv1D(filters=320, 
      kernel_size=26, 
      padding="valid", 
      activation="relu", 
      strides=1, 
      input_shape=(476, 4) 
      )) 

嘗試在的input_shape = (476,4)地點新增input_dim = 4。 可能會工作。

+0

這是不正確的文檔狀態,如果卷積層是網絡中的第一層,'input_shape'必須是指定。 [docs](https://keras.io/layers/convolutional/) – DJK

+0

'input_dim'來自Keras 1.0。如果我要使用它,我還必須指定'input_length = 476',它與'input_shape =(476,4)'基本相同。 –