[AIFFEL 울산 1기] 21. TF2 API 개요

정경민·2022년 3월 15일
0

학습 목표

  • Tensorflow V2의 개요와 특징을 파악한다.
  • Tensorflow V2의 3가지 주요 API 구성 방식을 이해하고 활용할 수 있다.
  • GradientTape를 활용해 보고 좀 더 로우 레벨의 딥러닝 구현 방식을 이해한다.

후기


학습 내용

21. TF2 API 개요

21.1. TensorFlow2 API로 모델 구성하기

1. TensorFlow2 API 알아보기

# TensorFlow2에서 딥러닝 모델을 작성하는 방법

  • Sequential
    • model = keras.Sequential()
    • 앞에서 계속 했던 방식으로 레이어를 sequential하게 쌓아나가는 방식
  • Functional
    • 입력과 출력을 규정함으로써 모델 전체를 규정
    • 다중 입력 및 출력이 가능
    • ex)
	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)
  • Model Subclassing
    • 가장 자유로운 모델링 가능
    • 본질적으로는 Functional한 접근과 차이가 없음
    • keras.model을 상속받은 모델 클래스의 하나일 뿐
	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)

# 세 가지로 같은 모델을 작성할 수 있음

  • 필요한 상황에 딸 적절하게 선택하여 모델을 생성할 수 있음
  • 같은 구조로 설계한다면 같은 모델을 생성한 것과 같음
  • MNIST와 CIFAR-100 데이터셋을 활용하여 각각을 실험 한 결과,
    세 방식의 결과가 모두 같음을 확인

2. GradientTape의 활용**

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

# tf.GradientTape

  • 순전파(forward pass) 로 진행된 모든 연산의 중간 레이어값을 tape에 기록하고, 이를 이용해 gradient를 계산한 후 tape를 폐기하는 기능을 수행

  • model.compile()과 model.fit()의 역할을 할 수 있음

  • 활용 예시

* 해당 compile 코드는,

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

-> 다음 코드로!

loss_func = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()

# tf.GradientTape()를 활용한 train_step
def train_step(features, labels):
    with tf.GradientTape() as tape:
        predictions = model(features)
        loss = loss_func(labels, predictions)
        gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    return loss

* 학습 코드인 fit은,

model.fit(x_train, y_train, epochs=5, batch_size=32)

-> 이 코드로!

import time
def train_model(batch_size=32):
    start = time.time()
    for epoch in range(5):
        x_batch = []
        y_batch = []
        for step, (x, y) in enumerate(zip(x_train, y_train)):
            if step % batch_size == batch_size-1:
                x_batch.append(x)
                y_batch.append(y)
                loss = train_step(np.array(x_batch, dtype=np.float32), np.array(y_batch, dtype=np.float32))
                x_batch = []
                y_batch = []
                print('\rBatch {} done!\r'.format(step), end='\r')
        print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))
    print("It took {} seconds".format(time.time() - start))

train_model()

0개의 댓글