2017-07-14 14 views
0

ケラスでニューラルネットワークを作りようとしていましたが、密な層と活性層の間に形状の不一致がある問題がありました。私は明白な何かを欠いていますかTensorflowバックエンドの使用。ケラス:密集層と活性化層の間の形状の不一致

###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) 

しかし、私は次のエラーを取得する:

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

そして、次のように私のモデルがある

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

エラーが使用して、第2の活性層への入力から発信しているように見えますシグモイド活性化。例:

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

なぜ不一致がありますか?あなたのコードで

+0

緻密なレイヤーでinput_dimとunitsを指定する必要はありません。例。最後の高密度レイヤーは 'model.add(Dense(1、activation = 'sigmoid'))' – DJK

+0

ありがとう!これは不一致の問題を解決するようですが、 'ValueError:無効な引数 'class_modeが' model.fit() 'に由来するTensorflowバックエンドを持つK.functionに渡されるという新しいエラーが表示されます。それについての考えは? –

+0

'model_pile()'に '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) 'と本質的に同じです。 –

関連する問題