2022. 5. 6. 10:34ㆍSTUDY/Tensorflow
Tensorflow 내용을 기록하는 곳
tf.function이 뭐야?
tf 1.x 버전대에서는 그래프의 생성과 실행을 분리하고 값을 실행할때는 Session이라는 것을 열어서 값을 실행하는 형태였다. 이렇게 진행하다보니 값을 계산하고 싶을때마다 Session을 이용해서 실행을 해주어야만해서 프로그래밍 과정상에 불편함이 많았다.
따라서 tf 2.x 버전대에서는 Session을 삭제하고 바로 값을 실행할 수 있는 Eager Execution이라는 것이 적용되었다.
해당방법을 적용해서 값을 계산할때 별도의 Session을 열지 않고도 편리하게 진행할 수 있게 되었다.
그럼 왜 굳이 tf 1.x대에서는 저렇게 복잡하게 그래프의 생성과 실행을 분리했느냐라고 생각해 볼 수 있는데, 해당 형태가 성능상(=속도)의 이점이 있기 때문이다. (아닌경우도있음)
따라서 def 위에 @tf.fucnction annotation을 붙이면 마치 tf2.x 버전에서도 tf1.x 형태처럼 그래프 생성과 실행이 분리된 형태로 해당 함수내의 로직이 실행되게 된다. 따라서 상황에 따라서 성능이 약간 향상 될 수 있는데,(=실행 속도가 약간 빨라질 수 있다.) 다만 해당 annoation을 붙이면 tf1.x처럼 해당 함수내의 값을 바로 계산해볼수 없어서 디버깅이 불편해질수 있다. 따라서 모든 로직에 대한 프로그래밍이 끝난 상태에서 @tf.fuction을 붙이는 것이 좋다.
정리하면
1. @tf.fucntion annotation을 붙이면 tf1.x 스타일로 해당 함수내의 로직이 동작한다.
2. 따라서 상황에 따라 속도가 약간 빨라질 수 있다.
3. 다만 해당 annotation을 붙이면 값을 바로 계산해볼수 없어서 모든 로직에 대한 프로그래밍이 끝난 뒤에 붙이는 것이 좋다.
출처 : https://www.inflearn.com/questions/174459
tf.GradientTape() 가 뭐야?
tf 2.x 버전대에서 바로 값을 실행할 수 있는 즉시실행모드(Eager Execution)를 사용하면
자동미분을 하기위해 필요한 함수와 계산식의 연산과정과 입력값에 대한 정보가 없기때문에
자동미분을 할 수가 없게 됨
위 문제를 해결해주기 위해서 중간연산과정(함수, 연산)을 테이프(tape)에 기록해주는 GradientTape()를 사용