Data Science/Tensorflow2.0, Pytorch

8. Tensorflow2.0 Optimization & Training (Expert)

HJChung 2020. 3. 27. 19:19

여기에서는 공식 홈페이지에서 expert 버젼으로 소개하고 있는 Optimization, Training방식을 배워보도록 하겠습니다. 

https://www.tensorflow.org/tutorials/quickstart/advanced?hl=en

 

텐서플로 2.0 시작하기: 전문가용  |  TensorFlow Core

Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수 있습니다. 이 번역에 개선할 부분이 있다면 tensorflow/docs 깃헙 저장소로 풀 리퀘스트를 보내주시기 바랍니다. 문서 번역이나 리뷰에 참여하려면 docs-ko@tensorflow.org로 메일을 보내주시기 바랍니다. 이 문서는 구글 코랩(Colaboratory

www.tensorflow.org

1. Optimization

1) 모델을 optimization하기 전 설정해야 할 것들

1. Loss function

loss_func = tf.keras.losses.SparseCategoricalCrossentropy()

2. Optimization

optimizer = tf.keras.optimizers.Adam()

3. loss의 계산 결과값을 epoch마다 평균을 내서 보여주는 것을 추가할 수 있습니다.

평균을 내서 보여주는 이유는, 각 데이터마다 loss 변화가 엄청 날 텐데 평균을 내면 loss 선이 부드럽고 전반적인 변화 양상을 볼 수 있기 때문입니다.

#loss_func의 평균값을 내줄 함수 
train_loss = tf.keras.metrics.Mean(name = 'train_loss') #Mean: 평균을 낸다

4. Metrics

#평가를 위한 metrics 함수 
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name = 'train_accuracy')

test에도 마찬가지로 해줍니다. 

test_loss = tf.keras.metrics.Mean(name = 'test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name = 'test_accuracy')

 

2) 다 설정해 주었다면, model에 compile해 줍니다. 

beginner에서는 단순히 model.compile(~~~)로 해 주었는데

여기에서는 공식 홈페이지에서 expert 버젼에서는 이 단계에 해당하는 과정을 직접 코딩합니다. 

 

1. Training step

@tf.function: 기존 session을 열었던 것 처럼 바로 작동하지 않고,그래프만 만들고 학습이 시작되면 그때 돌아가도록 한 것

@tf.function

def train_step(images, labels):
	with tf.GradientTape() as tape: #GradientTape(): Gradient를 얻으면서 학습이 되게 하는 것
    	predictions = model(images) #predictions: 이미지를 모델에 넣어 예측한 결과값
		loss = loss_object(labels, predictions) #실제 정답(labels)와 예측값(predictions)을 비교한 것
        
    gradients = tape.gradient(loss, model.trainable_variables)#loss과 model.trainable_variables을 받으면 tape.gradient을 통해서 gradient를 받으면 
    #이를 optimizer에 적용 시킬 것이다. 
    optimizer.apply_gradeints(zip(gradients, model.trainable_variables))
    
    train_loss(loss) #하나씩 들어 갈 때마다 평균 값을 낼 수 있도록 train_loss에 넣어줌
    train_accuracy(labels, predictions) #그리고 accuracy를 계산 할 수 있음
    
        

2. Test step

@tf.function

def test_step(images, labels):
	#학습과정 필요 없음
    predictions = model(images)
    t_loss = loss_object(labels, predictions)
    
    test_loss(t_loss)#loss값 평균 내주기
    test_accuracy(labels, predictions) 
    

3. 이 과정을 반복 및 적용합니다. 

for epoch in range(10):
	for images, labels in train_ds:
    	train_step(images,labels) #train_ds에서 한 batch씩 나올 때마다 train_step을 시킬 것이다. 
        
    #한 epoch에서 train이 반복되고, 이게 다 끝나면 이제 test시작
    #다 끝나면 다음 epoch로 넘어가기
    
    for tesst_images, test_labels in test_ds:
    	test_step(test_images, test_labels)
        
    #한 epoch 끝날 때마다 출력할 텐데, 출력 form 만들어주기
    template = 'Eopch {}, Loss:{}, Accuracy:{}, Test Loss {}, Test Accuracy {}'
    
    print(template.format(epoch+1, train_loss.result(), train_accuracy.result() *100, 
    								test_loss.ressult(), tesst_accuracy.result() *100)