Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

TensorFlow를 활용해 Python에서 신경망 계층(Layer)을 구성하는 방법

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)할 수 있습니다.