인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

윤재님의 프로필 이미지
윤재

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

회귀 Summary

텐서플로우 버전...

작성

·

378

0

안녕하세요, 선생님
다름이 아니라 같은 데이터와 파라미터를 가지고
model.fit() 을 사용했는데,
텐서플로우 v2에서는 Epoch 밑에 숫자가 1304로 나오고
텐서플로우 v1에서는 Epoch 밑에 숫자가 전체 데이터 수인 20862가 나옵니다.
 
또한 학습 시간도 v1이 훨씬 오래 걸립니다... 구글에 아무리 찾아봐도 궁금증이 풀리지 않아 질문 드립니다.
 
< 설정한 파라미터 >
전체 데이터 수 20,862
Batch_size 16
Epoch 50

답변 2

0

윤재님의 프로필 이미지
윤재
질문자

안녕하세요, 선생님

쉬시는 날 질문한 것 도 죄송한대,

 답변까지 상세하게 해주셔서 감사할 따름입니다.

 

좋은 주말 되시기 바랍니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까, 

Tensorflow v1은 이제 기억이 안나는군요. 하지만 힘을 짜내서 기억해보면, 

Tensorflow v1의 epoch 라는 개념은 Keras가 적용된 Tensorflow v2의 epoch 개념과 다릅니다.

Keras의 epoch는 batch size 기반으로 Gradient Descent를 적용하는 것을 전체 학습 데이터에 한번은 다 적용하면 그게 epoch 1회 입니다. 

가령 20000 개의 학습데이터가 있고, batch_size가 10이면 2000번 batch Gradient Descent를 하게 되니까,

만약 전체 epoch 횟수를 50으로 했으면

첫번째 epoch는 1/50

그리고 batch GD 는 1/2000, 2/2000,.... 순으로 2000번 반복합니다. 그런 20000개의 학습데이터다 일단은 다 batch GD에 한번씩 포함되어 계산되었습니다.  

그리고 두번째 epoch는 2/50

그리고 batch GD는 동일하게 1/2000, 2/2000,.... 순으로 2000번 반복합니다. 

이런식으로 epoch를 50회 반복합니다. 

따라서 epoch를 50회 설정하면 총 수행하는 batch GD는 50회(epoch) x 2000회(Batch GD횟수)가 되어 100,000번 수행 됩니다. 

 Tensorflow v1의 epoch는 위에서 설명드린 개념은 아닙니다. epoch라기 보다는 iteration(Batch GD 반복횟수)라고 보시면 됩니다.

그래서 학습 코드를 짤 때 max_iter( 또는 max_epochs)  = 100, 000 라고 설정하면 학습 데이터를 batch 사이즈 만큼 순차적으로 가져와서 batch GD를 100,000회 반복하게 됩니다. 

아래는 tensorflow 1.x 코드 입니다. max_epochs를 100,000회 설정하고, batch size가 10이라면  20,000개의 학습 데이터를 순차적으로 10개 만큼의 데이터만 추출하고 batch GD 수행하는 작업을 100,000회 수행합니다. 

그럼 10개씩 2000번 수행하면 20,000개 학습 데이터가 1회 학습이 끝납니다(즉 이 경우는 KERAS Epoch 1회에 해당합니다.) 이렇게 100,000 번 수행하게 되는 keras epoch 50회에 해당하는 학습이 완료 되게 됩니다. 

with tf.Session() as sess:

     sess.run(init)

     for epoch in range(max_epochs):

         batch_xs, batch_ys = mnist.train.next_batch(batch_size)

         sess.run(step, feed_dict = {x_in: batch_xs, y : batch_ys})

         if epoch % 1000 == 0:

             acc_train = sess.run(accuracy, feed_dict=

             {x_in: mnist.train.images,

              y: mnist.train.labels})

             print('Epoch: {0}  Accuracy Train%: {1}  '

                   .format(epoch,acc_train/600))

 

 

윤재님의 프로필 이미지
윤재

작성한 질문수

질문하기