T'SPACE

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

컴퓨터공학/인공지능

Custom Convnets 특수 제작 Convnet

Tonny Kang 2024. 8. 14. 16:41
반응형

컨볼루션 신경망(Convolutional Neural Networks, CNNs)의 작동 원리와 설계 방법


컨볼루션 신경망(CNN)은 이미지 처리 및 분류 작업에서 매우 강력한 도구로 자리 잡았고

CNN은 이미지를 분석하고 특징을 추출하는 능력으로 인해 컴퓨터 비전 분야에서 널리 사용되고 있습니다.

 

이번 글에서는 CNN이 어떻게 이미지로부터 정보를 추출하고 이를 학습하여 이미지 분류 문제를 해결하는지, 그리고 직접 CNN 모델을 설계하는 방법에 대해 알아보겠습니다.

1. CNN의 기본 작동 원리


CNN이 이미지를 분석하는 과정은 세 가지 주요 단계로 나눌 수 있습니다: 필터링(Filter), 검출(Detect), 그리고 축소(Condense). 이러한 과정들을 통해 CNN은 이미지로부터 유용한 특징들을 추출해냅니다.

 

필터링 단계에서는 여러 개의 필터(또는 커널)를 사용하여 입력 이미지에서 중요한 패턴을 찾아내고 필터는 이미지의 작은 영역에 대해 연산을 수행하며, 이를 통해 이미지의 특정 특징을 감지합니다. 예를 들어, 필터는 이미지에서 선, 모서리, 또는 특정 질감을 감지할 수 있습니다.

 

검출 단계에서는 필터링된 결과값을 비선형 활성화 함수(ReLU 등)를 통해 변환하여 중요한 특징을 강조합니다. 이렇게 함으로써 이미지의 비선형적 특성을 더욱 효과적으로 모델링할 수 있게 됩니다.

 

축소 단계에서는 특징 맵의 크기를 줄여 계산 효율성을 높이고, 중요한 정보만을 남겨 과적합을 방지합니다. 일반적으로 이 단계에서 MaxPooling과 같은 다운샘플링 기법이 사용됩니다.

 

이러한 과정을 반복하여 CNN은 점점 더 복잡하고 정교한 특징을 학습하게 됩니다. 단일 라운드의 특징 추출만으로는 이미지의 단순한 선이나 대비와 같은 간단한 특징만을 추출할 수 있습니다. 그러나 CNN은 이 과정을 여러 번 반복함으로써, 점점 더 복잡하고 유의미한 특징을 학습할 수 있게 됩니다.

2. 컨볼루션 블록(Convolutional Blocks)


CNN의 강력한 특징 학습 능력은 컨볼루션 블록에서 비롯됩니다. 컨볼루션 블록은 Conv2DMaxPool2D 레이어로 구성된 스택입니다. 각 블록은 특징을 추출하는 하나의 라운드를 나타내며, 이 블록들이 서로 결합되고 반복되어 이미지에서 더욱 복잡한 특징을 추출합니다.

컨볼루션 블록은 CNN의 핵심 요소로, 이미지의 저수준(low-level) 특징(예: 선, 모서리)부터 고수준(high-level) 특징(예: 객체의 형태, 얼굴 등)에 이르기까지 다양한 수준의 특징을 학습할 수 있습니다. 이는 CNN의 깊이(depth)가 모델의 성능을 크게 향상시키는 이유 중 하나입니다.

3. CNN 모델 설계 예제

이제 간단한 CNN 모델을 설계하는 예제를 통해 CNN의 구조를 살펴보겠습니다. 이 모델은 자동차와 트럭을 분류하는 이진 분류 문제를 해결하기 위해 설계되었습니다.

# 필요한 라이브러리 임포트
import os, warnings
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import image_dataset_from_directory

# 재현성 확보를 위한 설정
def set_seed(seed=31415):
    np.random.seed(seed)
    tf.random.set_seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    os.environ['TF_DETERMINISTIC_OPS'] = '1'
set_seed()

# Matplotlib 기본 설정
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
       titleweight='bold', titlesize=18, titlepad=10)
plt.rc('image', cmap='magma')
warnings.filterwarnings("ignore") # 불필요한 경고 메시지 무시

