อะไรคือความแตกต่างระหว่างขั้นตอนและยุคใน TensorFlow?


125

ในส่วนของรูปแบบมีขั้นตอนพารามิเตอร์ระบุจำนวนของขั้นตอนในการทำงานมากกว่าข้อมูล แต่ฉันเห็นในการใช้งานจริงมากที่สุดเรายังดำเนินการยังไม่มีฟังก์ชั่นพอดีepochs

อะไรคือความแตกต่างระหว่างการวิ่ง 1,000 ก้าวกับ 1 ยุคและการวิ่ง 100 ก้าวกับ 10 ยุค? ข้อใดดีกว่าในทางปฏิบัติ? มีการเปลี่ยนแปลงตรรกะใด ๆ ระหว่างยุคที่ติดต่อกัน? การสับข้อมูล?


1
Jason Brownleeที่ machinelearningmastery.com มีคำตอบที่ละเอียดและดีมากสำหรับคำถามนั้น
BmyGuest

คำตอบ:


84

ช่วงเวลามักหมายถึงการวนซ้ำหนึ่งครั้งในข้อมูลการฝึกอบรมทั้งหมด ตัวอย่างเช่นถ้าคุณมี 20,000 ภาพและขนาดแบทช์ 100 ดังนั้นยุคควรมี 20,000 / 100 = 200 ขั้นตอน อย่างไรก็ตามฉันมักจะกำหนดจำนวนขั้นตอนคงที่เช่น 1,000 ต่อยุคแม้ว่าฉันจะมีชุดข้อมูลที่ใหญ่กว่ามากก็ตาม ในตอนท้ายของยุคฉันตรวจสอบค่าใช้จ่ายโดยเฉลี่ยและถ้ามันดีขึ้นฉันก็บันทึกด่าน ไม่มีความแตกต่างระหว่างขั้นตอนจากยุคหนึ่งไปอีกยุคหนึ่ง ฉันแค่ถือว่าพวกเขาเป็นด่าน

ผู้คนมักจะสับเปลี่ยนชุดข้อมูลระหว่างยุคต่างๆ ฉันชอบใช้ฟังก์ชัน random.sample เพื่อเลือกข้อมูลที่จะประมวลผลในยุคของฉัน สมมติว่าฉันต้องการทำ 1,000 ขั้นตอนโดยมีขนาดชุดเป็น 32 ฉันจะสุ่มเลือก 32,000 ตัวอย่างจากกลุ่มข้อมูลการฝึกอบรม


47
ส่วนที่สองของคำตอบของคุณผิดในความคิดของฉัน ยุคถูกกำหนดเป็นหนึ่งรอบผ่านข้อมูลการฝึกอบรม ไม่ใช่ยุคถ้าคุณกำหนดจำนวนขั้นตอน ในทำนองเดียวกันคุณไม่สามารถเรียกมันว่า epoch ได้หากคุณสุ่มตัวอย่างการฝึกอบรมอย่างอิสระในแต่ละขั้นตอน คุณสามารถบันทึกจุดตรวจของคุณและตรวจสอบทุก N ขั้นตอน แต่ไม่ได้หมายความว่า N Steps จะกลายเป็นยุค ฉันจะหลีกเลี่ยงการเรียกยุคนี้ในรหัสซึ่งอาจทำให้สับสนได้
MarvMind

84

ขั้นตอนการฝึกอบรมคือการอัพเดตแบบไล่ระดับสี ในขั้นตอนเดียว batch_size หลายตัวอย่างจะถูกประมวลผล

ยุคประกอบด้วยหนึ่งรอบเต็มผ่านข้อมูลการฝึกอบรม โดยปกติจะมีหลายขั้นตอน ตัวอย่างเช่นหากคุณมี 2,000 ภาพและใช้ขนาดแบทช์ 10 ยุคประกอบด้วย 2,000 ภาพ / (10 ภาพ / ขั้นตอน) = 200 ขั้น

หากคุณเลือกภาพการฝึกอบรมของเราแบบสุ่ม (และเป็นอิสระ) ในแต่ละขั้นตอนโดยปกติคุณจะไม่เรียกมันว่า epoch [นี่คือจุดที่คำตอบของฉันแตกต่างจากข้อก่อนหน้า ดูความคิดเห็นของฉันด้วย]


ฉันแก้ไขการคำนวณ 200 ขั้นตอน แต่ลืมเข้าสู่ระบบดังนั้นหากคุณต้องการพูดคุยกับ "ผู้ใช้ที่ไม่รู้จัก" ... ฉันอยู่ที่นี่
Chris Chiasson

16

ในขณะที่ฉันกำลังทดลองกับ 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สำหรับอินพุตการฝึกอบรมและรายการเอกสารสำหรับnumpy_input_fnบอกฉันว่า"num_epochs: จำนวนเต็มจำนวนยุคที่จะวนซ้ำข้อมูลถ้าNoneจะทำงานตลอดไป" . ด้วยnum_epochs=1ในตัวอย่างข้างต้นการฝึกอบรมวิ่งตรงx_train.size / batch_sizeครั้ง / ขั้นตอน (ในกรณีของฉันนี้คือ 175000 ขั้นตอนx_trainมีขนาดของ 700000 และbatch_size4)

