Convolutional Layer (합성곱 계층) (1)

5단 분석법

순서
분석
단어
내용
1
일반 명사
Convolutional
대단히 복잡한 것, 주름
Layer
층, 겹
Convolutional Layer
대단히 복잡한 층?
2
고유 명사
Convolutional Layer
CNN에서 입력 데이터의 feature(특징)을 추출하는 레이어
3
사용 이유
Convolutional Layer
이미지의 중요한 부분을 찾아내고, 연산량을 줄이며, 다양한 특징을 단계적으로 학습할 수 있기 때문에
4
사용 방법
Convolutional Layer
5
다른 기술과의 비교
Convolutional Layer
-

정의

일반 명사

Convolutional
대단히 복잡한 것, 주름
Layer
층, 겹
Convolutional Layer
대단히 복잡한 층?
Convolutional 은 대단히 복잡한 것, 주름이라는 뜻입니다.
Layer는 층, 겹이라는 의미를 가지고 있습니다.
Convolutional Layer의 의미를 추측해 보면, 대단히 복잡한 층이라고 추측해 볼 수 있습니다.
의미가 맞는지, 고유 명사를 한 번 살펴볼까요?

고유 명사

Convolutional Layer
CNN에서 입력 데이터의 feature(특징)을 추출하는 레이어
Convolutional Layer는 CNN에서 입력 데이터의 feature(특징)을 추출하는 레이어 입니다.
CNN의 과정을 보여주는 그림입니다.
여기서, Feature Learning 부분의 CONVOLITION + RELU 부분이 바로 Convolutional Layer가 되는 것입니다.
Convolutional Layer는 입력 데이터에 Convolution Mask(필터)를 적용하고, 활성화 함수를 반영하여 특징을 추출하는 레이어입니다.
Convolution Mask(필터)를 통해 이미지의 중요한 패턴을 감지합니다.
Convolution Mask(필터)는 작은 행렬로, 입력 데이터의 각 영역에 대해 Convolution 연산을 수행합니다.
연산 결과는 Convolved Feature에 담깁니다.
Convolution Mask 가 뭔가요? 그리고 각 셀 안에 있는 값은 뭔가요?
컨볼루션 마스크(Convolution Mask), 또는 필터(Filter)는 Convolutional Layer에서 사용되는 중요한 구성 요소로, 입력 데이터(주로 이미지)의 특정 패턴을 감지하고 특징을 추출하는 역할을 합니다. 각 셀 안에 있는 값에 대해 설명드리자면 Nerual Network 모델에 weight가 들어가있는 것처럼, Convolution Mask에도 weight(가중치)가 들어가 있습니다.
그래서, FCNN은 모델의 weight가 조정되듯이, CNN은 Mask의 값이 조정이 되게 됩니다.
Convolution 연산은 필터(또는 커널)을 사용해 입력 데이터의 특징을 추출하는 연산 입니다.
픽셀 단위로 Convolution 연산을 한 뒤 Convolved Feature에 연산 값을 담습니다.
Convolution 연산을 하면 주위의 지역 정보 특성까지 반영이 되게 됩니다.
Convolution 연산 후에 ReLU(Rectified Linear Unit) 활성화 함수를 적용합니다.
이 함수는 음수를 0으로 바꾸고, 양수는 그대로 둡니다.
요약하자면,
Convolutional Layer는 CNN에서 입력 데이터의 특징을 추출하는 중요한 레이어로, Convolution Mask(필터)를 사용해 Convolution 연산을 수행하고, ReLU 활성화 함수를 적용하여 이미지의 중요한 패턴을 감지합니다.
Convolution Mask(필터)의 가중치는 학습 과정을 통해 조정됩니다.
Convolved Feature가 뭔가요?
컨볼루션 연산을 통해 얻어진 결과를 말합니다. 입력 데이터에 필터(Convolution Mask)를 적용한 결과로 생성된 새로운 데이터. 흔히 특징 맵(Feature Map)이라고도 불립니다.
Convolitional layer의 각각 과정을 시각화할 수는 없나요?
시각화는 할 수 있지만, 시각화를 해도 픽셀로 표현이 되기 때문에 큰 의미는 존재하지 않습니다.
아래는 시각화 코드와 그 결과입니다.
코드 보기

