1. Estimator API

Estimaotor API는 앞서 학습한 텐서플로의 API에서 상위 레벨의 한 부분이다.

Estimator API를 사용하면 매번 코드를 일일이 입력하지 않고도,
위의 도표에 있는 다양한 이점을 활용할 수 있다.

텐서플로는 직접 바로 실행해볼 수 있는 pre-made estimator들을 활용할 수 있다.

2. Pre-made Estimators

예시를 들어 부동산의 가격을 예측을 하려고 하자.
이 때 우리는 먼저 피처를 선택해야 한다.
이번 예시에서는 집의 면적과 종류를 피처로 사용.

먼저 피처를 정하기 위해 feature_column API를 사용할 수 있다.
이번 예시에서는 numeric column과 categorical column이 하나씩 사용되었다.

그 후에는 모델을 선택하는데 이번 예시에서는 linear regressor가 선택되었다.

선형회귀모델은 데이터의 벡터를 인풋으로 받아들이고, 이 인풋들에 대한 가중치를 조절해나가면서
아웃풋으로 예측 숫자(부동산 가격)을 예측한다.

이번 예시에서는 numeric과 categorical 만을 사용했지만 embedding, crossed 등 더 다양한 형태의 컬럼이 API로 존재한다.

그 후에는 모델에 input 데이터를 넣어, 모델을 학습시킨다.
이번 예제에서는 데이터셋에 대해 100번 반복해서 학습을 한다.

이 후에는 인풋 데이터와는 다른 데이터를 집어넣어 결과를 예측한다.

다른 pre-made estimator를 사용하려면 위와 같이
클래스을 변경하고 그에 따른 적절한 파라미터만 적용해주면 된다.

아래는 위의 예시를 반복해서 실행해본 내용

3. Checkpoint

체크포인트는 위와 같이 학습의 지속, 실패로부터의 재개, 학습된 모델로부터의 예측 등을 위해 유용하게 사용된다.

위와 같이 모델을 정의할 때 어디에 체크포인트를 저장할지 경로를 지정해주면 된다.

그 후에는 위와 같이 다시 불러와서 저장된 학습된 모델을 가지고 예측을 수행할 수 있다.

그리고 위와 같이 학습된 데이터를 불러와서 학습을 마저 재개할 수도 있다.
만약 다시 처음부터 다시 학습을 재개하고 싶다면 이 폴더를 삭제하면 된다.
최근의 체크포인트로부터 시작하는 것이 디폴트이기 때문에 학습을 처음부터 다시 수행시키고 싶다면
체크포인트를 반드시 삭제해야한다.

4. Training on in-memory datasets

데이터셋이 numpy array이거나 pandas 이면 Estimator API는
데이터를 입력하는데 편리한 함수를 가지고 있다.
estimator.inputs.numpy_input_fn(),estimator.inputs.numpy_input_fn()
위의 예시처럼 피처가 될 x와 레이블이 될 y를 지정해주면 된다.

이 함수들은 뉴럴 네트워크모델 학습에 키가 되는 몇몇 기능들을 가지고 있다.
먼저 배치 사이즈를 조절할 수 있다.
→) 전체 데이터셋을 한번에 학습하는 것보다 데이터의 미니 배치를 단계별로 학습하는 것이 통상 좋다.
그리고 데이터 셋을 몇번 반복할 것인지 에포크 숫자를 조절함으로써 세팅할 수 있다.
데이터를 무작위로 섞기도 가능하며, 복제된 데이터셋의 크기 또한 조절이 가능하다.

기본적으로 학습은 데이터가 소진되거나 정의한 n 에포크에 도달할 때까지 진행된다.
그리고 학습 함수를 호출할 때, step수를 지정해줌으로써 더 진행할 수도 있다.
위의 예시에서는 마지막 체크포인트에서부터 1000번의 학습스텝을 더 진행한다.
그리고 max_steps에서 지정한 수에 도달하면 학습을 멈추게 할 수도 있다.
(하지만 체크포인트가 이미 그 지점까지 와있다면 별 영향이 없다.)

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

