tf.summary 사용을 TF 2.x로 마이그레이션

TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기 노트북 다운로드
import tensorflow as tf

TensorFlow 2.x에서는 큰 변화가 포함 tf.summary TensorBoard의 시각화에 대한 쓰기 요약 데이터에 사용되는 API를.

변경된 사항

그것은 생각하는 것이 유용 tf.summary 두 개의 하위의 API 등의 API :

TF 1.x에서

한 두 부분은 직접 서로 연결된다 -를 통해 요약 연산 출력을 인출하여 Session.run() 및 호출 FileWriter.add_summary(output, step) . v1.summary.merge_all() 연산은 모든 요약 연산 출력 응집 그래프 컬렉션을 사용하여이 쉬워하지만,이 방법은 여전히 특히 TF 2.x를 위해 부적당하게 열망 실행 및 제어 흐름에 대해 제대로 작동

TF 2.X에서

두 반쪽 긴밀하게 통합되어, 지금은 개인 tf.summary 실행될 때 작전은 (는) 즉시 데이터를 기록. 모델 코드에서 API를 사용하는 것은 여전히 ​​친숙해 보이지만 그래프 모드와 호환되는 상태를 유지하면서 즉시 실행에 친숙합니다. 하여 API 수단의 두 반쪽 통합 summary.FileWriter 이제 TensorFlow 실행 컨텍스트의 일부이며 직접 액세스됩니다 tf.summary 그래서 작가를 구성, 작전은 주요 부분 보이는 다른 점이다.

TF 2.x의 기본값인 즉시 실행을 사용한 사용 예:

writer = tf.summary.create_file_writer("/tmp/mylogs/eager")

with writer.as_default():
  for step in range(100):
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)
    writer.flush()
ls /tmp/mylogs/eager
events.out.tfevents.1633086727.kokoro-gcp-ubuntu-prod-1386032077.31590.0.v2

tf.function 그래프 실행의 사용 예:

writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")

@tf.function
def my_func(step):
  with writer.as_default():
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)

for step in tf.range(100, dtype=tf.int64):
  my_func(step)
  writer.flush()
ls /tmp/mylogs/tf_function
events.out.tfevents.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.1.v2

레거시 TF 1.x 그래프 실행의 사용 예:

g = tf.compat.v1.Graph()
with g.as_default():
  step = tf.Variable(0, dtype=tf.int64)
  step_update = step.assign_add(1)
  writer = tf.summary.create_file_writer("/tmp/mylogs/session")
  with writer.as_default():
    tf.summary.scalar("my_metric", 0.5, step=step)
  all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
  writer_flush = writer.flush()


with tf.compat.v1.Session(graph=g) as sess:
  sess.run([writer.init(), step.initializer])

  for i in range(100):
    sess.run(all_summary_ops)
    sess.run(step_update)
    sess.run(writer_flush)
ls /tmp/mylogs/session
events.out.tfevents.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.2.v2

코드 변환