사용 이유

Convolutional Layer
이미지의 중요한 부분을 찾아내고, 연산량을 줄이며, 다양한 특징을 단계적으로 학습할 수 있기 때문에
Convolutional Layer를 사용하는 이유는 이미지의 중요한 부분을 찾아내고, 연산량을 줄이며, 다양한 특징을 단계적으로 학습할 수 있기 때문입니다.
이유
설명
이미지의 중요한 부분을 찾아냄
Convolutional Layer는 필터를 사용해 이미지의 중요한 특징(예: 경계선, 모서리 등)을 추출합니다. 이는 이미지의 특정 패턴을 효과적으로 감지하고 분석하는 데 유용합니다.
연산량 감소
입력 이미지의 모든 픽셀을 직접 학습하는 Fully Connected Layer와 달리, Convolutional Layer는 지역적으로 연결된 필터를 사용하여 연산량을 줄입니다. 왜냐하면 주로 입력 데이터의 공간적 구조를 효율적으로 활용하고, 파라미터 수를 줄이기 때문입니다. 이는 학습 속도를 높이고, 메모리 사용량을 줄입니다.
단계적 특징 학습
여러 Convolutional Layer를 쌓으면, 초기 레이어는 단순한 특징(예: 엣지)을, 후속 레이어는 더 복잡한 특징(예: 모양, 객체 등)을 학습할 수 있습니다. 이는 모델이 점진적으로 더 추상적인 특징을 학습할 수 있도록 도와줍니다.
이미지 데이터는 보통 높이(height), 너비(width), 색상 채널(color channels)로 구성된 3차원 형상을 가집니다.
Convolutional Layer는 이러한 3차원 형상을 유지하며, 각 채널별로 필터를 적용하여 특징을 추출합니다.

사용 방법

TensorFlow (Keras)

PyTorch

알아 두면 좋은 정보

Convolution Mask(필터) 크기와 개수

보통 3x3, 5x5, 7x7 등 다양한 크기의 Convolution Mask(필터)를 사용합니다.
작은 Convolution Mask(필터)는 더 미세한 특징을 추출하는 반면, 큰 Convolution Mask(필터)는 더 넓은 영역의 특징을 포착합니다.
각 Convolutional Layer에 여러 개의 Convolution Mask(필터)를 적용하여 다양한 특징 맵을 생성합니다.
Convolution Mask(필터) 개수가 많을수록 더 많은 정보를 추출할 수 있지만, 연산량도 증가합니다.

Stride와 Padding

Stride

Convolution Mask(필터)가 이동하는 간격을 의미합니다.
Stride가 클수록 출력 특징 맵의 크기가 작아지고, 연산량이 줄어듭니다.

Padding

입력 데이터의 가장자리에 값을 추가하여 필터가 경계에서도 연산을 수행할 수 있도록 합니다.
보통 'same' padding(출력 크기가 입력 크기와 같음)과 'valid' padding(출력 크기가 줄어듦)을 사용합니다.

미니퀘스트

1번 미니퀘스트 - CIFAR-10 데이터셋을 사용한 컨볼루션 연산 실습

Convolved Feature가 뭔가요?
CIFAR-10은 컴퓨터 비전 및 기계 학습 분야에서 널리 사용되는 이미지 데이터셋입니다.

CIFAR-10의 주요 특징:

1.
데이터셋 구성:
이미지 개수: 총 60,000개의 컬러 이미지가 포함되어 있습니다.
훈련용 이미지: 50,000개
테스트용 이미지: 10,000개
2.
이미지 크기:
각 이미지는 32x32 픽셀 크기의 RGB 컬러 이미지입니다.
3.
클래스:
10개의 상호 배타적인 클래스(범주)로 구성되어 있습니다.
각 클래스는 6,000개의 이미지로 이루어져 있습니다.
4.
클래스 목록:
비행기 (airplane)
자동차 (automobile)
새 (bird)
고양이 (cat)
사슴 (deer)
개 (dog)
개구리 (frog)
말 (horse)
배 (ship)
트럭 (truck)

