web-dev-qa-db-ja.com

Keras Sequential fit_generatorパラメーターリストのvalidation_stepsの意味

PythonのTensorflowバックエンドでKerasを使用しています。より正確に言うと、テンソルフロー1.2.1とその組み込みcontrib.keras lib。

シーケンシャルモデルオブジェクトのfit_generator-Methodを使用したいのですが、メソッドパラメーターとして渡す必要があるものと混同しています。

ドキュメントを読むことで here 次の情報が得られました。

  • generator:a pythonトレーニングデータバッチジェネレータ;トレーニングデータを無限にループする
  • validation_data:-私の場合-a python検証データバッチジェネレーター、ドキュメントでは検証データの無限ループについて言及されていません
  • steps_per_Epochnumber of training batches = uniqueTrainingData / batchSize
  • 検証手順???; = uniqueValidationData /バッチサイズ???
  • use_multiprocessing:ブール値;選べない引数を渡さないでください???
  • workers:使用されるプロセスの最大数

???で上記のようにvalidation_stepsの意味がわかりません。私は上記のリンクされたドキュメント(Number of steps to yield from validation generator at the end of every Epoch)の定義を知っていますが、それは与えられたコンテキストで私を混乱させるだけです。 docから、validation_dataジェネレーターがデータを生成する必要があることを知っており、タプルに(inputs, targets)という形式でラベルを付けます。これとは対照的に、上記のステートメントは、複数の「すべてのエポックの終わりに検証ジェネレータから生成するステップ」が必要であることを示しています。これは、このコンテキストでは、各エポックのトレーニング後に複数の検証バッチが生成されることを意味します。

validation_stepsに関する質問:

  • それは本当にそのように機能しますか?もしそうなら:なぜ?エポックごとに、以前は理想的には使用されていなかった1つの検証バッチが検証に使用され、既に使用されている検証セットでモデルを「トレーニング」するリスクを冒すことなくトレーニングが検証されることを確認しました。
  • 前の質問に照らして:推奨される検証手順の量はuniqueValidationData / batchesではなくuniqueValidationData / epochsなのはなぜですか?持っているほうがいいじゃないですかxが指定されたエポックの数よりも少ない場合も多い場合もあるx個の検証バッチではなく、100個のエポックに対する100個の検証バッチ?あるいは、エポックの数より検証バッチがはるかに少ない場合、モデルは残りのエポックの検証なしでトレーニングされますか、または検証セットは再利用/再シャッフル+再利用されますか?
  • トレーニングバッチと検証バッチのバッチサイズが同じであることが重要ですか(配当のtrainingDataCountとvalidationDataCountの共有除数)。

use_multiprocessingに関する追加の質問:

  • Numpy配列は選択可能ですか、または多次元リストに変換する必要がありますか?
20
Philipp Lange

検証ジェネレーターは、トレーニングジェネレーターとまったく同じように機能します。エポックごとに使用するバッチ数を定義します。

  • トレーニングジェネレーターはsteps_per_Epochバッチを生成します。
  • エポックが終了すると、検証ジェネレーターはvalidation_stepsバッチを生成します。

ただし、検証データはトレーニングデータとはまったく関係がありません。トレーニングバッチに応じて検証バッチを分ける必要はありません(非常に具体的な意図がない限り、それを行う意味がないとさえ言うでしょう)。また、トレーニングデータのサンプルの総数は、テストデータのサンプルの総数とは関係ありません。

多くのバッチを作成するポイントは、コンピューターのメモリを節約することです。そのため、小さなパックを1つずつテストします。おそらく、メモリまたは予想されるトレーニング時間に適合するバッチサイズを見つけて、そのサイズを使用します。

とは言うものの、Kerasは完全に無料の方法を提供するため、必要に応じてトレーニングと検証バッチを決定できます。

エポック:

理想的には、すべての検証データを一度に使用します。検証データの一部のみを使用する場合、バッチごとに異なるメトリックを取得します。実際にはそうではない場合にモデルが悪化または改善したと思われるのは、異なる検証セットを測定しただけです。

それが彼らがvalidation_steps = total_validation_samples // validation_batch_sizeを提案する理由です。
理論的には、エポックごとにデータ全体をテストします。理論的には、エポックごとにデータ全体をトレーニングする必要があるためです。

したがって、理論的には各エポックは以下を生成します。

  • steps_per_Epoch = TotalTrainingSamples / TrainingBatchSize
  • validation_steps = TotalvalidationSamples / ValidationBatchSize

基本的に、2つの変数は次のとおりです。エポックごとに生成するバッチ数。
これにより、各エポックで次のことが保証されます。

  • トレーニングセット全体を正確にトレーニングする
  • 検証セット全体を正確に検証します

それでも、トレーニングデータと検証データをどのように分離するかは完全にあなた次第です。

エポックごとに異なるバッチを使用したい場合(エポックはデータ全体よりも少ないエポックを使用)、大丈夫です。たとえば、steps_per_Epoch=1またはvalidation_steps=1を渡すだけです。ジェネレーターは各エポック後にリセットされないため、2番目のエポックは2番目のバッチを取得し、最初のバッチに再びループするまで続きます。

エポックごとにデータ全体をトレーニングすることを好み、時間が長すぎる場合は、各バッチの終わりにログを表示するcallbackを使用します。

from keras.callbacks import LambdaCallback

callbacks = callbacks=[LambdaCallback(on_batch_end=lambda batch,logs:print(logs))]

マルチプロセッシング

use_multiprocessing=Trueを使用することはできませんでした。最初のエポックの開始時にフリーズします。

workersは、ジェネレーターからプリロードされたバッチの数に関連していることに気付きました。 max_queue_size=1を定義すると、正確にworkers個のバッチがプリロードされます。

彼らは、マルチプロセッシング時に keras Sequences を使用することを提案しています。シーケンスはジェネレーターとしてほとんど機能しますが、各バッチの順序/位置を追跡します。

40
Daniel Möller