TensorFlow.org에서 보기 | Google Colab에서 실행 | GitHub에서 소스 보기 | 노트북 다운로드 |
import tensorflow as tf
TensorFlow 2.x에서는 큰 변화가 포함 tf.summary
TensorBoard의 시각화에 대한 쓰기 요약 데이터에 사용되는 API를.
변경된 사항
그것은 생각하는 것이 유용 tf.summary
두 개의 하위의 API 등의 API :
- 기록 개인의 요약을위한 작전의 세트 -
summary.scalar()
,summary.histogram()
,summary.image()
,summary.audio()
, 및summary.text()
- 모델 코드에서 인라인라고한다. - 이러한 개별 요약을 수집하고 특별히 형식이 지정된 로그 파일(텐서보드가 시각화를 생성하기 위해 읽음)에 기록하는 로직 작성.
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로 마이그레이션하려면 다음과 같이 코드를 조정해야 합니다.
를 통해 기본 작가 세트
.as_default()
사용 요약 작전에 있어야합니다- 이것은 ops를 열심히 실행하거나 그래프 구성에서 ops를 사용하는 것을 의미합니다.
- 기본 작성기가 없으면 요약 작업은 자동 작업 없음이 됩니다.
- 기본 작가는 전역 (아직) 전파하지 않습니다
@tf.function
그들은 단지 기능을 추적 할 때 감지 - - 실행 경계 그래서 가장 좋은 방법은 호출하는 것입니다writer.as_default()
함수 본문 내에서, 그리고 보장하기 위해 그 작가 객체 만큼 계속 존재@tf.function
사용되고
은 "단계"값은 a를 통해 각 연산에 전달해야하는
step
인수- TensorBoard는 데이터를 시계열로 렌더링하려면 단계 값이 필요합니다.
- TF 1.x의 전역 단계가 제거되었으므로 명시적 전달이 필요하므로 각 op는 읽을 원하는 단계 변수를 알아야 합니다.
- 상용구를 줄이기 위해 기본 단계 값을 등록하는 실험적인 지원으로 사용할 수 있습니다
tf.summary.experimental.set_step()
,하지만이 예고없이 변경 될 수 있습니다 임시 기능입니다
개별 요약 작업의 기능 서명이 변경되었습니다.
- 반환 값은 이제 부울입니다(요약이 실제로 작성되었는지 여부를 나타냄).
- 두번째 매개 변수 이름은 (사용되는 경우)에서 변경된
tensor
에data
-
collections
파라미터는 제거되었다; 컬렉션은 TF 1.x 전용입니다. -
family
매개 변수가 제거되었습니다; 단지 사용tf.name_scope()
[레거시 그래프 모드/세션 실행 사용자만 해당]
첫 번째와 작가 초기화
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()
- 제어 작전 및 관련 코드 (열망 모드와 작동하는 일반 if 문에서 그들을 포장
의 직접적인 작성하지
tf.compat.v1.Graph
- 대신 사용 추적 기능- TF 2.x를 사용하는의 그래프 실행
@tf.function
대신 명시 적 그래프의 - TF 2.x에서, 새로운 추적 스타일의 API를 사용
tf.summary.trace_on()
와tf.summary.trace_export()
실행 함수 그래프를 기록하는
- TF 2.x를 사용하는의 그래프 실행
에 들어 LogDir 당 더 이상 세계 작가 캐싱하지
tf.summary.FileWriterCache
- (후자는 대한 TensorBoard 지원을 사용자 중 작가 객체의 공유 / 자신의 캐싱을 구현하거나 별도의 작가를 사용해야 진행 )
이벤트 파일 바이너리 표현이 변경되었습니다.
- TensorBoard 1.x는 이미 새로운 형식을 지원합니다. 이 차이는 이벤트 파일에서 요약 데이터를 수동으로 구문 분석하는 사용자에게만 영향을 줍니다.
- 요약 데이터는 이제 텐서 바이트로 저장됩니다. 당신이 사용할 수있는
tf.make_ndarray(event.summary.value[0].tensor)
NumPy와로 변환