Debugging TensorFlow Programs  (0) 2019.10.29
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

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

Getting Started with TensorFlow (구글퀵랩 실습)

아래와 같이 텐서플로를 불러오고, 버전을 확인합니다.
그리고 뒤의 실습을 위해 넘파이도 같이 불러 옵니다.

(1) 두 개의 tensor를 add하기(더하기)

텐서플로 코드를 이용하기 전에, 입력한 결과를 즉시 볼 수 있는 넘파이를 먼저 사용해보겠습니다.

이와 동일한 결과를 내기 위한 텐서플로 코드는 두 단계로 이루어집니다.

Step(1) : 그래프 만들기(Build the Graph)

위의 코드에서 c는 (3,)형태의 int32 속성을 가진 tensor를 반환하는 연산을 나타냅니다.
(넘파이와는 달리 print(c)를 실행한다고 해서 값이 합쳐진 [8, 2, 10] 의 결과가 나오지 않습니다.)

Step(2) : 그래프를 실행하기(Run the Graph)

(2) feed_dict를 사용하기

같은 그래프 이지만, 그래프를 만드는 단계에서 입력값을 하드코딩 하지 않고 placeholder를 사용합니다.

(3) TensorFlow로 Heron's Formula 구현하기

Heron's Formula에서는 삼각형의 세 변(a,b,c)이 주어지고 s=(a+b+c)/2 라 할 때,
삼각형의 면적을 ( s * (s-a) * (s-b) * (s-c) ) ^(1/2) 로 구합니다.

(4) Placeholder 와 feed_dict

텐서플로에서 프로그램 입력값을 placeholder로 정의하고,
세션 실행시 실제 값을 feed_dict를 이용해서 넣어주는 것은 흔한 방식입니다.
(3)번 예제에서 사용했던 코드에서는 area 그래프에서 입력 값이 값으로 바로 하드코딩 되있지만,
아래의 코드에서는 placeholder로 정의한 다음 run-time에서 입력값이 들어갑니다.

(5) tf.eager

tf.eager는 build-then-run 단계를 건너뛰게 해줍니다.
하지만 lazy evaluation의 패러다임 하에서 텐서플로가 멀티디바이스 지원, 활용이 가능하기 때문에
많은 생산코드들은 lazy evaluation을 사용하고 있습니다.

tf.eager는 프로그램의 문제점들을 수정해나갈 때 많이 사용하며,
tf.eager를 통해서 개발한 다음 eager 실행을 주석처리하고, 세션 관리코드를 추가해야 합니다.

다음의 eager모드를 실행하기 위해서는 노트북의 런타임을 재시작해야 합니다.

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

Estimator API  (0) 2019.11.01
Debugging TensorFlow Programs  (0) 2019.10.29
Tensor and Variable  (0) 2019.10.25
Graph and Session  (0) 2019.10.25
TensorFlow API Hierarchy  (0) 2019.10.25

1. Tensors

  • Tensor(텐서)는 데이터의 n차원 배열을 말한다.

위의 그림과 같이 0차원부터 3차원까지 리스트를 이용해서 텐서를 구성할 수 있고,
n차원의 텐서 또한 위와 같이 텐서를 쌓음으로써(stack) 쉽게 구성할 수 있다.

저차원의 텐서를 쌓아 고차원의 텐서를 만들 수 있고, 반대로 고차원의 텐서에서 저차원의 텐서를 뽑아낼 수도 있다.
위의 예시에서 x는 (2,3)의 모양을 가진 2차원 텐서이다.
y는 x를 슬라이싱한 결과로 1차원 텐서가 되었다.

