TensorFlow는 사용자가 직접 클래스를 정의하여 신경망의 계층(layer)을 유연하게 구성할 수 있도록 지원합니다. 이 글에서는 tf.keras.Model을 상속받는 ResnetIdentityBlock 클래스를 정의하고, 여러 개의 계층을 하나의 블록으로 묶어 재사용 가능한 형태로 조립하는 방법을 살펴봅니다.
함께 읽으면 좋은 글: TensorFlow란 무엇이며, Keras는 TensorFlow와 어떻게 연동되어 신경망을 생성할까?
합성곱 신경망(CNN)과 TensorFlow Hub
최소 하나 이상의 합성곱 계층(convolutional layer)을 포함하는 신경망을 합성곱 신경망(Convolutional Neural Network, CNN)이라고 부르며, 이를 활용하면 이미지 인식에 특화된 학습 모델을 효율적으로 구축할 수 있습니다.
TensorFlow Hub는 사전 학습된(pre-trained) TensorFlow 모델을 모아 놓은 공개 저장소입니다. TensorFlow를 사용하면 이러한 학습 모델을 세부 조정(fine-tuning)할 수 있으며, TensorFlow Hub의 모델을 tf.keras와 함께 활용하는 방법과 이미지 분류 모델을 적용하는 과정을 익힐 수 있습니다. 사전 학습된 분류기 모델에 이미지를 입력하기만 해도 별도의 학습 없이 해당 이미지가 무엇인지 예측할 수 있습니다. 나아가 전이 학습(transfer learning)을 통해 사용자가 원하는 커스텀 이미지 클래스에 맞게 모델을 미세 조정할 수도 있습니다.
Google Colaboratory 실행 환경
본문의 코드는 Google Colaboratory(이하 Colab)에서 실행됩니다. Google Colab은 브라우저만으로 Python 코드를 실행할 수 있는 환경으로, 별도의 설정이 필요 없으며 GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 구축되었습니다.
예제 코드
print("Composing layers")
class ResnetIdentityBlock(tf.keras.Model):
def __init__(self, kernel_size, filters):
super(ResnetIdentityBlock, self).__init__(name='')
filters1, filters2, filters3 = filters
self.conv2a = tf.keras.layers.Conv2D(filters1, (1, 1))
self.bn2a = tf.keras.layers.BatchNormalization()
self.conv2b = tf.keras.layers.Conv2D(filters2, kernel_size, padding='same')
self.bn2b = tf.keras.layers.BatchNormalization()
self.conv2c = tf.keras.layers.Conv2D(filters3, (1, 1))
self.bn2c = tf.keras.layers.BatchNormalization()
def call(self, input_tensor, training=False):
x = self.conv2a(input_tensor)
x = self.bn2a(x, training=training)
x = tf.nn.relu(x)
x = self.conv2b(x)
x = self.bn2b(x, training=training)
x = tf.nn.relu(x)
x = self.conv2c(x)
x = self.bn2c(x, training=training)
x += input_tensor
return tf.nn.relu(x)
print("The layer is called")
block = ResnetIdentityBlock(1, [1, 2, 3])
_ = block(tf.zeros([1, 2, 3, 3]))
block.layers
len(block.variables)
block.summary()코드 출처 − https://www.tensorflow.org/tutorials/customization/custom_layers
실행 결과
Composing layers The layer is called Model: "resnet_identity_block" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) multiple 4 _________________________________________________________________ batch_normalization (BatchNo multiple 4 _________________________________________________________________ conv2d_1 (Conv2D) multiple 4 _________________________________________________________________ batch_normalization_1 (Batch multiple 8 _________________________________________________________________ conv2d_2 (Conv2D) multiple 9 _________________________________________________________________ batch_normalization_2 (Batch multiple 12 ================================================================= Total params: 41 Trainable params: 29 Non-trainable params: 12
코드 설명
ResNet의 모든 잔차 블록(residual block)은 합성곱(convolution), 배치 정규화(batch normalization), 그리고 숏컷(shortcut) 연결로 구성됩니다.
계층은 다른 계층 내부에 중첩(nesting)하여 배치할 수도 있습니다.
Model.fit,Model.evaluate,Model.save같은 모델 메서드가 필요하다면keras.Model을 상속받아 사용할 수 있습니다.keras.layers.Layer대신keras.Model을 사용하면 변수 추적(variable tracking)이 용이해집니다.keras.Model은 자신의 내부 계층들을 자동으로 추적하므로, 모델의 구조를 쉽게 검사(inspect)할 수 있습니다.