web-dev-qa-db-ja.com

model.compile()はKeras(テンソルフローバックエンド)のすべての重みとバイアスを初期化しますか?

モデルのトレーニングを開始すると、以前に保存されたモデルはありません。 model.compile()を安全に使用できます。 checkpointを使用したさらなるトレーニングのために、モデルをh5ファイルに保存しました。

言う、私はモデルをさらに訓練したいと思います。この時点で混乱しています。ここでmodel.compile()を使用できますか?また、model = load_model()ステートメントの前後に配置する必要がありますか? model.compile()がすべての重みとバイアスを再初期化する場合、model = load_model()ステートメントの前に配置する必要があります。

いくつかの議論を発見した後、model.compile()はモデルが以前に保存されていない場合にのみ必要であるように思われます。モデルを保存したら、model.compile()を使用する必要はありません。本当ですか、それとも偽ですか?そして、訓練されたモデルを使用して予測したい場合、予測する前にmodel.compile()を使用する必要がありますか?

37

使用する場合

Ifcompileを使用している場合は、必ずload_model()の後でなければなりません。結局のところ、コンパイルするにはモデルが必要です。 (PS:load_modelは、モデルと共に保存されたオプティマイザーでモデルを自動的にコンパイルします)

compileは何をしますか?

コンパイルは、損失関数オプティマイザー、およびメトリックを定義します。それで全部です。

重みとは関係なく、事前学習済みの重みに問題を引き起こすことなく、何度でもモデルをコンパイルできます。

trainにコンパイルされたモデルが必要です(トレーニングでは損失関数とオプティマイザーが使用されるため)。しかし、予測のためにモデルをコンパイルする必要はありません。

コンパイルを複数回使用する必要がありますか?

次の場合のみ:

  • 次のいずれかを変更します:
    • 損失関数
    • オプティマイザー/学習率
    • 指標
  • まだコンパイルされていないモデルをロード(または作成)しました。または、ロード/保存メソッドは以前のコンパイルを考慮しませんでした。

再コンパイルの結果:

モデルを再度コンパイルすると、optimizer statesが失われます。

これは、学習率、運動量などを調整するまで、トレーニングは最初は少し苦しむことを意味します。ただし、ウェイトにまったくダメージはありません(もちろん、最初のトレーニングが非常に大きい場合を除きます) stepは、微調整されたウェイトを大幅に変更します)。

66
Daniel Möller

レイヤーのtrainableフラグを変更した後、モデルをコンパイルする必要があることも忘れないでください。このようなモデルを微調整する場合:

# load VGG model without top classifier

# freeze all the layers (i.e. `trainable = False`)

# add some layers to the top

# compile and train the model on some data

# un-freeze some of the layers of VGG by setting `trainable = True`

# compile the model again  <-- DON'T FORGET THIS STEP!

# train the model on some data
11
today