위의 예시처럼 텐서 안에 데이터를 가지고 있으면, 그것을 이용해 텐서를 변형(reshape)할 수 있다.
처음 예시는 (2,3)형태의 2차원 텐서를 (3,2)형태의 2차원 텐서로 변형한 것이고,
두 번째 예시는 첫번째 예시 결과에서 2번째 행만 불러오도록 슬라이싱되어 1차원 텐서가 되었다.

2. Variables

  • Variable(변수) : 프로그램이 실행될 때 값이 초기화되면서 계속 바뀌는 텐서를 말한다.
    변수는 신경망에서 bias 및 weight에 사용된다.

위의 예시 주요 설명

(1) 변수는 get_variable( )을 이용해서 생성한다.

  • tf.variable( )을 사용할 수도 있지만 tf.get_variable( )이 변수의 재사용 및 다양한 환경에 따라 만들기가 용이하기 때문
  • 예시에서는 변수는 weights란 이름을 가지고 있고, shape는 (1,2)
  • 이번 설명에서는 생략했지만 변수는 scope를 설정할 수 있다.
    (여기에서 변수를 재생성하지 않고, 재사용하는 것이 나옴)

(2) 변수를 만들 때 어떻게 초기화할지 설정해야 한다.

  • 신경망에서는 random normal 하게 초기화하는 것이 보통이다.

(3) 그래프를 형성했다면 변수를 다른 텐서처럼 사용해라.

(4) 세션에서는 모든 변수를 초기화 해라

  • global_variables_initializer() 를 호출 전의 그래프의 상태는 각 노드에 값이 아직 없는 상태를 의미
  • 따라서 해당 함수를 사용해주어야 Variable 의 값이 할당 되는 것이고 텐서의 그래프로써의 효력이 발생

(5) 모든 변수가 초기화 되고 나면, 원하는 어떤 텐서든 evaluate할 수 있다.

위의 예시에서는 train_loop를 상수인 텐서 x와 함께 불러왔다.
하지만 이게 현실적인가? 프로그램에 인풋값을 하드코딩하는가?
이 때 placeholder를 사용할 수 있다.

3. Placeholder

  • Placeholder : 텍스트 파일을 읽어들이는 것처럼 값을 그래프에 넣어주는 것

