ほとんどのモデルでは、ステップ数を示すステップ数パラメーターがあります。しかし、私はほとんどの実用的な使い方で見ることができます、我々はまたフィット関数N epochsを実行します。
1エポックで1000ステップを実行することと10エポックで100ステップを実行することの違いは何ですか?どちらが実際に良いですか?連続するエポック間で論理は変わりますか?データシャッフル?
エポックは通常、すべてのトレーニングデータに対する1回の反復を意味します。たとえば、20,000の画像と100のバッチサイズがある場合、Epochには20,000/100 = 200ステップが含まれるはずです。ただし、データセットがもっと大きい場合でも、通常は1エポックあたり1000のような固定数のステップを設定するだけです。エポックの最後に平均コストをチェックし、それが改善された場合はチェックポイントを保存します。あるエポックから別のエポックへのステップ間に違いはありません。チェックポイントとして扱います。
人々はしばしばエポック間でデータセットをシャッフルします。私のエポックで処理するデータを選択するにはrandom.sample関数を使うのが好きです。 32のバッチサイズで1000のステップを実行したいとします。トレーニングデータのプールからランダムに32,000のサンプルを選びます。
トレーニングステップは、1つの勾配更新です。一段階batch_sizeでは多くの例が処理されます。
エポックは、トレーニングデータを通じた1つのフルサイクルで構成されています。これは通常多くのステップです。たとえば、2,000枚の画像があり、バッチサイズが10の場合、Epochは2,000画像/(10画像/ステップ)= 200ステップで構成されます。
あなたが各ステップで私たちのトレーニング画像をランダムに(そして独立して)選ぶなら、あなたは通常それをエポックとは呼ばない。 [これが私の答えが前のものと異なるところです。私のコメントも見てください。
私は現在tf.estimator APIを実験しているので、ここに私の新しい発見を加えたいと思います。 stepsおよびepochsパラメータの使用法が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
を設定し、numpy_input_fn
のdocエントリは "num_epochs:整数、データを反復するエポックの数です。None
が永遠に実行される場合です。" 。上記の例のnum_epochs=1
を使用すると、トレーニングは正確に x_train.size/batch_size times/stepsで実行されます(私の場合、x_train
のサイズは700000でbatch_size
は4でした)。
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 および batch_size = 4 )。 stepsパラメータが200,000 estimator.train(input_fn=train_input, steps=200000)
に設定されていても、ステップ数estimator.train
。
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ステップ後に停止します。これは、estimator.train(input_fn=train_input, steps=1000)
のsteps=1000
がtf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
のnum_epochs=1
を上書きするためです。
結論:num_epochs
のパラメータtf.estimator.inputs.numpy_input_fn
およびestimator.train
のsteps
が定義するものが何であれ、下限は実行されるステップの数を決定します。
簡単に言うと
Epoch: Epochはデータセット全体からの1パスの数と見なされます
Steps:テンソルフローでは、1ステップはエポック数に例を掛けたものをバッチサイズで割ったものと見なされます。
steps = (Epoch * examples)/batch size
For instance
Epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
エポック:トレーニングエポックは、勾配の計算と最適化(モデルのトレーニング)のためのすべてのトレーニングデータの完全な使用を表します。
ステップ:トレーニングステップとは、一度にバッチサイズのトレーニングデータを使用してトレーニングすることです。
エポックごとのトレーニングステップ数:total_number_of_training_examples/batch_size
トレーニングステップの総数:エポック数xエポックごとのトレーニングステップ数
トレーニングエポックの数を指定せずにトレーニングステップの数のみを指定する場合がある理由:すべてのトレーニングデータを順番にたどるのではなく、トレーニング用のトレーニングデータから「バッチサイズ」データを繰り返しランダムに抽出したい場合。したがって、人々はトレーニングのステップ数を設定するだけです。