2017-10-22 13 views
0

私は、他の多くの人が文献で使用してきた比較的簡単なKerasモデルを持っています。 n,m,pは、いくつかの任意の寸法であり、dropoutがドロップアウト率であるKerasドロップアウトレイヤーが動作しないように見える

model = Sequential() 
model.add(Dense(n, activation="relu")) 
model.add(Dropout(dropout)) 
model.add(Dense(m, activation="relu")) 
model.add(Dropout(dropout)) 
model.add(Dense(p)) 

:その単純化した形で、それはこのようになります。このようなモデルを練習します。

   model.compile(loss='mae', optimizer='adam') 

       lossHistory = keras.callbacks.History() 
       model.fit_generator(train_generator, 
            steps_per_epoch=steps_per_epoch, 
            epochs=epochs, 
            validation_data=valid_generator, 
            validation_steps=validation_steps, 
            callbacks = [lossHistory]) 

ここには何もありません。問題は、ドロップアウトパラメータが効果がないように見えることです。私が言っている理由は、私が使用しているドロップアウト値にかかわらず、私は多くのオーバーフィットを受けているということです(私は0.1,0.2、...、0.95を試しました)。

したがって、問題を診断するために、私は極値(dropout = 0と1)を試したかったのです。私はドロップアウト数が何を表しているのか誤解しているかもしれませんが、これらの値のうちの1つがすべて脱落して、モデルを本質的に無限にすることができます。 0のドロップアウト値と訓練がどのように見えるが...:これは不可能である必要があり

1/20 [>.............................] - ETA: 178s - loss: 0.2134 
2/20 [==>...........................] - ETA: 102s - loss: 0.2295 
3/20 [===>..........................] - ETA: 76s - loss: 0.2368 

:1のドロップアウト値で、その後

1/20 [>.............................] - ETA: 139s - loss: 0.9623 
2/20 [==>...........................] - ETA: 87s - loss: 0.7758 
3/20 [===>..........................] - ETA: 68s - loss: 0.6146 

、トレーニングは次のようになります。私はここで何を失っているのですか?ドロップアウトは、私のTensorflowモデルで私のために非常に有用であったが、何かが、私はKerasでそれを実装していますどのようにして間違っているように見える...

念、model.summaryのスニペット(ため)

を返します。
dense_1 (Dense)    (None, 50)    550  
_________________________________________________________________ 
dropout_1 (Dropout)   (None, 50)    0   
_________________________________________________________________ 
dense_2 (Dense)    (None, 1)     51   

だから、ドロップアウト層は実際にモデルに入っているように思えます(私が誤ってモデルから除外したダムバグではありません)。

答えて

2

ドロップアウトを0または1に設定すると、ソースコード内のドロップアウトレイヤーは、the layer definitionに従って無視されます。

def call(self, inputs, training=None): 
    if 0. < self.rate < 1.: 
     noise_shape = self._get_noise_shape(inputs) 

     def dropped_inputs(): 
      return K.dropout(inputs, self.rate, noise_shape, 
          seed=self.seed) 
     return K.in_train_phase(dropped_inputs, inputs, 
           training=training) 
    return inputs 
+0

これは、問題の一般的な趣旨ではなく、上記の例でのドロップアウトの使用が正しいかどうかという問題の一般的な趣旨に答えるものです。 –

+0

はい、申し訳ありませんが、keraのバックエンド定義をもう少し見ると、 'K.dropout()'は[単に 'tf.nn.dropout()'を呼び出しています(https://github.com/fchollet/keras/blob/マスター/ケラス/バックエンド/ tensorflow_backend.py)、keraのドロップアウトレイヤーをいくつかのモデルでうまく使用していたので、「私にとってはうまくいく」と言います。十分なデータがあるかどうかをチェックしたり、フィーチャエンジニアリングにもう少し時間を費やしたりする必要があるかもしれません。データを視覚化し、ノイズを取り除くことができるかどうかを確認してください。 –

関連する問題