AIFFEL FD #15 Tensorflow2 API

이재준·2021년 8월 2일
0

AIFFEL Fundamental

목록 보기
16/25
post-thumbnail
post-custom-banner

✅ 핵심내용

  • Tensorflow V2의 개요와 특징
  • Tensorflow V2의 3가지 주요 API 구성방식
  • GradientTape를 활용해 보고 low 레벨의 딥러닝 구현방식 이해

Tensorflow V1 vs V2

  • Tensorflow V1
    • Tensorflow 를 유향 비순환 그래프(Directed Acyclic Graph, DAG) 로 정의
    • Graph Mode
    • 딥러닝 모델을 구성하는 그래프를 그려나가는 부분과, 그 그래프 상에서 연산과정 분리 -> session.run() 안에서 모든 연산 수행
  • Tensorflow V2
    • PyTorch 에서 사용하는 Eager Mode 수용 -> 그래프가 다 그려지지 않아도 부분 실행, 오류검증 가능
    • Keras 라는 쉽고 간결한 머신러닝 프레임워크를 표준 API로 사용
    • V1과 비교한 간결한 코드 예시
    # 텐서플로 1.x
    outputs = session.run(f(placeholder), feed_dict={placeholder: input})
    # 텐서플로 2.0
    outputs = f(input)
    • 설계 구현 용이성, 데이터 파이프라인 단순화 등의 장점

Tensorflow2 API 로 모델 구성

Tensorflow2 를 활용하여 다양한 방법으로 딥러닝 모델을 구성할 수 있다. 대표적인 방법에는 3가지, Sequential, Functional, Model Subclassing가 존재한다.

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)

Sequential 모델은 입력부터 출력까지 레이어를 한층씩 add 해서 쌓아나가는 모델이다.
Sequensial 모델은 반드시 입력 1가지, 출력 1가지를 전제로 한다.

Functional API

import tensorflow as tf
from tensorflow import keras

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

model = keras.Model(inputs=inputs, outputs=outputs)
model.fit(x,y, epochs=10, batch_size=32)

Functional APIkeras.Model 을 사용하여 Sequential 모델 을 일반화한 개념이다.
입력과 출력을 규정함으로써 모델 전체를 규정하는 함수형 모델 구성이다.

Functional API를 통해 다중입력/출력을 가지는 모델을 구성할 수 있다.

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)

Subclassing 을 활용하면 가장 자유로운 모델링이 가능하다.

keras.Model

  • __init__()이라는 메소드 안에서 레이어 구성을 정의
  • call()이라는 메소드 안에서 레이어 간 forward propagation을 구현

위 세가지 방법으로 MNIST 데이터셋, CIFAR-100 데이터셋을 활용하여 모델을 구성하고 학습시켰다.

자세한 코드를 아래의 GitHub 링크에 기록하였다.

GitHub Link : FD18_Tensorflow2_API


GradientTape 활용

모델을 구성한 후 학습시키는 과정에서 사용하는 model.fit() 은 아래의 4단계를 여러번 반복하는 과정이 추상화되어 있다.

    1. Forward Propagation 수행 및 중간 레이어값 저장
    1. Loss 값 계산
    1. 중간 레이어값 및 Loss를 활용한 체인룰(chain rule) 방식의 역전파(Backward Propagation) 수행
    1. 학습 파라미터 업데이트

Tensorflow에서 제공하는 tf.GradientTape 는 위와 같이 순전파(forward pass) 로 진행된 모든 연산의 중간 레이어값을 tape 에 기록하고, 이를 이용해 gradient를 계산한 후 tape 를 폐기하는 기능을 수행한다.

tf.GradientTape 는 이후 그래디언트를 좀 더 고급스럽게 활용하는 다양한 기법을 통해 자주 사용한다.

이전 스텝에서 진행했던 학습을 tf.GradientTape를 이용한 것으로 변형해보았다.

자세한 코드를 아래의 GitHub 링크에 기록하였다.

GitHub Link : FD18_Tensorflow2_API

  • tf.GradientTape()를 활용하면 model.compile()model.fit() 안에 감추어져 있던 한 스텝의 학습 단계(위 예제에서는 train_step 메소드)를 끄집어내서 자유롭게 재구성할 수 있게 됨

  • 그동안 흔히 다루어 왔던 지도학습 방식과 다른 강화학습 또는 GAN(Generative Advasarial Network)의 학습을 위해서는 train_step 메소드의 재구성이 필수적

profile
🏫 𝑲𝒚𝒖𝒏𝒈 𝑯𝒆𝒆 𝑼𝒏𝒊𝒗. / 👨‍🎓 𝑪𝒐𝒍𝒍𝒆𝒈𝒆 𝒐𝒇 𝑬𝒏𝒈𝒊𝒏𝒆𝒆𝒓𝒊𝒏𝒈
post-custom-banner

0개의 댓글