回答:
エポックは通常、すべてのトレーニングデータに対する1回の反復を意味します。たとえば、20,000個の画像と100のバッチサイズがある場合、エポックには20,000 / 100 = 200ステップが含まれている必要があります。ただし、はるかに大きなデータセットを持っている場合でも、通常はエポックごとに1000などの固定ステップ数を設定します。エポックの終わりに平均コストをチェックし、それが改善された場合はチェックポイントを保存します。あるエポックから別のエポックへのステップ間に違いはありません。私はそれらをチェックポイントとして扱います。
人々は多くの場合、エポック間でデータセットをシャッフルします。私はrandom.sample関数を使用して、自分のエポックで処理するデータを選択することを好みます。したがって、バッチサイズ32で1000ステップを実行するとします。トレーニングデータのプールからランダムに32,000サンプルを選択します。
トレーニングステップは、1つの勾配の更新です。1つのステップbatch_sizeで多くの例が処理されます。
エポックは、トレーニングデータの1つの完全なサイクルで構成されます。これは通常多くのステップです。例として、2,000個の画像があり、10のバッチサイズを使用する場合、エポックは2,000画像/(10画像/ステップ)= 200ステップで構成されます。
各ステップでトレーニング画像をランダムに(そして独立して)選択する場合、通常、それをエポックとは呼びません。[これが私の答えが以前のものと異なるところです。私のコメントも参照してください。]
現在tf.estimator APIを実験しているので、ここにも結露の調査結果を追加したいと思います。ステップとエポックパラメータの使用がTensorFlow全体で一貫しているかどうかはまだわからないので、今のところtf.estimator(具体的にはtf.estimator.LinearRegressor)にのみ関連しています。
によって定義されたトレーニングステップnum_epochs
:steps
明示的に定義されていません
estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input)
コメント:num_epochs=1
トレーニング入力用に設定し、のドキュメントエントリで「num_epochs:整数、データを反復処理するエポックの数。もし永遠に実行されるか」とnumpy_input_fn
教えてくれました。。では、上記の例では、トレーニングが正確に動作しますx_train.size / BATCH_SIZEの時間は/手順は、(と私の場合、これは175000回のステップだった700000の大きさを持っていたし、4でした)。None
num_epochs=1
x_train
batch_size
によって定義されたトレーニングステップnum_epochs
:steps
によって暗黙的に定義されたステップ数よりも明示的に定義されたトレーニングステップnum_epochs=1
estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=200000)
コメント:num_epochs=1
私の場合、175000ステップ(x_train.size / batch_size with x_train.size = 700,000 and batch_size = 4)を意味しestimator.train
、stepsパラメーターが200,000に設定されていても、これは正確にステップ数ですestimator.train(input_fn=train_input, steps=200000)
。
によって定義されたトレーニングステップ steps
estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=1000)
コメント:トレーニングをnum_epochs=1
呼び出すときに設定しましたnumpy_input_fn
が、1000ステップ後に停止します。これはあるsteps=1000
でestimator.train(input_fn=train_input, steps=1000)
上書きnum_epochs=1
でtf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
。
結論:どのようなパラメータnum_epochs
のためにtf.estimator.inputs.numpy_input_fn
とsteps
のためestimator.train
定義し、下限を介して実行されるステップの数を決定します。
簡単に言うと、
エポック:エポックはデータセット全体からの1パスの
数と見なされます
。ステップ: tensorflowでは、1ステップはエポックの数にバッチサイズで割った例を掛けたものと見なされます。
steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
まだ受け入れられた回答がないため、デフォルトでは、エポックはすべてのトレーニングデータに適用されます。この場合、n = Training_lenght / batch_sizeのnステップがあります。
トレーニングデータが大きすぎる場合は、エポック中のステップ数を制限することを決定できます。[ https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]
ステップ数が設定した制限に達すると、プロセスが最初から始まり、次のエポックが始まります。TFで作業する場合、データは通常、最初にバッチのリストに変換され、トレーニングのためにモデルに供給されます。各ステップで1つのバッチを処理します。
1エポックに対して1000ステップを設定するか、10エポックを使用して100ステップを設定するのが良いかについては、正解があるかどうかわかりません。しかし、これはTensorFlow timeseriesデータチュートリアルを使用して両方のアプローチでCNNをトレーニングした結果です。
この場合、どちらのアプローチでも非常によく似た予測が行われ、トレーニングプロファイルのみが異なります。
ステップ= 200 /エポック= 10