데이터를 입력받는 비어있는 변수라고 생각할 수 있다. 먼저 그래프를 구성하고, 그 그래프가 실행되는 시점에 입력 데이터를 넣어주는 데 사용한다.
(출처: https://excelsior-cjh.tistory.com/151)

tf.placeholder 함수는 입력으로 사용할 데이터의 타입만 지정해주고,
나중에 세션에서 실행될때 실제값은 딕셔너리 형태로 입력해준다.

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

Debugging TensorFlow Programs  (0) 2019.10.29
TensorFlow 실습 1  (0) 2019.10.28
Graph and Session  (0) 2019.10.25
TensorFlow API Hierarchy  (0) 2019.10.25
What is TensorFlow?  (0) 2019.10.25

1. Graph and Session

텐서플로에서의 DAG(Directed Acyclic Graph)는 다른 그래프들과 동일하게 edge와 node로 구성되어 있다.

(결국, 데이터와 데이터에 대한 연산으로 DAG가 이루어져있다.)

- edge : 데이터(즉, 텐서)

- node : 텐서들에 대한 연산작업

텐서플로는 그래프의 처리, 컴파일, DAG의 중간에 삽입, 수신 등을 할 수 있다.

그리고 DAG의 다른 부분을 다른 디바이스(CPU, GPU, TPU 뿐만 아니라 다른 기기까지)에 할당할 수 있다.

(다른 다바이스들간의 커뮤니케이션과 조정을 수행)

session 클래스는 우리가 사용하는 파이썬 프로그램과 C++ 런타임을 연결해주는 역할을 한다.

텐서플로 그래프를 실행하기 위해서는 세션에서 런을 호출해야 한다.
위의 예시에서는 x와 y라는 1차원 텐서를 정의했고,
z라는 텐서는 tf.add(x,y) (x와 y의 합)의 결과를 말한다.

이것을 evaluate하기 위해 z에 대해 session.run을 호출한다.
위의 예시에서는 파이썬의 with 구문을 통해 세션이 완료되었을 때 자동적으로 종료되게끔 한다.

2. Evaluating a Tensor

z를 evaluate 하기 위해서는 session.run(z) 을 기본적으로 사용하지만
z.eval() 을 사용할 수도 있다.

session.run()을 사용할 때 우리는 텐서의 리스트를 사용할 수도 있다.
그리고 tf.add(x,y) , tf.multiply(x,y) 대신 x+y 와 x*y 같이 간단히 적을 수 있다.

텐서플로에서는 원래 만들어진 그대로 lazy evaluation을 사용하는 것이 권장사항이다.
하지만 개발, 디버깅 등의 작업을 할 때는 즉시 결과를 볼 수 있는 eager mode를 사용하는 것이 편하다.

위와 같이 tf.eager를 불러온 다음 eager execution이 가능하게 하면
session.run 을 수행하지 않고도 즉시 결과를 볼 수 있다.
(하지만 강의에선 이런거는 검증이 끝나면 다시 lazy하게 돌아가는 것을 권장함)

3. Visualizing a graph

지금까지는 그래프를 어떻게 작성하고, 실행하는지 보았습니다.
그래프를 시각화한다거나, 데이터가 흘러 들어가서 어떻게 작동하는지 보고 싶을 때,
뉴런 네트워크 구조를 시각화 하고 싶을 때 어떻게 해야하는지 ??

그래프를 시각화하기 위해서는 tf.Summary.FileWriter("원하는 폴더명", sess.graph) 를 사용하면 된다.
그리고 이 때 정의한 텐서에 name을 지정해주어야 한다.
(그렇지 않으면 Ad_7 등과 같이 자동 생성된 이름이 나와서 파악하기가 어렵다.)
하지만 이것만 실행했을 때 폴더 안의 graph는 binary 값으로 되있기 때문에 우리가 읽을 수 있는 형태가 아니다.

우리가 읽기 위해서는 TensorBoard 라는 프로그램을 사용해야 한다.
아래는 텐서보드를 실행하는 코드이다.(google.datalab.ml을 따로 설치해야 실행이 되는것 같음)

위를 실행해서 나오는 페이지로 가면 아래와 같은 그림을 볼 수 있다.

※ 구글 클라우드셸에서 텐서보드 실행하는 법

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

TensorFlow 실습 1  (0) 2019.10.28
Tensor and Variable  (0) 2019.10.25
TensorFlow API Hierarchy  (0) 2019.10.25
What is TensorFlow?  (0) 2019.10.25
Introduction  (0) 2019.10.25

1. TensorFlow API Hierarchy

(1) Hardware 층
- 여러 하드웨어 플랫폼에서의 실행을 위한 것으로 보통 크게 다룰 일이 없음

(2) Core TensorFlow(C++ API)
- 텐서플로 기반으로 커스텀된 앱을 만들 수 있는 계층

(3) Core TensorFlow(Python API)
- 사칙연산, 행렬곱 등 수치처리를 위한 코드
- 변수 및 텐서 생성, 차원 설정 등의 작업이 이 계층에서 가능함

(4) tf.layers / tf.losses / tf.metrics :
- 커스텀 뉴럴네트워크를 만드는데 유용한 계층
→ 많은 경우에는 학습, 평가, 적용이 표준화된 방법으로 적용이 가능하기 때문에 커스텀이 필요하진 않음
- 활성함수를 통한 hidden layer 계층 만들기(tf.layers), CrossEntropy 계산 등의 작업(tf.losses),
RMSE와 같은 평가지표의 계산(tf.metrics)이 가능함

(5) tf.estimator
- 최상위 계층으로 모델을 학습시키고, 평가하고, 저장하고, 적용하는 계층

2. Lazy Evaluation

위의 예시에서처럼 a와 b를 더하라고 지정을 해주어도
이것만으로는 바로 결과가 나타나지 않는다.
이것을 세션(Session)을 통해서 실행(Run)시켜주어야 한다.
이런 특성 때문에 텐서플로는 lazy 하다고 한다.

결국 정리하자면, 텐서플로를 두 단계를 거쳐야 한다.

(1) 그래프를 그린다(정의한다)
(2) 그래프를 실행시킨다

※ tf.eager 를 통해서 lazy하지 않게 만들 수는 있지만 텐서플로에서 잘 사용되지는 않는다.

그러면 왜 이렇게 Lazy하게 만들었을까?
이런 구조를 통해서 Python에서 C++로의 전환이 최소화되고 계산이 효율적으로 수행될 수 있기 때문이다.

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

TensorFlow 실습 1  (0) 2019.10.28
Tensor and Variable  (0) 2019.10.25
Graph and Session  (0) 2019.10.25
What is TensorFlow?  (0) 2019.10.25
Introduction  (0) 2019.10.25

1. What is TensorFlow?

  • 텐서플로는 단순히 머신러닝에 관한 것이 아니라 수치 계산에 관한 것이다. 가령 미분을 하는데도 쓸 수 있음
  • 텐서플로가 작동하는 방식은 유향 비순환 그래프(directed acyclic graph)를 만드는 것과 같다.
    ※ 유향 비순환 그래프(directed acyclic graph, DAG, 유향 비사이클 그래프)란?

    위와 같은 순환그래프는 그래프에서 볼 수 있듯, A-> B-> C->A 의 싸이클이 발생해서 계속적으로 반복될 수 있는 상황이 발생가능

    하지만 DAG에서는 방향 순환이 없이 무한히 수많은 꼭짓점과 간선으로 구성되며 한 방향으로 나아감
    각각의 노드(node)는 덧셈,뺄셈, 곱셈 등의 간단한 연산부터, softmax 행렬곱 등의 복잡한 연산까지 수학적 연산을 나타냄
    각각의 노드를 연결하는 것은 edge라고 함
    edge는 수학적 연산의 input, output으로 데이터의 array를 나타냄

  • scalar : 3과 5같은 하나의 숫자
  • vector : 숫자들의 일차원 배열
  • maxtrix : 숫자들의 이차원 배열
  • 3D, 4D.... tensor : 숫자들의 3차원, 4차원 등등의 배열
  • tensor : 데이터의 n차원 배열(결국 텐서플로 안의 데이터가 tensor)

→ tensor(데이터)들이 directed acyclic graph를 따라 흘러가기 때문에 TensorFlow라 하는 것

 

2. Benefits of a Directed Graph

그렇다면 TensorFlow는 왜 DAG를 계산에 활용할까?
DAC는 모델의 코드에 사용한 언어와는 독립적이다. 때문에 파이썬으로 DAG를 만들어서 C++에서 구현할 수 있다.
이런 점을 이용해 high level language인 파이썬으로 프로그램을 작성해서 TensorFlow 실행엔진에 의해
작동되는 다른 플랫폼에서 실행할 수 있다.


클라우드에서 모델을 학습시킨 다음, 훈련시킨 모델을 스마트폰 등에서 예측 수행이 가능한 것이다.
(ex: 구글 번역기는 오프라인 상태에서도 예측 정도가 좀 떨어지더라도 학습된 모델로 작동이 가능하다.)

이런 장점으로 인해 텐서플로는 다양한 플랫폼에서 활용될 수 있다.

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

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
Introduction  (0) 2019.10.25

앞으로 배울 것

  • 게으른 평가(lazy evaluation)와 명령형(imperative) 프로그램 작성하기
  • 그래프, 세션(Session), 변수 다루기
  • 텐서플로 그래프 시각화
  • 텐서플로 프로그램 디버깅

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

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
What is TensorFlow?  (0) 2019.10.25

+ Recent posts