# 학습 및 검증 데이터셋 로드
ds_train_ = image_dataset_from_directory(
    '../input/car-or-truck/train',
    labels='inferred',
    label_mode='binary',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,
    shuffle=True,
)
ds_valid_ = image_dataset_from_directory(
    '../input/car-or-truck/valid',
    labels='inferred',
    label_mode='binary',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,
    shuffle=False,
)

# 데이터 파이프라인 설정
def convert_to_float(image, label):
    image = tf.image.convert_image_dtype(image, dtype=tf.float32)
    return image, label

AUTOTUNE = tf.data.experimental.AUTOTUNE
ds_train = (
    ds_train_
    .map(convert_to_float)
    .cache()
    .prefetch(buffer_size=AUTOTUNE)
)
ds_valid = (
    ds_valid_
    .map(convert_to_float)
    .cache()
    .prefetch(buffer_size=AUTOTUNE)
)

위 코드는 학습 및 검증 데이터를 로드하고, 이를 CNN 모델에 입력하기 위한 데이터 파이프라인을 설정하는 예제입니다. 이제 CNN 모델을 정의해보겠습니다.

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([

    # 첫 번째 컨볼루션 블록
    layers.Conv2D(filters=32, kernel_size=5, activation="relu", padding='same',
                  input_shape=[128, 128, 3]),
    layers.MaxPool2D(),

    # 두 번째 컨볼루션 블록
    layers.Conv2D(filters=64, kernel_size=3, activation="relu", padding='same'),
    layers.MaxPool2D(),

    # 세 번째 컨볼루션 블록
    layers.Conv2D(filters=128, kernel_size=3, activation="relu", padding='same'),
    layers.MaxPool2D(),

    # 분류기 헤드
    layers.Flatten(),
    layers.Dense(units=6, activation="relu"),
    layers.Dense(units=1, activation="sigmoid"),
])
model.summary()

이 모델은 세 개의 컨볼루션 블록으로 구성되어 있으며, 각 블록은 Conv2DMaxPool2D 레이어로 이루어져 있고

 

마지막에는 Dense 레이어로 구성된 분류기 헤드가 추가되어 있습니다. 이 모델에서는 각 컨볼루션 블록마다 필터 수가 두 배로 증가(32, 64, 128)하는 패턴을 따릅니다.

 

이는 일반적인 CNN 설계 패턴 중 하나로, MaxPool2D 레이어를 통해 특징 맵의 크기를 줄이는 대신 필터의 수를 증가시켜 더 많은 특징을 학습할 수 있도록 합니다.

 

이제 이 모델을 컴파일하고 학습시킬 수 있습니다. 다음 코드와 같이 최적화기, 손실 함수, 그리고 이진 분류에 적합한 평가지표를 사용하여 모델을 컴파일할 수 있습니다.

model.compile(
    optimizer=tf.keras.optimizers.Adam(epsilon=0.01),
    loss='binary_crossentropy',
    metrics=['binary_accuracy']
)

history = model.fit(
    ds_train,
    validation_data=ds_valid,
    epochs=40,
    verbose=0,
)

4. 결론


이번 글에서는 CNN이 이미지를 처리하고 분류하는 방법에 대해 알아보고, 간단한 CNN 모델을 설계해 보았습니다. CNN은 컨볼루션 블록을 통해 이미지로부터 점점 더 복잡한 특징을 추출하며, 이를 바탕으로 고성능의 이미지 분류 모델을 구축할 수 있습니다.

 

CNN의 설계와 구현은 다양한 컴퓨터 비전 문제를 해결하는 데 강력한 도구가 될 수 있으며, 이를 통해 이미지 분류, 객체 탐지, 이미지 생성 등 다양한 응용 분야에서 혁신적인 성과를 거둘 수 있습니다. 앞으로도 CNN과 딥러닝 기술을 활용하여 더 많은 문제를 해결할 수 있기를 기대합니다.

반응형

'컴퓨터공학 > 인공지능' 카테고리의 다른 글

저수지 샘플링 Reservoir Sampling  (2) 2024.10.23
Leetcode Introduction to Pandas 기본 문법 정리  (2) 2024.10.10
Stride CNN, 보폭  (82) 2024.08.13
Maximum Pooling 최대값 풀링  (79) 2024.08.07
합성곱과 ReLU, Convolution  (64) 2024.08.06