TensorFlowのステップとエポックの違いは何ですか?


125

ほとんどのモデルには、データを実行するステップ数を示すstepsパラメータがあります。しかし、ほとんどの実際的な使用法では、フィット関数N epochsも実行しています。

1エポックで1000ステップを実行することと10エポックで100ステップを実行することの違いは何ですか?実際にはどちらが良いですか?連続するエポック間でロジックの変更はありますか?データシャッフル?


1
machinelearningmastery.comのJason Brownleeは、まさにその質問に対する非常に素晴らしく詳細な答えを持っています。
BmyGuest

回答:


84

エポックは通常、すべてのトレーニングデータに対する1回の反復を意味します。たとえば、20,000個の画像と100のバッチサイズがある場合、エポックには20,000 / 100 = 200ステップが含まれている必要があります。ただし、はるかに大きなデータセットを持っている場合でも、通常はエポックごとに1000などの固定ステップ数を設定します。エポックの終わりに平均コストをチェックし、それが改善された場合はチェックポイントを保存します。あるエポックから別のエポックへのステップ間に違いはありません。私はそれらをチェックポイントとして扱います。

人々は多くの場合、エポック間でデータセットをシャッフルします。私はrandom.sample関数を使用して、自分のエポックで処理するデータを選択することを好みます。したがって、バッチサイズ32で1000ステップを実行するとします。トレーニングデータのプールからランダムに32,000サンプルを選択します。


47
私の意見では、あなたの答えの2番目の部分は間違っています。エポックは、トレーニングデータの1サイクルとして定義されます。ステップ数を固定すれば、エポックではありません。同様に、各ステップで独立してトレーニングサンプルをサンプリングする場合、それをエポックと呼ぶことはできません。チェックポイントを保存してNステップごとにチェックを実行できますが、これはNステップがエポックになることを意味するものではありません。コードでこのエポックを呼び出すことは避けますが、混乱する可能性があります。
MarvMind 2017年

84

トレーニングステップは、1つの勾配の更新です。1つのステップbatch_sizeで多くの例が処理されます。

エポックは、トレーニングデータの1つの完全なサイクルで構成されます。これは通常多くのステップです。例として、2,000個の画像があり、10のバッチサイズを使用する場合、エポックは2,000画像/(10画像/ステップ)= 200ステップで構成されます。

各ステップでトレーニング画像をランダムに(そして独立して)選択する場合、通常、それをエポックとは呼びません。[これが私の答えが以前のものと異なるところです。私のコメントも参照してください。]


200ステップの計算を編集しましたが、ログインするのを忘れていたので、「不明なユーザー」と話したい場合は、私がここにいます
Chris Chiasson

16

現在tf.estimator APIを実験しているので、ここにも結露の調査結果を追加したいと思います。ステップとエポックパラメータの使用がTensorFlow全体で一貫しているかどうかはまだわからないので、今のところtf.estimator(具体的にはtf.estimator.LinearRegressor)にのみ関連しています。

によって定義されたトレーニングステップnum_epochssteps明示的に定義されていません

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でした)。Nonenum_epochs=1x_trainbatch_size

によって定義されたトレーニングステップnum_epochsstepsによって暗黙的に定義されたステップ数よりも明示的に定義されたトレーニングステップ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=1000estimator.train(input_fn=train_input, steps=1000)上書きnum_epochs=1tf.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_fnstepsのためestimator.train定義し、下限を介して実行されるステップの数を決定します。


11

簡単に言うと、
エポック:エポックはデータセット全体からの1パスの 数と見なされます
。ステップ: tensorflowでは、1ステップはエポックの数にバッチサイズで割った例を掛けたものと見なされます。

steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100

ウマル、私はあなたの式を使用してより良い結果を得ますが、なぜ誰もが異なる式を持っているのか疑問に思いますか?上記の誰もが言うように、ステップ数=(画像の総数)/バッチサイズ。
Satyendra Sahani

@SatyendraSahaniコースラで提供されているGCPコースのインストラクターの1人からこの式を入手しました。
Muhammad Umar Amanat

@Umar、しかし時々サンプルの数は膨大です。私たちの場合と同様に、サンプルは99,000です。バッチサイズ8とエポック20を選択した場合、step_sizeの合計数は(20 * 99000)/ 8 = 247,500になります。これは本当に高い数です。そこで私はこの方法を疑い始めました。
Satyendra

8

エポック:トレーニングエポックは、勾配の計算と最適化のためのすべてのトレーニングデータの完全な使用を表します(モデルをトレーニングします)。

ステップ:トレーニングステップとは、1つのバッチサイズのトレーニングデータを使用してモデルをトレーニングすることを意味します。

エポックあたりのトレーニングステップ数:total_number_of_training_examples/ batch_size

トレーニングステップの総数:number_of_epochsx Number of training steps per epoch


2

まだ受け入れられた回答がないため、デフォルトでは、エポックはすべてのトレーニングデータに適用されます。この場合、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をトレーニングした結果です。

この場合、どちらのアプローチでも非常によく似た予測が行われ、トレーニングプロファイルのみが異なります。

ステップ= 20 /エポック= 100 ここに画像の説明を入力してください

ここに画像の説明を入力してください

ステップ= 200 /エポック= 10

ここに画像の説明を入力してください

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.