web-dev-qa-db-ja.com

ケラスで予測中にドロップアウトを無効にする方法は?

ケラスのニューラルネットワークモデルでドロップアウトを使用しています。少しのコードは

_model.add(Dropout(0.5))
model.add(Dense(classes))
_

テストには、preds = model_1.predict_proba(image)を使用しています。

しかし、テスト中にドロップアウトは、発生してはならないスコアを予測するために参加しています。ドロップアウトを無効にするためによく検索しましたが、まだヒントが得られませんでした。

ケラスでテスト中にドロップアウトを無効にする解決策はありますか?

14
Akhilesh

Kerasはデフォルトでこれを行います。 Kerasでは、テストモードでドロップアウトが無効になっています。コード here を見ると、トレーニングでドロップされた入力とテスト中の実際の入力が使用されていることがわかります。

私が知る限り、レイヤーから独自のトレーニング関数を構築し、ドロップアウトで予測するトレーニングフラグを指定する必要があります(たとえば、予測関数にトレーニングフラグを指定することはできません)。これは、生成されたトレーニング画像と生成されたテスト画像の相違により、トレーニングに中間出力を使用し、ネットワーク全体をトレーニングするGANを実行する場合の問題です。

27
Thomas Pinetz

前述のように、Kerasでのドロップアウトは、トレーニング時にのみ発生します(ドロップアウトが無効な場合、学習した重みが予測に適切になるように、トレーニング中に比例した重み調整が行われます)。

これは、ドロップアウトNNETを確率的予測子として使用する場合(同じ入力を繰り返し予測するよう求められたときに分布を生成するなど)には理想的ではありません。言い換えれば、Kerasのドロップアウトレイヤーは、列車の時間に正則化を提供するように設計されていますが、予測時の学習分布の「平均関数」を提供します。

予測のためにドロップアウトを保持したい場合は、パーマネントドロップアウト( "PermaDropout")レイヤーを簡単に実装できます(これは、F。Cholletによる KerasのGitHubディスカッションエリア )の提案に基づいています。

from keras.layers.core import Lambda
from keras import backend as K

def PermaDropout(rate):
    return Lambda(lambda x: K.dropout(x, level=rate))

Kerasモデルのドロップアウトレイヤーを「PermaDropout」に置き換えることにより、予測の確率的な動作も取得できます。

# define the LSTM model
n_vocab = text_to_train.n_vocab

model = Sequential()
model.add(LSTM(n_vocab*4, 
          input_shape=input_shape, 
          return_sequences=True))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
model.add(LSTM(n_vocab*2))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
#model.add(Dense(n_vocab*2))
model.add(Dense(n_vocab, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
8
T3am5hark

ドロップアウトは、特定のニューロンを遊びから取り除きます。それを補うために、通常は2つの方法のいずれかを使用します。

  1. テスト時のアクティベーションのスケーリング
  2. トレーニング段階でドロップアウトを反転する

そして、ご覧のとおり、kerasは2番目の修正形式を使用します here

2
Vj-

トレーニング済みモデルのドロップアウトを変更できます(ドロップアウトレイヤーを使用):

f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output])

この方法では、モデルを再度トレーニングする必要はありません!!!

1
Marco Cerliani