기존의 변환 tf.summary 있도록 TF 2.x에서의 API를 사용하는 것은 신뢰성, 자동화 할 수 없습니다 tf_upgrade_v2 스크립트가 단지에 모두 다시 작성 tf.compat.v1.summary . TF 2.x로 마이그레이션하려면 다음과 같이 코드를 조정해야 합니다.

  1. 를 통해 기본 작가 세트 .as_default() 사용 요약 작전에 있어야합니다

    • 이것은 ops를 열심히 실행하거나 그래프 구성에서 ops를 사용하는 것을 의미합니다.
    • 기본 작성기가 없으면 요약 작업은 자동 작업 없음이 됩니다.
    • 기본 작가는 전역 (아직) 전파하지 않습니다 @tf.function 그들은 단지 기능을 추적 할 때 감지 - - 실행 경계 그래서 가장 좋은 방법은 호출하는 것입니다 writer.as_default() 함수 본문 내에서, 그리고 보장하기 위해 그 작가 객체 만큼 계속 존재 @tf.function 사용되고
  2. 은 "단계"값은 a를 통해 각 연산에 전달해야하는 step 인수

    • TensorBoard는 데이터를 시계열로 렌더링하려면 단계 값이 필요합니다.
    • TF 1.x의 전역 단계가 제거되었으므로 명시적 전달이 필요하므로 각 op는 읽을 원하는 단계 변수를 알아야 합니다.
    • 상용구를 줄이기 위해 기본 단계 값을 등록하는 실험적인 지원으로 사용할 수 있습니다 tf.summary.experimental.set_step() ,하지만이 예고없이 변경 될 수 있습니다 임시 기능입니다
  3. 개별 요약 작업의 기능 서명이 변경되었습니다.

    • 반환 값은 이제 부울입니다(요약이 실제로 작성되었는지 여부를 나타냄).
    • 두번째 매개 변수 이름은 (사용되는 경우)에서 변경된 tensordata
    • collections 파라미터는 제거되었다; 컬렉션은 TF 1.x 전용입니다.
    • family 매개 변수가 제거되었습니다; 단지 사용 tf.name_scope()
  4. [레거시 그래프 모드/세션 실행 사용자만 해당]

    • 첫 번째와 작가 초기화 v1.Session.run(writer.init())

    • 사용 v1.summary.all_v2_summary_ops() 을 통해 그것들을 실행하기 위해 예를 들어, 현재의 그래프에 대한 모든 TF 2.x를 요약 작전을 얻기 위해 Session.run()

    • 와 작가 세척 v1.Session.run(writer.flush()) 와 마찬가지로에 close()

당신의 TF 1.x의 코드 대신 사용하는 경우 tf.contrib.summary API를, 그래서 그것의 TF 2.x에서 API에 훨씬 더 유사 tf_upgrade_v2 스크립트가 어떤 사용에 대한 마이그레이션 단계의 대부분 (및 발광 경고 또는 오류를 자동화하는 것 수 없습니다 완전히 마이그레이션되어야 함). 대부분의 경우 그것은 단지에 대한 API 호출을 재 작성 tf.compat.v2.summary ; 당신은 단지 TF 2.x를과의 호환성을 필요로하는 경우에는 삭제할 수 있습니다 compat.v2 단지로 참조 tf.summary .

추가 팁

위의 중요한 영역 외에도 일부 보조 측면도 변경되었습니다.

  • 조건부 기록(예: "100단계마다 기록")이 새로운 모양으로 변경되었습니다.

    • 제어 작전 및 관련 코드 (열망 모드와 작동하는 일반 if 문에서 그들을 포장 @tf.function 사인을 통해 ) 또는 tf.cond
    • 단지 요약을 제어하기 위해, 새로운 사용 tf.summary.record_if() 컨텍스트 매니저를, 그리고 당신의 선택의 부울 조건을 통과
    • 다음은 TF 1.x 패턴을 대체합니다.

      if condition:
        writer.add_summary()
      
  • 의 직접적인 작성하지 tf.compat.v1.Graph - 대신 사용 추적 기능

  • 에 들어 LogDir 당 더 이상 세계 작가 캐싱하지 tf.summary.FileWriterCache

    • (후자는 대한 TensorBoard 지원을 사용자 중 작가 객체의 공유 / 자신의 캐싱을 구현하거나 별도의 작가를 사용해야 진행 )
  • 이벤트 파일 바이너리 표현이 변경되었습니다.

    • TensorBoard 1.x는 이미 새로운 형식을 지원합니다. 이 차이는 이벤트 파일에서 요약 데이터를 수동으로 구문 분석하는 사용자에게만 영향을 줍니다.
    • 요약 데이터는 이제 텐서 바이트로 저장됩니다. 당신이 사용할 수있는 tf.make_ndarray(event.summary.value[0].tensor) NumPy와로 변환