저번 게시글에 이어진 글입니다.
저번 게시글에서는 tf.function 데코레이터의 정확한 역할을 이해하지 못하고 포스팅을 마쳤는데요, 조금 더 찾아보니 성능 개선 & 이식성 개선을 위해서 만들어졌다고 합니다! 정확히 구현되는 매커니즘은 모르겠으나, TF 1.*에서 session.run()을 필두로 output을 구했던 것과 달리 위를 함수화하여 tf.function 데코레이터로 감싸주면 자동으로 이를 그래프로 인식하도록 한다고 합니다. 밥상을 다 차려놓고 한번에 먹는다는 개념(ver 1.*)에서 각각 그릇에 담아놓고 옮겨 담기 편하고, 이동하기 편하게 만들어 먹는 개념(ver 2.*)으로 바뀐 느낌이랄까요. 사실 정확히 이해는 하지 못했지만 이게 중요한 거라면 어차피 언젠간 또 만날 테니까요! 그때 다시 살펴볼 수 있으면 좋겠습니다. 관련해서 살펴볼 수 있도록 링크를 걸어 놓겠습니다.
Link - https://www.tensorflow.org/guide/effective_tf2?hl=ko
이후, 아래에 보면 with tf.GradientTape() as tape: 가 나옵니다. 이는 자동 미분을 '기록'하고 '관찰'하기 위한 것으로, 이 경우 단순히 back propagation만 되는게 아니라 중간에 등장한 변수들에 대한 gradient를 모두 쉽게 구할 수 있습니다. 또한 단순히 일계미분값 뿐만이 아니라 헤시안 등 고계미분값 또한 구해낼 수 있습니다.(물론 계산량이 허락한다면요....)
그래서 이를 활용해서 trainable variable들의 gradient를 모두 구하고, 이를 optimizer에 있는 apply_gradients라는 메소드를 사용해서 최적화합니다. optimizer의 경우 위에서 adam optimizer를 사용한다고 정의해 주었고(여기에는 따로 사진을 첨부하지 않았지만 실제 코드를 보면 정의되어 있습니다.), apply_gradients는 TF 2.0 내장 메소드겠죠. train_loss와 accuracy에 대해서는 위에서 metric을 지정해 주었습니다.
이렇게 train_step이라는 함수가 생성되었고, 이를 @tf.function이라는 데코레이터로 감싸주어 이 자체로 그래프처럼 인식할 수 있도록 해주었습니다.
이제 최종적으로 결과를 볼 시간입니다.
에폭은 5번으로 주었고, 총 1만개의 데이터를 각각 32개의 batch로 나누어 실행시켰습니다.
결과값 자체는 beginner용에서와 차이가 크게 없지만 세부적으로 customizing할 수 있는 부분들이 추가되었다는 데에 의의가 있는 것 같습니다.
추가로 공부해 볼 부분을 생각해보자면:
1. @tf.function의 역할에 대해서 확실히 알아보기
2. train_loss와 train_accuracy 등 keras 하위 메소드들의 활용법 확실히 숙지하기
3. (2번의 연장선으로) dataset 활용법 숙지하기
정도가 되지 않을까 싶네요!
원리는 알고 있으니까 코드 사용에만 익숙해지면 되는데 이건 직접 오류를 겪어보면서 짜야 확실히 익숙해질 텐데 말이죠.. 이제 그동안 만들었던 코드들을 tf 2.0 버전으로 업데이트하면서 손으로 만져보면 좋을 것 같아요!
이해를 위해서는 역시 TF 사이트에 가면 튜토리얼이 친절히 나와있으니까, 가서 읽어보는 것을 추천드립니다.
마지막으로 advanced tutorial 수정 버전을 git에 올리고 마치겠습니다.
딱히 원본과 크게 차이는 없지만 그래도 한 번 살펴본 것에, 그리고 기록하는 데에도 의미가 있으니까요.
다음 싸이랩으로 찾아뵙겠습니다 ㅎㅎ!
Git Link - https://github.com/Eternity402/Cylab-Diary/blob/master/CD02_TF2.0_Advanced.ipynb
댓글 없음:
댓글 쓰기