여기에서는 공식 홈페이지에서 expert 버젼으로 소개하고 있는 Optimization, Training방식을 배워보도록 하겠습니다.
https://www.tensorflow.org/tutorials/quickstart/advanced?hl=en
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)
'Data Science > Tensorflow2.0, Pytorch' 카테고리의 다른 글
Learning Tensorflow) 1. 텐서플로의 기본 이해하기 (0) | 2020.04.05 |
---|---|
10. Tensorflow2.0 Evaluating & Predicting (0) | 2020.03.27 |
7. Tensorflow2.0 Optimization & Training (Keras) (0) | 2020.03.27 |
6. Tensorflow2.0 Optimization & Training (Beginner) (0) | 2020.03.25 |
5. Tensorflow2.0 Build Model (0) | 2020.03.25 |