문제 설명

1.
CIFAR-10 데이터셋 불러오기
TensorFlow/Keras 또는 PyTorch를 사용하여 CIFAR-10 데이터셋을 불러옵니다.
# CIFAR-10 데이터셋 불러오기 (X_train, y_train), (X_val, y_val) = datasets.cifar10.load_data()
Python
복사
2.
데이터셋 전처리
이미지 데이터는 [0, 1] 범위로 정규화하고, 레이블은 원-핫 인코딩합니다.
# 데이터셋 전처리 X_train, X_val = X_train / 255.0, X_val / 255.0 y_train, y_val = tf.keras.utils.to_categorical(y_train, 10), tf.keras.utils.to_categorical(y_val, 10)
Python
복사
3.
간단한 CNN 모델 정의
입력 이미지에서 특징을 추출하는 간단한 CNN 모델을 정의합니다.
4.
모델 훈련
훈련 데이터셋을 사용하여 모델을 훈련합니다.
5.
모델 평가
검증 데이터셋을 사용하여 모델 성능을 평가합니다.
6.
결과 출력
모델의 정확도를 출력합니다.

코드

import tensorflow as tf from tensorflow.keras import datasets, layers, models import numpy as np # CIFAR-10 데이터셋 불러오기 (X_train, y_train), (X_val, y_val) = datasets.cifar10.load_data() # 데이터셋 전처리 X_train, X_val = X_train / 255.0, X_val / 255.0 y_train, y_val = tf.keras.utils.to_categorical(y_train, 10), tf.keras.utils.to_categorical(y_val, 10) # 간단한 CNN 모델 정의 model = models.Sequential([ layers.Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu', padding='same'), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(512, activation='relu'), layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 모델 훈련 model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val)) # 모델 평가 val_loss, val_accuracy = model.evaluate(X_val, y_val) print(f"Validation Accuracy: {val_accuracy:.2f}%")
Python
복사

코드 설명

2번 미니퀘스트 - MNIST 데이터셋을 사용한 컨볼루션 연산 실습

문제 설명

1.
MNIST 데이터셋 불러오기
TensorFlow/Keras 또는 PyTorch를 사용하여 MNIST 데이터셋을 불러옵니다.
# MNIST 데이터셋 불러오기 (X_train, y_train), (X_val, y_val) = datasets.mnist.load_data()
Python
복사
2.
데이터셋 전처리
이미지 데이터는 [0, 1] 범위로 정규화합니다.
# 데이터셋 전처리 X_train, X_val = X_train[..., np.newaxis] / 255.0, X_val[..., np.newaxis] / 255.0
Python
복사
3.
간단한 CNN 모델 정의
입력 이미지에서 특징을 추출하는 간단한 CNN 모델을 정의합니다.
4.
모델 훈련
훈련 데이터셋을 사용하여 모델을 훈련합니다.
5.
모델 평가
검증 데이터셋을 사용하여 모델 성능을 평가합니다.
6.
결과 출력
모델의 정확도를 출력합니다.

코드

import tensorflow as tf from tensorflow.keras import datasets, layers, models # MNIST 데이터셋 불러오기 (X_train, y_train), (X_val, y_val) = datasets.mnist.load_data() # 데이터셋 전처리 X_train, X_val = X_train[..., np.newaxis] / 255.0, X_val[..., np.newaxis] / 255.0 # 간단한 CNN 모델 정의 model = models.Sequential([ layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(512, activation='relu'), layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 모델 훈련 model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val)) # 모델 평가 val_loss, val_accuracy = model.evaluate(X_val, y_val) print(f"Validation Accuracy: {val_accuracy:.2f}%")
Python
복사

코드 설명

미니퀘스트 답안지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.