:: ai/tensorflow

tensorflow :: 텐서플로우 session, placeholder (v1 -> v2 코드 업그레이드 2)

토람이 2022. 3. 7. 19:08

session

tensorflow 에서 session 이란,

정의한 노드 및 연산 그래프를 실행할 수 있는 환경을 제공해주는 클래스이다.

연산을 실행하기 위한 리소스를 할당하고 중간 결과 및 변수값을 저장하는 역할을 한다.

 

세션은 보통 다음과 같은 순서로 활용된다.

1) 연산 그래프를 정의한다.

2) 이 그래프를 실행할 세션을 정의한다.

3) 세션을 실행한다. (tf.Session.run)

4) 세션을 종료한다. (tf.Session.close)

 

 

tensorflow v2.0 으로 넘어가면서 이 Session 의 개념이 사라졌다.

아마 버전이 바뀌면서 가장 큰 변화 중 하나가 이 부분일 것이다.

(* 이전 포스팅 참고: https://toramko.tistory.com/entry/tensorflow-%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C%EC%9A%B0-v11x-v22x-%EC%B0%A8%EC%9D%B4-%EB%B0%8F-%EB%B2%84%EC%A0%84-%EC%97%85%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C)

 

그래서 v2.0 환경에서 기존처럼 Session 을 선언할 경우 다음과 같이 에러가 발생한다.

session = tf.Session()

# AttributeError: module 'tensorflow' has no attribute 'Session'

 

global_variables_initializer

모델을 학습 시킬 때 변수(Variables)를 사용하는데, 
모델의 연산을 시작하기 전 이 변수들을 반드시 명시적으로 초기화 해주어야 한다.
모든 변수를 한 번에 초기화하는 연산이 바로 global_variables_initializer 이다.

 

이 연산 또한 v2.0 에서는 사라지게 되었다.

session.run(tf.global_variables_initializer())

# AttributeError: module 'tensorflow' has no attribute 'global_variables_initializer'

 

placeholder

placeholder 는 tensorflow 가 연산을 실행할 때 값을 넣는 공간이다.
말 그대로 '공간을 가지고(hold) 있는 기능'을 하는데,
입력될 값의 타입과 size 를 미리 정의해두면 후에 연산 과정에서 쓰이게 된다.

 

placeholder 역시 v2.0 에서는 사라지게 되었다.

tf.placeholder(dtype=tf.float32, shape=(2))

# AttributeError: module 'tensorflow' has no attribute 'placeholder'

 

placeholder_with_default

output 값이 지정(feed)되지 않은 경우

input(default) 값을 그대로 내보내는 placeholder 이다.

 

placeholder 가 사라졌으니 이 또한 v2.0 에서 사라졌다.

tf.placeholder_with_default(False, shape=())

# AttributeError: module 'tensorflow' has no attribute 'placeholder_with_default'

 

 

코드 버전업: v1.0 코드 그대로 사용

v2.0 으로 가면서 유사한 기능을 갖도록 코드가 변경되거나 rename 된 함수들이 있다.

그러나 위에 언급한 session 이나 placeholder 와 같은 기능들은 사라지게 되어

v2.0 에 맞는 코드로 변환하는 것은 어려워 보인다.

 

이런 경우 앞선 포스팅에 언급한 것처럼 compat 모듈을 사용하여 v2.0 기능을 끄도록 설정,

v1.0 코드를 기존 그대로 사용하는 방식을 택해야 할 듯하다.

 

import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()

상단에 위와 같이 선언해두면 기존 코드를 그대로 사용 가능하다.

300x250