✅ 핵심내용
session.run()
안에서 모든 연산 수행Eager Mode
수용 -> 그래프가 다 그려지지 않아도 부분 실행, 오류검증 가능# 텐서플로 1.x
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# 텐서플로 2.0
outputs = f(input)
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 API
은 keras.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
모델을 구성한 후 학습시키는 과정에서 사용하는 model.fit()
은 아래의 4단계를 여러번 반복하는 과정이 추상화되어 있다.
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 메소드의 재구성이 필수적