タイトルの通りですが,日本語記事が見つからなかったので.
without_dropout_in_prediction.py
x = Dense(dense_unit_num)(x)
x = Dropout(dropout_rate)(x)
これだと訓練時にしかドロップアウトが適用されません.
with_dropout_in_prediction.py
x = Dense(dense_unit_num)(x)
x = Dropout(dropout_rate)(x, training=True)
training=Trueをつけると,予測時にもドロップアウトが適用されるようになります.trainingのフラグをTrueにしたら予測時にも適用される,というのは少し分かり辛いですね...
参考: https://github.com/keras-team/keras/issues/9412
なお,公式のドキュメントにもこの情報は書いてなさそうとのことです.
なぜ予測時にもドロップアウトを使うのか?
ドロップアウトは経験的にニューラルネットワークの過学習を抑制してくれることが知られていました.そのため,訓練時にはドロップアウトを適用し,予測時には適用しない,というのが一般的となっていました.
しかし近年,ドロップアウトを使ったニューラルネットワークは,変分推論を行っていることと等価であり,ベイズ的に事後分布を求めることができることが示されました.そして,ドロップアウトが適用されたネットワークから予測された値は,その事後分布からサンプリングしていることと等しいこととなります.
日本語だとこの記事が詳しいです.
簡単に言うと,ニューラルネットワークによる予測の不確かさを知ることができます.なので,予測時にもドロップアウトが使いたかったのです.