작성
·
383
0
파이썬 초보자로서 with으로 시작되는 구문을 처음 보게 되어서, 구글링을 해보니 파일을 열 때 닫는 것을 잊지 않게 해주는 데 유용한 구문으로 보통 사용되는 것으로 보입니다.
그러나 파일 오픈이 아닌 텐서플로우에서 쓰이는 경우는 짐작할 수가 없습니다.
import tensorflow as tf 가
"텐서플로우 라이브러리를 임포트하되 앞으로 tensorflow 대신 간단하게 tf로 줄여서 쓰겠다"
를 의미하는 것처럼,
with tf.GradientTape() as tape 는
tf.GradientTape() 대신 tape로 줄여서 쓰겠다 라는 것을 의미하는 것입니까?
그렇다면 왜 tape.gradient(loss,[W,b]) 대신
tf.GradientTape().gradient(loss,[W,b]) 라고 치면 런타임 에러가 뜨는건지요?
그전에, tf.GradientTape()은 인풋이 없는 함수의 일종입니까? 아니면 다른 어떤 것입니까?(tf.square가 제곱해주는 함수인 것처럼 말입니다)
또한 그와 별개로 with 구문이 작동하는 방식 자체도 직관적으로 이해가 되지 않습니다.
tf.GradientTape() as tape를 with으로 선언했다면 tape라는 단어는 with 안에서만 쓰여야 하는게 아닌가요?
어떻게 with 과 동일한 들여쓰기 레벨을 가진
gradient=tape.gradient(loss,[W,b]) 과 같은 방식으로 유효하게 사용될 수 있는 것인가요?
답변 1
1
안녕하세요~. 반갑습니다.
with tf.GradientTape()을 이해하기 정확히 이해하기 위해서는 텐서플로의 autodiff(자동 미분 계산) 과정에 대한 이해가 필요합니다.
1. 우선 일차적으로 Python에서 with 구문은 말씀해주신 바가 맞습니다. (파일을 열고 닫는 등의 용도로 활용합니다.)
2. 텐서플로에서 with tf.GradientTape() as tape 구문은 해당 컨텍스트 내에서 계산된 연산들을 미분값 계산을 위한 tape에 기록 해놓게 됩니다.
3. 이렇게 tape에 기록해놓은 연산들을 다시 tape.gradient 함수를 이용해서 미분값을 역으로 계산하게 됩니다.
즉,
1. with tf.GradientTape() 구간에서는 각 연산들을 tape에 기록하고
2. 기록이 끝난 상태에서 with 구간을 벗어난 상태에서 tape.gradient 함수를 이용해서 역으로 미분값을 계산합니다.
autodiff에 대한 더 자세한 내용은 아래 내용들을 참조하세요.
1. https://www.tensorflow.org/guide/autodiff
2. https://rfriend.tistory.com/m/556?category=711317
실용적인 목적으로 tensorflow를 사용하시려는 상황이시라면 해당 코드구간은 그냥 하나의 관용적인 코드 패턴으로 인식해서 사용하시는 것을 추천드립니다~.
감사합니다.