TensorFlow'da adımlar ve dönemler arasındaki fark nedir?


125

Modellerin çoğunda, veri üzerinden çalıştırılacak adımların sayısını gösteren bir adımlar parametresi vardır . Ama yine de en pratik kullanımda, N epochs fit fonksiyonunu da uyguladığımızı görüyorum .

1 epoch ile 1000 adım koşmak ile 10 epoch ile 100 adım koşmak arasındaki fark nedir? Pratikte hangisi daha iyi? Ardışık çağlar arasında herhangi bir mantık değişikliği var mı? Veri karıştırma?


1
Machinelearningmastery.com'daki Jason Brownlee'nin tam olarak bu soruya çok güzel ve ayrıntılı bir cevabı var .
BmyGuest

Yanıtlar:


84

Bir dönem genellikle tüm eğitim verilerinde bir yineleme anlamına gelir. Örneğin, 20.000 görüntünüz ve 100'lük bir toplu iş boyutunuz varsa, dönem 20.000 / 100 = 200 adım içermelidir. Bununla birlikte, çok daha büyük bir veri kümem olmasına rağmen genellikle dönem başına 1000 gibi sabit bir adım sayısı belirledim. Çağın sonunda ortalama maliyeti kontrol ediyorum ve iyileşirse bir kontrol noktasından tasarruf ediyorum. Bir çağdan diğerine adımlar arasında hiçbir fark yoktur. Onları kontrol noktası olarak görüyorum.

İnsanlar genellikle çağlar arasında veri kümesi etrafında dolaşırlar. Çağlarımda işlenecek verileri seçmek için random.sample işlevini kullanmayı tercih ediyorum. Diyelim ki parti boyutu 32 olan 1000 adım yapmak istiyorum. Eğitim verileri havuzundan rastgele 32.000 örnek seçeceğim.


47
Bence cevabınızın ikinci kısmı yanlış. Dönem, eğitim verileri aracılığıyla bir döngü olarak tanımlanır. Adımların sayısını sabitlerseniz, bu bir çağ değildir. Eğitim örneğini her adımda bağımsız olarak örneklerseniz, analog olarak buna epoch diyemezsiniz. Kontrol noktanızı kaydedebilir ve her N Adımda kontrol yapabilirsiniz, ancak bu N Adımın bir çağ haline geldiği anlamına gelmez. Kodda bu dönemi çağırmaktan kaçınırım, kafa karıştırıcı potansiyele sahiptir.
MarvMind

84

Bir eğitim adımı, bir gradyan güncellemesidir. Bir adımda batch_size birçok örnek işlenir.

Bir dönem, eğitim verileri aracılığıyla bir tam döngüden oluşur. Bu genellikle birçok adımdır. Örnek olarak, 2.000 görüntünüz varsa ve 10'luk bir toplu iş boyutu kullanıyorsanız, bir dönem 2.000 görüntü / (10 görüntü / adım) = 200 adımdan oluşur.

Her adımda eğitim resmimizi rastgele (ve bağımsız) seçerseniz, normalde buna epoch demezsiniz. [Cevabımın öncekinden farklı olduğu yer burası. Yorumuma da bakın.]


200 adım hesaplamasında bir düzenleme yaptım ancak giriş yapmayı unuttum, bu yüzden "bilinmeyen kullanıcı" ile konuşmak istiyorsanız ... Buradayım
Chris Chiasson

16

Şu anda tf.estimator API'sini denediğim için, bulanık bulgularımı da buraya eklemek istiyorum. Adımların ve epochs parametrelerinin kullanımının TensorFlow boyunca tutarlı olup olmadığını henüz bilmiyorum ve bu nedenle şimdilik sadece tf.estimator (özellikle tf.estimator.LinearRegressor) ile ilişkiliyim.

Eğitim adımları tanımlandı num_epochs: stepsaçıkça tanımlanmadı

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)

Yorum: num_epochs=1Eğitim girdisi için ayarladım ve doküman girişi numpy_input_fnbana "num_epochs: Integer, veri üzerinde yinelenecek dönem sayısı. If Nonesonsuza kadar çalışacak" diyor. . İle num_epochs=1yukarıdaki örnekte eğitim tam olarak çalışır x_train.size / batch_size süreleri / adımlar (aynı benim durumumda bu 175.000 adımlar oldu x_train700000 bir boyutu vardı ve batch_size4 idi).

