텐서플로우가 2.0 버전으로 변경되면서 굉장히 많은것이 변경되었다. 1.0 버전대의 코드를 마이그레이트 하는게 굉장히 어렵다 할정도로?
그렇다보니 텐서보드를 사용하는 것도 변경되어 텐서보드 사용법에 대한 간단한 정의를 하고자 한다.
이는 tensorflow.org 페이지의 가이드를 통해 가져온 코드이다.
간단하게 정리하자면
학습 중에 로그를 남겨놓고 그 로그를 텐서보드에서 읽어오는 방식이다.
전체 코드는 여기서 확인하면 되겠다.
2가지의 예시가 있는데 핵심 코드만 보자면
1. Using TensorBoard with Keras Model.fit()
케라스의 모델을 사용한 학습에서의 텐서보드 사용법
...
log_dir = "logs\\fit\\"+ datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
# 윈도우 환경이라 \기호를 사용함. \를 사용해야 새로운 디렉토리를 만듦.
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
...
로그가 저장될 디렉토리의 위치를 지정해주는 log_dir 변수를 설정하고난뒤
텐서보드의 콜백 함수를 만들고 위에서 만든 log_dir 변수를 넣어준다. histogram_freq 변수는 몇번의 에폭(주기)에 기록을 할지 정하는 것이다. 만약 0으로 준다면 히스토그램은 계산되지 않는다.
그리고 마지막으로 model.fit() 함수의 마지막 아규먼트인 callbacks에 tensorboard_callback를 넣어주면 된다.
그리고 난뒤 터미널이나 cmd 창에서
(프로젝트 위치) > tensorboard --logdir=./logs/fit/
으로 텐서보드를 실행하면
이렇게 뜬다. warning이 뜨는데 이건 gpu가 없어서 그렇다. 넘어가도 된다.
이제 브라우저를 열고 http://localhost:6006 를 입력하게되면
이와 같은 페이지가 뜨게 된다.
화면 상단에 navigation tab을 보면 graph, distribution 등 다양한 측정방법을 제공해주고 있는것을 볼수 있다.
이것은 추가적으로 설정가능하다.
2. Using TensorBoard with other methods
다른 메서드를 사용한 텐서보드 사용법
...
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
train_log_dir = 'logs\\gradient_tape\\' + current_time + '\\train'
test_log_dir = 'logs\\gradient_tape\\' + current_time + '\\test'
train_summary_writer = tf.summary.create_file_writer(train_log_dir)
test_summary_writer = tf.summary.create_file_writer(test_log_dir)
model = create_model() # reset our model
EPOCHS = 5
for epoch in range(EPOCHS):
for (x_train, y_train) in train_dataset:
train_step(model, optimizer, x_train, y_train)
with train_summary_writer.as_default():
tf.summary.scalar('loss', train_loss.result(), step=epoch)
tf.summary.scalar('accuracy', train_accuracy.result(), step=epoch)
for (x_test, y_test) in test_dataset:
test_step(model, x_test, y_test)
with test_summary_writer.as_default():
tf.summary.scalar('loss', test_loss.result(), step=epoch)
tf.summary.scalar('accuracy', test_accuracy.result(), step=epoch)
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print (template.format(epoch+1,
train_loss.result(),
train_accuracy.result()*100,
test_loss.result(),
test_accuracy.result()*100)) # Reset metrics every epoch
train_loss.reset_states()
test_loss.reset_states()
train_accuracy.reset_states()
test_accuracy.reset_states()
...
여기서는 트레이닝과 테스트를 나눠 학습을 진행했고 이것을 텐서보드로 보고자 할때
첫번째 방법과 마찬가지로 로그를 남길 디렉토리의 위치를 변수로 입력하고
tf.summary.create_file_writer() 함수를 통해 로그파일을 생성해준다.
그리고 학습을 하면서
tf.summary.scalar('loss', train_loss.result(), step=epoch)
tf.summary.scalar('accuracy', train_accuracy.result(), step=epoch)
이와같이 스칼라 값을 기록하는데 아규먼트 순으로 name, data, step 이 되겠다.
name은 말 그대로 기록하는 data의 이름이고 data는 학습을 통한 결과값을 넣어준다.
step은 몇번째 스텝인지를 나타내고있다.
그리고 전체 코드를 다 돌리고 난뒤
(프로젝트 위치) > tensorboard --logdir=./logs/gradient_tape
를 통해 텐서보드를 실행하고 아까와 같이 http://localhost:6006를 입력해주게 되면
이런 결과값을 얻게 된다.
하지만 이 방법은 Scalar 값만 얻는 방법이다. 추가적인 측정방법은 다른 설정을 해줘야한다. 이후에 소개하도록 하겠다.
학습하는 데이터가 많게 되면 이것을 수치로만 봐서는 어떻게 학습이 되고 있는지 확인하기 굉장히 힘들다.
그럴때 이런 시각화 자료를 활용한다면 학습결과에 대해 얼마나 잘 되고 있는가 확인이 가능하다.
두가지 방법을 잘 활용하여 시각화자료로 잘 사용하시면 좋겠습니다~
'Bigdata, AI' 카테고리의 다른 글
ELK + kafka + spark 설치 및 연동 (0) | 2021.06.04 |
---|---|
머신러닝 모델 성능평가 (url) (0) | 2020.12.01 |
CNN 구조에 대한 설명 (url) (0) | 2020.11.30 |
딥러닝 활성화 함수 정리 (0) | 2020.11.23 |
공학에서 사용하는 문자, 기호 (0) | 2020.07.15 |
댓글