web-dev-qa-db-ja.com

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

ほとんどのモデルでは、ステップ数を示すステップ数パラメーターがあります。しかし、私はほとんどの実用的な使い方で見ることができます、我々はまたフィット関数N epochsを実行します。

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

91
Yang

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

人々はしばしばエポック間でデータセットをシャッフルします。私のエポックで処理するデータを選択するにはrandom.sample関数を使うのが好きです。 32のバッチサイズで1000のステップを実行したいとします。トレーニングデータのプールからランダムに32,000のサンプルを選びます。

68
chasep255

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

エポックは、トレーニングデータを通じた1つのフルサイクルで構成されています。これは通常多くのステップです。たとえば、2,000枚の画像があり、バッチサイズが10の場合、Epochは2,000画像/(10画像/ステップ)= 200ステップで構成されます。

あなたが各ステップで私たちのトレーニング画像をランダムに(そして独立して)選ぶなら、あなたは通常それをエポックとは呼ばない。 [これが私の答えが前のものと異なるところです。私のコメントも見てください。

57
MarvMind

私は現在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=1000tf.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.trainstepsが定義するものが何であれ、下限は実行されるステップの数を決定します。

11
dmainz

簡単に言うと
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エポックごとのトレーニングステップ数

トレーニングエポックの数を指定せずにトレーニングステップの数のみを指定する場合がある理由:すべてのトレーニングデータを順番にたどるのではなく、トレーニング用のトレーニングデータから「バッチサイズ」データを繰り返しランダムに抽出したい場合。したがって、人々はトレーニングのステップ数を設定するだけです。

1
Xin Su