PythonのTensorflowバックエンドでKerasを使用しています。より正確に言うと、テンソルフロー1.2.1とその組み込みcontrib.keras lib。
シーケンシャルモデルオブジェクトのfit_generator-Method
を使用したいのですが、メソッドパラメーターとして渡す必要があるものと混同しています。
ドキュメントを読むことで here 次の情報が得られました。
number of training batches = uniqueTrainingData / batchSize
???
; = uniqueValidationData /バッチサイズ??????で上記のようにvalidation_stepsの意味がわかりません。私は上記のリンクされたドキュメント(Number of steps to yield from validation generator at the end of every Epoch
)の定義を知っていますが、それは与えられたコンテキストで私を混乱させるだけです。 docから、validation_dataジェネレーターがデータを生成する必要があることを知っており、タプルに(inputs, targets)
という形式でラベルを付けます。これとは対照的に、上記のステートメントは、複数の「すべてのエポックの終わりに検証ジェネレータから生成するステップ」が必要であることを示しています。これは、このコンテキストでは、各エポックのトレーニング後に複数の検証バッチが生成されることを意味します。
validation_steps
に関する質問:
uniqueValidationData / batches
ではなくuniqueValidationData / epochs
なのはなぜですか?持っているほうがいいじゃないですかxが指定されたエポックの数よりも少ない場合も多い場合もあるx個の検証バッチではなく、100個のエポックに対する100個の検証バッチ?あるいは、エポックの数より検証バッチがはるかに少ない場合、モデルは残りのエポックの検証なしでトレーニングされますか、または検証セットは再利用/再シャッフル+再利用されますか?use_multiprocessing
に関する追加の質問:
検証ジェネレーターは、トレーニングジェネレーターとまったく同じように機能します。エポックごとに使用するバッチ数を定義します。
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 を使用することを提案しています。シーケンスはジェネレーターとしてほとんど機能しますが、各バッチの順序/位置を追跡します。