ขั้นตอนการฝึกที่กำหนดโดย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กับx_train.size = 700,000และbatch_size = 4 ) และตรงนี้เป็นจำนวนขั้นตอนestimator.trainแม้ว่าขั้นตอนพารามิเตอร์ถูกกำหนดให้ estimator.train(input_fn=train_input, steps=200000)200,000

ขั้นตอนการฝึกอบรมที่กำหนดโดย 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การฝึกหยุดหลังจาก 1,000 ก้าว เนื่องจาก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กำหนดขอบเขตที่ต่ำกำหนดจำนวนขั้นตอนซึ่งจะวิ่งผ่าน


11

พูดง่ายๆ
Epoch: Epoch ถือเป็นจำนวนหนึ่งรอบจาก
ขั้นตอนชุดข้อมูลทั้งหมด :ในเทนซอร์โฟลว์หนึ่งขั้นตอนถือเป็นจำนวนยุคคูณด้วยตัวอย่างหารด้วยขนาดแบทช์

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

Umar ฉันได้ผลลัพธ์ที่ดีกว่าเมื่อใช้สูตรของคุณ แต่แค่สงสัยว่าทำไมทุกคนถึงมีสูตรที่แตกต่างกัน? เช่นเดียวกับคนอื่น ๆ ข้างต้นขั้นตอน = (จำนวนภาพทั้งหมด) / ขนาดแบทช์
Satyendra Sahani

@SatyendraSahani ฉันได้รับสูตรนี้จากหนึ่งในผู้สอนของหลักสูตร GCP ที่เปิดสอนในหลักสูตรนี้อาจเป็นกรณีที่คุณได้ผลลัพธ์ที่ดีกว่า
Muhammad Umar Amanat

@ อูมาร์ แต่ในบางครั้งจำนวนตัวอย่างก็มาก เช่นเดียวกับในกรณีของเราเรามีตัวอย่าง 99,000 ตัวอย่าง ถ้าเราเลือกชุดขนาด 8 และยุค 20 จำนวน step_size ทั้งหมดคือ (20 * 99000) / 8 = 247,500 ซึ่งเป็นตัวเลขที่สูงมาก ฉันเริ่มสงสัยวิธีนี้
Satyendra Sahani

8

ยุค: ยุคการฝึกอบรมแสดงถึงการใช้ข้อมูลการฝึกอบรมทั้งหมดสำหรับการคำนวณการไล่ระดับสีและการเพิ่มประสิทธิภาพ (ฝึกโมเดล)

ขั้นตอน: ขั้นตอนการฝึกอบรมหมายถึงการใช้ข้อมูลการฝึกขนาดหนึ่งชุดเพื่อฝึกโมเดล

จำนวนขั้นตอนการฝึกต่อยุค: total_number_of_training_examples/ batch_size.

จำนวนขั้นตอนการฝึกทั้งหมด: number_of_epochsx Number of training steps per epoch.


2

เนื่องจากยังไม่มีคำตอบที่เป็นที่ยอมรับ: โดยค่าเริ่มต้นยุคจะใช้กับข้อมูลการฝึกอบรมทั้งหมดของคุณ ในกรณีนี้คุณมี n ขั้นตอนโดยมี n = Training_lenght / batch_size

หากข้อมูลการฝึกของคุณใหญ่เกินไปคุณสามารถตัดสินใจ จำกัด จำนวนขั้นตอนในช่วงยุค [ https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

เมื่อจำนวนขั้นตอนถึงขีด จำกัด ที่คุณตั้งไว้กระบวนการจะเริ่มต้นใหม่เริ่มต้นยุคถัดไป เมื่อทำงานใน TF ข้อมูลของคุณมักจะถูกแปลงเป็นรายการชุดงานที่จะป้อนเข้าสู่โมเดลสำหรับการฝึกอบรมก่อน ในแต่ละขั้นตอนคุณจะดำเนินการหนึ่งชุด

ว่าจะดีกว่าถ้าตั้ง 1,000 ขั้นตอนสำหรับ 1 ยุคหรือ 100 ขั้นตอนกับ 10 ยุคฉันไม่รู้ว่ามีคำตอบที่ตรงหรือไม่ แต่นี่คือผลลัพธ์ในการฝึกอบรม CNN ด้วยทั้งสองวิธีโดยใช้แบบฝึกหัดข้อมูล TensorFlow timeseries:

ในกรณีนี้ทั้งสองแนวทางนำไปสู่การคาดการณ์ที่คล้ายคลึงกันมากมีเพียงโปรไฟล์การฝึกอบรมเท่านั้นที่แตกต่างกัน

ขั้นตอน = 20 / epochs = 100 ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่

ก้าว = 200 / epochs = 10

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.