T'SPACE

다채로운 에디터들의 이야기

컴퓨터공학/인공지능

CNN - Convolution Neural Networks

Tonny Kang 2024. 8. 5. 14:33
반응형

컨볼루션 분류기 Convolution Classifier


우리의 목표는 신경망이 자연 이미지를 충분히 "이해"하여 인간의 시각 시스템이 해결할 수 있는 동일한 종류의 문제를 해결할 수 있도록 학습하는 방법을 배우는 것입니다.

이 작업에 가장 적합한 신경망은 컨볼루션 신경망입니다. (때로는 convnet 또는 CNN이라고도 합니다.)

이미지 분류에 사용되는 컨브넷은 컨볼루션 베이스밀집 헤드의 두 부분으로 구성됩니다.

베이스는 이미지에서 특징을 추출하는 데 사용됩니다. 주로 컨볼루션 연산을 수행하는 레이어들로 구성되지만, 종종 다른 종류의 레이어들도 포함됩니다. (이 부분에 대해서는 다음 레슨에서 배울 것입니다.)

헤드는 이미지의 클래스를 결정하는 데 사용됩니다. 주로 밀집 레이어들로 구성되지만, 드롭아웃 같은 다른 레이어들이 포함될 수도 있습니다.

시각적 특징이란 무엇을 의미할까요? 특징은 선, 색상, 질감, 모양, 패턴 또는 복잡한 조합일 수 있습니다.

728x90

분류기 훈련


네트워크가 훈련하는 동안 목표는 두 가지를 학습하는 것입니다:

  1. 이미지에서 어떤 특징을 추출할 것인가 (베이스),
  2. 어떤 특징이 어떤 클래스에 해당하는가 (헤드).

요즘은 컨브넷을 처음부터 훈련시키는 경우는 드뭅니다. 대신, 우리는 사전 훈련된 모델의 베이스를 재사용하는 경우가 많습니다. 사전 훈련된 베이스에 훈련되지 않은 헤드를 붙입니다. 즉, 이미 1. 특징 추출을 학습한 네트워크의 부분을 재사용하고, 여기에 새로운 레이어들을 붙여서 2. 분류를 학습하도록 합니다.

헤드는 보통 몇 개의 밀집 레이어들로 구성되기 때문에, 상대적으로 적은 데이터로도 매우 정확한 분류기를 만들 수 있습니다.

사전 훈련된 모델을 재사용하는 기법은 전이 학습이라고 합니다. 이것은 매우 효과적이어서, 요즘 거의 모든 이미지 분류기는 이 방법을 사용합니다.

반응형

예제 - 컨브넷 분류기 훈련


사전 훈련된 베이스 정의

가장 일반적으로 사용되는 사전 훈련 데이터셋은 많은 종류의 자연 이미지를 포함하는 ImageNet입니다.

pretrained_base = tf.keras.models.load_model(
    '../input/cv-course-models/cv-course-models/vgg16-pretrained-base',
)
pretrained_base.trainable = False

헤드 붙이기

Flatten 레이어는 베이스의 2차원 출력을 헤드에서 필요로 하는 1차원 입력으로 변환합니다.

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    pretrained_base,
    layers.Flatten(),
    layers.Dense(6, activation='relu'),
    layers.Dense(1, activation='sigmoid'),
])
  • 입력 형태: 입력 데이터의 형태가 (batch_size, height, width, channels)인 경우, Flatten() 레이어는 batch_size는 변경하지 않고 데이터를 (height, width, channels)에서 (height * width * channels)로 재구성합니다.
  • 출력 형태: 출력은 (batch_size, height * width * channels) 형태를 갖게 됩니다.

훈련

이것은 두 개의 클래스를 가지는 문제이므로, crossentropyaccuracy의 이진 버전을 사용합니다. adam 옵티마이저는 일반적으로 좋은 성능을 보입니다.

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['binary_accuracy'],
)

history = model.fit(
    ds_train,
    validation_data=ds_valid,
    epochs=30,
    verbose=0,
)
반응형