1. Introduction

Lazy Evaluation 때문에 텐서플로 프로그램을 디버깅하는 것은 조금 까다롭다.
그래프에 에러가 있더라도, 그래프의 에러 부분이 실행되기 전까지는 알 수가 없다.
이 때문에 출력 결과를 바로바로 볼 수 있는 eager 모드가 개발 시 유용하게 쓰인다.

텐서플로 프로그램을 디버깅하는 것은 다른 소프트웨어와 크게 다르지 않다.

(1) 에러 메시지를 잘 봐야한다.

에러메시지는 stack trace(좌측 그림), error message(우측 그림)의 두 파트로 나뉘어진다.
좌측의 그림에서는 어디에서 에러가 발생했는지 알 수 있다.
이번의 경우에는 a와 c를 더하는 s에서 에러가 발생했다.

에러가 어디인지 파악이 됐으면 error message를 읽어 봐야 한다.
이번의 경우에는 더하는 두 텐서 간의 shape가 동일하지 않아 에러가 발생했다.

(2) 문제에서 메소드를 분리시킨다.

텐서플로 전체 프로그램과 데이터를 실행시키는 대신,
특정 부분에 대해서만 집중해서 문제를 해결한다.

(3) 가짜 데이터로 문제가 되는 메소드를 불러와서 확인해라.

(4) 이를 바탕으로 일반적인 문제해결은 어떻게 하는지 파악하라.

2. Shape Problems

Shape의 미스매치로 인한 오류는 가장 흔히 발생하는 유형 중 하나이다.

위의 예제도 shape가 맞지 않는 케이스이다.
어떤 shape이 맞을지는 코드의 목적에 따라 다르다.

위의 예제에서는 c = data[:, 1:3] 으로 변경해줌으로써 코드를 올바르게 수정하였다.

텐서플로에서 shape 에러는 배치 사이즈에 의해 발생할 수도 있습니다.
위의 예제에서는 input으로 (?, 3) 형태인 2차원 텐서가 들어가야 하는데
1차원 텐서를 넣었기 때문에 에러가 발생했습니다.
때문에 2차원 데이터로 변경을 해주어야 코드가 작동합니다.

이러한 shape 오류는 아래의 방법을 사용해서 해결할 수 있습니다.
(1) tf.reshape()
(2) tf.expand_dims()
(3) tf.slice()
(4) tf.squeeze

3. Fixing shape problems

(1) tf.reshape(tensor, shape, name=None)
: 입력된 텐서의 형태를 변형하는데 사용합니다.

(2) tf.expand_dims(input, dim, name=None)
: tf.expand_dims() 크기 1인 차원을 텐서의 구조(shape)에 삽입합니다.
이 때 차원 인덱스 dim은 0부터 시작합니다.

위의 예시를 보면 (3,2)의 모양을 가지는 2차원 텐서에 expanded_dim()의 인자를 0, 1, 2를
추가하면 각각 (1, 3, 2) , (3, 1, 2) , (3, 2, 1) 의 모양을 가지는 3차원 텐서가 된다.

(3) tf.slice(input_, begin, size, name=None)
: 이 함수는 텐서 input에서 begin 위치에서 시작해 크기 size인 부분을 추출합니다.

(4) tf.squeeze(input, squeeze_dims=None, name=None)
: 텐서에서 크기 1인 차원을 제거합니다.
input 텐서가 주어졌을 때, 이 함수는 그와 같은 자료형의 크기 1인 차원이 모두 제거된 텐서를 반환합니다.
만약 모든 크기 1인 차원을 제거하고 싶은 것이 아니라면, 제거하고 싶은 특정한 크기 1인 차원들을
squeeze_dims으로 지정할 수 있습니다.

4. Data Type Problems

위와 같은 코드를 실행하면 아래와 같은 오류 메시지를 보게된다.

a는 float 타입, b는 int 타입이라 데이터의 형이 다르기 때문에 연산하지 못해 오류가 발생하는 것이다.

이럴 때는 아래와 같이 tf.cast()를 이용해 데이터형 변환을 해주면 오류를 해결할 수 있다.

# 5. Debugging Full Programs
https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/courses/machine_learning/deepdive/03_tensorflow/debug_demo.ipynb

위 링크 노트북 실습

'구글 머신러닝 스터디잼(중급) > Introduction to TensorFlow' 카테고리의 다른 글

Estimator API  (0) 2019.11.01
TensorFlow 실습 1  (0) 2019.10.28
Tensor and Variable  (0) 2019.10.25
Graph and Session  (0) 2019.10.25
TensorFlow API Hierarchy  (0) 2019.10.25

+ Recent posts