대부분의 모델에는 데이터에 대해 실행할 단계 수를 나타내는 단계 매개 변수가 있습니다 . 그러나 대부분의 실제 사용에서 우리는 또한 fit 함수 N epochs를 실행합니다 .
1 Epoch로 1000 보를 실행하는 것과 Epoch 10 개로 100 보를 실행하는 것의 차이점은 무엇입니까? 실제로 어느 것이 더 낫습니까? 연속적인 시대 사이에 논리가 변경됩니까? 데이터 셔플?
대부분의 모델에는 데이터에 대해 실행할 단계 수를 나타내는 단계 매개 변수가 있습니다 . 그러나 대부분의 실제 사용에서 우리는 또한 fit 함수 N epochs를 실행합니다 .
1 Epoch로 1000 보를 실행하는 것과 Epoch 10 개로 100 보를 실행하는 것의 차이점은 무엇입니까? 실제로 어느 것이 더 낫습니까? 연속적인 시대 사이에 논리가 변경됩니까? 데이터 셔플?
답변:
에포크는 일반적으로 모든 훈련 데이터에 대해 한 번의 반복을 의미합니다. 예를 들어 이미지가 20,000 개이고 배치 크기가 100이면 epoch에는 20,000 / 100 = 200 단계가 포함되어야합니다. 그러나 나는 일반적으로 훨씬 더 큰 데이터 세트를 가지고 있음에도 불구하고 epoch 당 1000과 같은 고정 된 수의 단계를 설정했습니다. 시대가 끝날 때 평균 비용을 확인하고 개선되면 체크 포인트를 저장합니다. 한 시대에서 다른 시대로의 단계에는 차이가 없습니다. 나는 그것들을 체크 포인트로 취급합니다.
사람들은 종종 시대 사이에 데이터 세트를 뒤섞습니다. 저는 random.sample 함수를 사용하여 시대에서 처리 할 데이터를 선택하는 것을 선호합니다. 32 개의 배치 크기로 1000 단계를 수행하고 싶다고 가정 해 보겠습니다. 훈련 데이터 풀에서 32,000 개의 샘플을 무작위로 선택하겠습니다.
훈련 단계는 하나의 그래디언트 업데이트입니다. 한 단계 batch_size에서 많은 예제가 처리됩니다.
에포크는 훈련 데이터를 통한 하나의 전체 주기로 구성됩니다. 이것은 일반적으로 많은 단계입니다. 예를 들어 2,000 개의 이미지가 있고 10 개의 배치 크기를 사용하는 경우 한 시대는 2,000 개의 이미지 / (10 개의 이미지 / 단계) = 200 단계로 구성됩니다.
훈련 이미지를 각 단계에서 무작위로 (독립적으로) 선택하면 일반적으로 epoch라고 부르지 않습니다. [이것은 내 답변이 이전 답변과 다른 부분입니다. 내 의견도 참조하십시오.]
현재 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_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 )를 의미하며 이것은 estimator.train
steps 매개 변수가 200,000으로 설정되었지만 정확히 단계 수입니다 estimator.train(input_fn=train_input, steps=200000)
.
에 의해 정의 된 훈련 단계 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)
댓글 : 1000 걸음 후에 훈련 중지를 num_epochs=1
호출 할 때 설정했지만 numpy_input_fn
. steps=1000
in 이 in을 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
정의, 하한을 통해 실행됩니다 단계의 수를 결정합니다.
간단히 말해서
Epoch : Epoch는 전체 데이터 세트에서 1 회 통과 횟수로 간주됩니다
. 단계 : tensorflow에서 1 단계는 세대 수에 예제를 곱한 횟수를 배치 크기로 나눈 값으로 간주됩니다.
steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
아직 수락 된 답변이 없기 때문에 : 기본적으로 모든 학습 데이터에 대해 한 시대가 실행됩니다. 이 경우 n = Training_lenght / batch_size 인 n 단계가 있습니다.
훈련 데이터가 너무 크면 한 시대에 단계 수를 제한 할 수 있습니다. [ https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]
단계 수가 설정 한 한계에 도달하면 프로세스가 다시 시작되어 다음 세대가 시작됩니다. TF에서 작업 할 때 데이터는 일반적으로 학습을 위해 모델에 공급 될 배치 목록으로 먼저 변환됩니다. 각 단계에서 하나의 배치를 처리합니다.
1 epoch에 1000 단계를 설정하는 것이 더 좋은지 아니면 10 epoch에 100 단계를 설정하는 것이 더 좋은지에 대해서는 정답이 있는지 모르겠습니다. 그러나 다음은 TensorFlow timeseries 데이터 가이드를 사용하는 두 가지 접근 방식으로 CNN을 학습 한 결과입니다.
이 경우 두 가지 접근 방식 모두 매우 유사한 예측으로 이어지며 훈련 프로필 만 다릅니다.
단계 = 200 / 에포크 = 10