Eğitim adımları şu şekilde tanımlanır num_epochs: stepsaçıkça tanımlanmış adım sayısından daha yükseknum_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)

Yorum: num_epochs=1benim durumumda 175000 adım anlamına gelir ( x_train.size / batch_size ile x_train.size = 700.000 ve batch_size = 4 ) ve estimator.trainadımlar parametresi 200.000 olarak ayarlanmış olsa da bu tam olarak adım sayısıdır estimator.train(input_fn=train_input, steps=200000).

Tarafından tanımlanan eğitim adımları 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)

Yorum: Her ne kadar 1000 adımdan sonra eğitim durmalarını num_epochs=1çağırırken ayarlamış olsam da numpy_input_fn. Bunun nedeni ise steps=1000içinde estimator.train(input_fn=train_input, steps=1000)üzerine yazar num_epochs=1içinde tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True).

Sonuç : Her ne parametreleri num_epochsiçin tf.estimator.inputs.numpy_input_fnve stepsiçin estimator.traintanımlar, alt sınır tarafından işletilecek adım sayısını belirler.


11

Basit bir deyişle,
Epoch: Epoch, tüm veri kümesinden bir geçiş sayısı olarak kabul edilir
Adımlar: Tensorflow'da bir adım, epoch sayısının örneklerle çarpılarak parti boyutuna bölünmesi olarak kabul edilir.

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

Umar, formülünü kullanarak daha iyi bir sonuç alıyorum ama sadece merak ediyorum neden herkesin farklı bir formülü var? Yukarıdaki herkesin söylediği gibi, adımlar = (toplam görüntü sayısı) / parti boyutu.
Satyendra Sahani

@SatyendraSahani Bu formülü, coursera'da sunulan GCP kursunun eğitmenlerinden birinden aldım, belki de daha iyi bir sonuç aldığın bir durum olabilir.
Muhammad Umar Amanat

@Umar, ancak bazı durumlarda örnek sayısı çok fazla. Bizim durumumuzda olduğu gibi 99.000 numunemiz var. Bir parti boyutu 8 ve epochs 20 seçersek, toplam step_size sayısı (20 * 99000) / 8 = 247,500 olur. Bu gerçekten yüksek bir sayı. orada bu yöntemden şüphe etmeye başladım.
Satyendra Sahani

8

Dönem: Bir eğitim dönemi, gradyanların hesaplanması ve optimizasyonları için tüm eğitim verilerinin tam kullanımını temsil eder (modeli eğitin).

Adım: Eğitim adımı, modeli eğitmek için tek bir toplu eğitim verisinin kullanılması anlamına gelir.

Dönem başına eğitim adımı sayısı: total_number_of_training_examples/ batch_size.

Toplam eğitim adımı sayısı: number_of_epochsx Number of training steps per epoch.


2

Henüz kabul edilen bir yanıt olmadığından: Varsayılan olarak bir dönem tüm eğitim verilerinizin üzerinde çalışır. Bu durumda n = Training_lenght / batch_size ile n adımınız olur.

Eğitim verileriniz çok büyükse, bir dönem sırasında adım sayısını sınırlamaya karar verebilirsiniz. [ Https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

Adım sayısı belirlediğiniz sınıra ulaştığında, süreç bir sonraki dönemden başlayarak baştan başlayacaktır. TF'de çalışırken, verileriniz genellikle ilk olarak eğitim için modele beslenecek bir grup listesine dönüştürülür. Her adımda bir parti işlersiniz.

1 dönem için 1000 adım mı yoksa 10 dönemle 100 adım mı ayarlamanın daha iyi olduğuna gelince, doğru bir yanıt olup olmadığını bilmiyorum. Ancak, TensorFlow zaman serisi veri eğitimlerini kullanarak her iki yaklaşımla bir CNN eğitmenin sonuçları aşağıda verilmiştir:

Bu durumda, her iki yaklaşım da çok benzer tahminlere yol açar, sadece eğitim profilleri farklılık gösterir.

adımlar = 20 / epochs = 100 görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

adımlar = 200 / epochs = 10

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.