[Tensorflow 2.0] Subclassing 구현

[Tensorflow 2.0] Subclassing 구현

  • TensorFlow 2.0으로 베우는 딥러닝 입문 강의를 들으며 공부한 내용입니다.

복습 겸 입문 강의를 쭉 훑으면서 기초를 다시 다져보려 한다. Subclassing 코딩스타일을 익혀보자.

강의에 사용된 예제 코드는 이전에 다뤄본 MNIST 숫자분류 코드로 깃헙 주소는 아래와 같다. -> 여기!

1
2
3
4
5
6
7
8
9
10
# tf.keras.Model을 이용해서 Softmax Regression 모델을 정의합니다.
class SoftmaxRegression(tf.keras.Model):
def __init__(self):
super(SoftmaxRegression, self).__init__()
self.softmax_layer = tf.keras.layers.Dense(10, activation=None, kernel_initializer='zeros', bias_initializer='zeros')

def call(self, x):
logits = self.softmax_layer(x)

return tf.nn.softmax(logits)
  • 케라스 서브클래싱 방식을 사용한 코드패턴이다.
  • tf.keras.Model을 상속받는 클래스를 하나 정의해준다.
  • 생성자 init과 호출부 call 로직을 정의해준다. 생성자에서는 super 메서드를 통해 tf.keras.model의 생성자를 상속받는 형태로 정의해준다.
  • 클래스 변수로 원하는 모델 구조의 API를 선언해준다.
  • 클래스 호출부 call 메서드에서는 인자값으로 input data x를 받고 생성자 부분에서 정의했던 클래스 변수들(softmax_layer)을 순차적으로 호출한다 => 전체 모델 구조의 output 반환값을 계산(logits).
1
2
3
4
5
6
7
8
# 최적화를 위한 function을 정의합니다.
@tf.function
def train_step(model, x, y):
with tf.GradientTape() as tape:
y_pred = model(x)
loss = cross_entropy_loss(y_pred, y)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  • GradientTape에 대한 공식문서
  • GradientTape은 자동으로 context 내에서 실행된 모든 연산을 tape에 기록 한다. 이후, tape.gradient(z, y) 를 호출하면 GradientTape에 포함된 리소스가 해제되면서 y에 대한 도함수를 계산한다.

댓글