簡體   English   中英

TensorFlow 中的 step 和 epochs 有什么區別?

[英]What is the difference between steps and epochs in TensorFlow?

在大多數模型中,都有一個steps參數,指示運行數據的步驟數 但是我看到在大多數實際使用中,我們還執行了擬合函數 N epochs

1 epoch 跑 1000 步和 10 epoch 跑 100 步有什么區別? 哪一種在實踐中更好? 連續紀元之間的任何邏輯變化? 數據洗牌?

一個訓練步驟是一個梯度更新。 在一個步驟中,batch_size 處理了許多示例。

一個 epoch 由一個完整的循環訓練數據組成。 這通常需要很多步驟。 例如,如果您有 2,000 張圖像並使用 10 的批量大小,則 epoch 由 2,000 張圖像/(10 張圖像/步)= 200 步組成。

如果您在每個步驟中隨機(且獨立地)選擇我們的訓練圖像,您通常不稱其為紀元。 [這是我的答案與上一個不同的地方。 另見我的評論。]

一個時期通常意味着對所有訓練數據進行一次迭代。 例如,如果您有 20,000 張圖像和 100 的批量大小,那么 epoch 應該包含 20,000 / 100 = 200 步。 然而,即使我有一個更大的數據集,我通常只設置固定數量的步驟,例如每個 epoch 1000。 在時代結束時,我檢查平均成本,如果它有所改善,我會保存一個檢查點。 從一個時代到另一個時代的步驟之間沒有區別。 我只是把它們當作檢查站。

人們經常在不同時期之間的數據集周圍洗牌。 我更喜歡使用 random.sample 函數來選擇要在我的時代中處理的數據。 所以說我想用 32 的批量大小做 1000 步。我將從訓練數據池中隨機選擇 32,000 個樣本。

由於我目前正在試驗 tf.estimator API,因此我也想在這里添加我的發現。 我還不知道步驟和 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的文檔條目告訴我“num_epochs:整數,迭代數據的時期數。如果None將永遠運行。” . 在上例中num_epochs=1 ,訓練正好運行x_train.size/batch_size次/步(在我的例子中,這是 175000 步,因為x_train的大小為 700000, batch_size為 4)。

培養通過限定的步驟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_sizex_train.size=700,000batch_size=4 ),這正是estimator.train的步數,盡管 steps 參數設置為 200,000 estimator.train(input_fn=train_input, steps=200000)

steps定義的訓練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)

評論:雖然我在調用numpy_input_fn時設置了num_epochs=1 ,但訓練在 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_epochstf.estimator.inputs.numpy_input_fnstepsestimator.train限定,下限確定的,這將通過運行步驟的數目。

用簡單的話說
Epoch: Epoch 被認為是整個數據集的一次傳遞次數
步驟:在 tensorflow 中,一步被認為是時代數乘以示例除以批量大小

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

Epoch:一個訓練 epoch 代表完全使用所有訓練數據進行梯度計算和優化(訓練模型)。

步驟:訓練步驟是指使用一批訓練數據來訓練模型。

每個時期的訓練步驟數: total_number_of_training_examples / batch_size

訓練步驟總數: number_of_epochs x Number of training steps per epoch

由於還沒有公認的答案:默認情況下,一個紀元會遍歷您的所有訓練數據。 在這種情況下,您有 n 個步驟,其中 n = Training_lenght / batch_size。

如果您的訓練數據太大,您可以決定限制一個時期內的步驟數。[ https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

當步數達到您設置的限制時,該過程將重新開始,從下一個時期開始。 在 TF 中工作時,您的數據通常首先被轉換成一個批次列表,這些批次將被提供給模型進行訓練。 在每一步處理一個批次。

至於是設置1000步1000步還是100步10個紀元更好,我不知道是否有直接的答案。 但這里是使用 TensorFlow 時間序列數據教程使用兩種方法訓練 CNN 的結果:

在這種情況下,兩種方法都會導致非常相似的預測,只是訓練配置文件不同。

步數 = 20 / epochs = 100 在此處輸入圖片說明

在此處輸入圖片說明

步數 = 200 / epochs = 10

在此處輸入圖片說明

在此處輸入圖片說明

根據 谷歌的機器學習詞匯表,一個時代被定義為

對整個數據集進行完整的訓練,這樣每個例子都被看到了一次。因此,一個時期代表N/batch_size訓練迭代,其中 N 是例子的總數。

如果您使用批量大小為 6訓練10 個時期的模型,則給定總共12 個樣本,這意味着:

  1. 該模型將能夠在 2 次迭代(12 / 6 = 2)即單個時期中看到整個數據集。

  2. 總體而言,該模型將有 2 X 10 = 20 次迭代(每紀元迭代數 X 紀元數)

  3. 每次迭代后都會重新評估損失和模型參數!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM