FUNDAMENTAL | 18. TF2 API 개요

yeonk·2021년 10월 18일
0

aiffel-ai-bootcamp

목록 보기
31/38
post-thumbnail

20211018



1. Tensorflow2 구성과 특징


Eager Mode 수용 - 그래프를 완성하지 않아도 부분적 실행 가능 / 설계, 구현, 디버깅이 쉬움
머신러닝 프레임워크 Keras 수용 (표준 API)

  • Ease of use(사용하기 쉬움)

  • Eager Execution(즉시 실행)

  • Model Building and deploying made easy(설계 구현 용이성)

  • The Data pipeline simplified(데이터 파이프라인 단순화)






Tensorflow V1

  • Graph Mode: Tensorflow를 거대한 노드-엣지 사이의 유향 비순환 그래프(Directed Acyclic Graph, DAG)로 정의 → 엣지간 chain-rule 기반 gradient 역방향 전파가 가능

  • 단점:

    • 그래프를 그리는 부분과 연산 과정 분리: 그래프 내 연산은 session.run()`을 통해서만 가능하도록 제한

    • 사용하기 어려움 → 파이써닉하지 않음 → 구현 난이도 높음

  • 장점: 대규모 분산 환경에서의 확장성과 생산성






PyTorch

  • Eagr Mode: 딥러닝 그래프가 완전히 그려지지 않아도 부분 실행 및 오류검증 가능

  • 간결한 코드, 파이써닉함






2. Tensorflow2 API로 모델 구성하기


  • TensorFlow2 딥러닝 작성 방법
    • Sequential
    • Functional: Sequential 보다 일반화된 개념
    • Model Subclassing: 클래스로 구현된 기존의 모델을 상속받아 모델을 만들어나가는 방식






TensorFlow2 Sequential Model

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential()
model.add(__넣고싶은 레이어__)
model.add(__넣고싶은 레이어__)
model.add(__넣고싶은 레이어__)

model.fit(x, y, epochs=10, batch_size=32)
  • 초보자가 접근하기 쉬움

  • 모델에 다수의 입출력이 있을 경우 적합하지 않음

  • 입력과 출력이 각 1가지 임을 전제로 함






TensorFlow2 Functional API

import tensorflow as tf
from tensorflow import keras

inputs = keras.Input(shape=(__원하는 입력값 모양__))
x = keras.layers.__넣고싶은 레이어__(관련 파라미터)(input)
x = keras.layers.__넣고싶은 레이어__(관련 파라미터)(x)
outputs = keras.layers.__넣고싶은 레이어__(관련 파라미터)(x)

model = keras.Model(inputs=inputs, outputs=outputs)
model.fit(x,y, epochs=10, batch_size=32)
  • keras.Model 사용 → 일반적인 접근

  • 입력과 출력을 규정함으로써 모델 전체를 규정

  • 다중입력/출력 모델 구성 가능

  • keras.Input으로 정의된 input및 output 레이어 구성을 통해 model을 구현






TensorFlow2 Subclassing

import tensorflow as tf
from tensorflow import keras

class CustomModel(keras.Model):
    def __init__(self):
        super(CustomModel, self).__init__()
        self.__정의하고자 하는 레이어__()
        self.__정의하고자 하는 레이어__()
        self.__정의하고자 하는 레이어__()
    
    def call(self, x):
        x = self.__정의하고자 하는 레이어__(x)
        x = self.__정의하고자 하는 레이어__(x)
        x = self.__정의하고자 하는 레이어__(x)
        
        return x
    
model = CustomModel()
model.fit(x,y, epochs=10, batch_size=32)
  • 가장 자유롭게 모델링 진행 가능

  • keras.Model을 상속받은 모델 클래스를 만드는 것

  • __init__() 안에 레이어 구성 정의 (레이어 선언)

  • call() 안에 레이어간 forward propagation 구현

  • call()의 입력이 Input이고, call()의 리턴값이 Output






3. GradientTape의 활용


  • TF2 API의 model.fit()는 아래 모든 과정을 포함
    • Forward Propagation 수행 및 중간 레이어값 저장
    • Loss 값 계산
    • 중간 레이어값 및 Loss를 활용한 체인룰(chain rule) 방식의 역전파(Backward Propagation) 수행
    • 학습 파라미터 업데이트



  • tf.GradientTape
    • 순전파(forward pass) 로 진행된 모든 연산의 중간 레이어값을 tape에 기록
    • gradient 계산한 후 tape 폐기 기능
    • model.compile(), model.fit() 내 스텝의 학습 단계 재구성 가능
    • GAN(Generative Advasarial Network)의 학습에서 train_step 메소드 재구성 필수적



  • model.compile()

    • loss 및 그래디언트가 어떻게 학습 파라미터를 업데이트하게 되는지를 지정해 주는 작업
  • tape.gradient(): 학습 시 발생하는 그래디언트 추출






추가 자료


Overview of changes from TF V1 to TF V2

텐서플로 2.0 시작하기: 초보자용

The Keras functional API

텐서플로 2.0 시작하기: 전문가용

CIFAR-100 dataset

0개의 댓글