Convolutional Neural Network (CNN)

5단 분석법

순서
분석
단어
내용
1
일반 명사
Convolutional
대단히 복잡한 것, 주름
Neural
신경의
Network
CNN
대단히 복잡한 신경망
2
고유 명사
CNN
여러 개의 Convolutional Layer, Pooling Layer, Fully Connected Layer 들로 구성된 신경망
3
사용 이유
CNN
이미지와 같은 2D 데이터의 특징을 자동으로 추출하고 학습하여 높은 성능을 발휘하기 위해서
4
사용 방법
CNN
1. 라이브러리 임포트 2. 모델 생성 3. 모델 컴파일 4. 모델 훈련 5. 모델 평가
5
다른 기술과의 비교
CNN
-

정의

일반 명사

Convolutional
대단히 복잡한 것, 주름
Neural
신경의
Network
CNN
대단히 복잡한 신경망
Convolutional은 대단히 복잡한 것, 주름을 뜻합니다.
Neural은 신경의 라는 의미를 가지고 있습니다.
Network는 망이라는 뜻을 가지고 있습니다.
합성곱이 무엇인가요?
合 (합할 합):
"합"은 "합하다", "합치다"를 의미합니다. 여기서는 두 개 이상의 요소를 하나로 합치는 것을 뜻합니다.
1.
成 (이룰 성):
"성"은 "이루다", "만들다"를 의미합니다. 여기서는 어떤 결과를 만들어 내는 과정을 뜻합니다.
2.
:
곱셈의 곱을 의미하며, 두 수를 곱하는 연산을 뜻합니다.

한자 풀이:

"합성곱"은 여러 요소를 합쳐서 새로운 결과를 만들어내는 곱셈 연산이라고 이해할 수 있습니다. 이는 수학적 연산에서 두 함수를 결합하여 새로운 함수를 만들어내는 과정을 설명합니다.
이 단어들을 조합한 CNN은 대단히 복잡한 신경망이라고 추측해 볼 수 있습니다.
정말 그런 의미인지, 고유 명사를 한 번 알아볼까요?

고유 명사

CNN
여러 개의 Convolutional Layer, Pooling Layer와 Fully Connected Layer 들로 구성된 신경망
CNN(합성곱 인공신경망)은 여러 개의 Convolutional Layer, Pooling Layer, Fully Connected Layer 들로 구성된 신경망 입니다.
Artificial Neural Network에서 Fully Connected Layer(FC)만으로 구성된 모델은 입력 데이터를 1차원 배열 형태로 받습니다.
그러나 한 장의 컬러 사진은 세 차원 데이터(높이, 너비, 색상 채널)를 가지고 있습니다.
이러한 사진 데이터를 Fully Connected Neural Network에 입력하기 위해서는 3차원 데이터를 1차원으로 Flatten(평면화) 시켜야 합니다.
하지만 이 과정에서 이미지의 공간 정보가 손실되기 때문에, 공간 정보 유실로 인해 특징을 효과적으로 추출하기 어려워지고, 학습의 효율성과 정확도에도 한계가 생깁니다.
이러한 문제를 해결하기 위해 이미지의 공간 정보를 유지하면서 학습할 수 있는 모델이 바로 Convolutional Neural Network(이하 CNN)입니다.
CNN 모델은 이미지의 특징을 추출하는 Feature Learning(특징 학습)과 클래스를 분류하는 Classification(분류)부분으로 나눌 수 있습니다.
이미지의 특징을 추출하는 부분은 Convolutional Layer와 Pooling Layer로 구성됩니다.
Classification 부분에는 이미지 분류를 위한 Fully Connected Layer가 추가됩니다.
이 때, 특징 맵을 배열 형태로 변환하는 Flatten Layer가 Convolution Layer와 Fully Connected Layer 사이에 위치합니다.
Flatten Layer는 3차원 데이터를 1차원 배열로 변환하여 Fully Connected Layer에 입력할 수 있게 합니다.
이와 같이 CNN은 이미지의 공간 정보를 유지하며 효과적으로 특징을 추출하고 학습할 수 있는 구조를 갖추고 있습니다.
주요 구성 요소
설명
컨볼루션 레이어 (Convolutional Layer)
입력 데이터에 필터를 적용하고, 활성화 함수를 반영하여 특징을 추출하는 레이어입니다. 필터를 통해 이미지의 중요한 패턴을 감지합니다.
풀링 레이어 (Pooling Layer)
Convolution Layer 다음에 위치할 수 있는 선택적 레이어로, 특징 맵을 다운샘플링하여 연산량을 줄이고 모델의 일반화 성능을 높입니다. 대표적으로 최대 풀링(Max Pooling)과 평균 풀링(Average Pooling)이 있습니다.
완전 연결 레이어 (Fully Connected Layer)
추출된 특징을 기반으로 최종 분류를 수행합니다. 전통적인 신경망과 유사하게 모든 뉴런이 서로 연결된 구조를 가집니다.

사용 이유

CNN
이미지와 같은 2D 데이터의 특징을 자동으로 추출하고 학습하여 높은 성능을 발휘하기 위해서
이유
내용
공간적 구조 유지
이미지와 같은 2D 데이터(흑백)의 공간적 구조를 유지하여 특징을 효과적으로 추출합니다.
특징 추출 자동화
필터(커널)를 사용해 자동으로 중요한 특징을 학습하고 추출합니다.
파라미터 효율성
지역 연결과 가중치 공유를 통해 파라미터 수를 줄여 계산 효율성을 높입니다.
우수한 성능
이미지 분류, 객체 탐지 등 시각적 데이터 처리에서 뛰어난 성능을 발휘합니다.
기존 Neural Network의 구조는 Input Layer, Hidden Layer, Output Layer를 이용해 구성됩니다.
기존 Neural Network의 문제점은 아래와 같습니다.
문제점
설명
3차원 데이터의 형태와 특성 제거
28 x 28 크기의 이미지를 완전 연결 신경망(Fully Connected Neural Network, FCNN)에 입력할 때, 이 이미지는 [1, 784]와 같은 1차원 데이터로 변환됩니다. 이 과정에서 3차원 이미지 데이터가 가지는 각 요소의 위치에 따른 특성을 잃게 됩니다. 결과적으로 이미지의 공간적 구조나 패턴 정보가 손실될 수 있습니다.
학습 파라미터 증가
FCNN은 많은 Weight(가중치)와 Bias(편향)이 필요합니다. 예를 들어, 28 x 28 크기의 이미지는 784개의 입력 노드를 가지며, 은닉층의 노드가 50개인 층이 3개인 경우, 총 44,860개의 파라미터(가중치 44,700개 + 편향 160개)가 필요합니다. 이는 계산 비용과 메모리 사용량을 증가시키는 원인이 됩니다. 입력층(784)과 첫 번째 은닉층(50) 사이의 가중치: 784 × 50 = 39,200 / 첫 번째 은닉층의 편향: 50 첫 번째 은닉층(50)과 두 번째 은닉층(50) 사이의 가중치: 50 × 50 = 2,500 / 두 번째 은닉층의 편향: 50 두 번째 은닉층(50)과 세 번째 은닉층(50) 사이의 가중치: 50 × 50 = 2,500 / 세 번째 은닉층의 편향: 50 세 번째 은닉층(50)과 출력층(10) 사이의 가중치: 50 × 10 = 500 / 출력층의 편향: 10 총 파라미터 수 이제 각 층 사이의 가중치와 편향의 수를 모두 더합니다: 39,200+50+2,500+50+2,500+50+500+10=44,860
CNN은 Convolutional Layer와 Pooling Layer가 추가됩니다.
그래서, 기존 Neural Network의 문제였던 3차원 데이터의 형태와 특성이 제거되는 것을 해결했고, 학습 파라미터가 증가되는 문제점도 해결했습니다.
기존 Neural Network(완전 연결 신경망)는 입력 데이터의 구조적 특성을 유지하지 못하고, 많은 학습 파라미터로 인해 과적합과 계산 비용 증가 문제를 겪습니다. 반면, CNN은 다음과 같은 장점을 통해 이러한 문제를 해결합니다:
1.
3차원 데이터 유지: Convolutional Layer는 필터를 사용하여 입력 이미지의 지역적 특성을 학습합니다. 이는 이미지의 공간적 구조를 유지하며, 중요한 패턴 정보를 보존합니다.
2.
파라미터 감소: Pooling Layer는 특징 맵의 크기를 줄여 연산량을 감소시키고, 중요한 정보만을 남겨 모델의 일반화 성능을 향상시킵니다. 이는 학습 파라미터의 수를 줄여 계산 비용과 메모리 사용량을 효율적으로 관리할 수 있게 합니다.
CNN은 입력 레이어의 데이터는 3차원 형태를 유지합니다.
입력 자체를 3차원 데이터 형태로 받아 Convolutional Layer를 거쳐 학습을 진행합니다.
이렇게 함으로써 이미지의 공간적 구조와 패턴 정보를 유지할 수 있습니다.
또한, FCNN과 다르게 필터를 공유 파라미터로 사용하기 때문에 학습 파라미터가 적습니다.
입력층에 있는 하나의 퍼셉트론에도 n개의 데이터를 입력할 수 있는거죠?
신경망의 기본 원리상, 입력층의 각 노드는 일반적으로 하나의 입력 데이터(특성 값)만 받습니다. 이는 신경망이 입력 데이터의 각 특성을 독립적으로 처리할 수 있도록 하기 위함입니다. 각 입력 노드는 입력 데이터의 하나의 특성 값을 받아들이고, 이를 통해 신경망은 각 특성을 개별적으로 학습합니다. 따라서 입력층의 각 노드는 하나의 입력값을 받아들이도록 설계됩니다.
특성(Feature)란 무엇인가요?
특성은 데이터의 개별 속성 또는 변수입니다. 특성은 모델이 입력으로 받아들이는 데이터의 한 부분으로, 예측 또는 분류 작업을 수행하는 데 중요한 정보를 제공합니다.
이미지 데이터에서의 특성
흑백 이미지: 흑백 이미지의 각 픽셀은 하나의 밝기 값을 가지며, 이는 하나의 특성으로 간주됩니다. 예를 들어, 28x28 크기의 흑백 이미지는 총 784개의 특성을 가집니다.
예: 28x28 크기의 흑백 이미지의 경우, 총 특성 수 = 28 x 28 = 784.
컬러 이미지: 컬러 이미지의 각 픽셀은 세 가지 색상 채널(R, G, B)을 가지며, 각 색상 채널이 하나의 특성으로 간주됩니다. 예를 들어, 28x28 크기의 RGB 이미지는 총 2352개의 특성을 가집니다.
예: 28x28 크기의 RGB 이미지의 경우, 총 특성 수 = 28 x 28 x 3 = 2352.
위 예시에서 출력층의 개수가 10개인 이유가 있나요?
우선 10개는 예시입니다. 이제 설명드리자면 출력 노드의 수는 예측하려는 클래스의 수와 동일합니다. 예를 들어, 손글씨 숫자 인식(MNIST 데이터셋)에서는 0부터 9까지의 숫자를 분류하므로 10개의 클래스를 예측해야 합니다. 따라서 출력층에 10개의 노드가 필요합니다.

사용 방법

CNN
1. 라이브러리 임포트 2. 모델 생성 3. 모델 컴파일 4. 모델 훈련 5. 모델 평가

TensorFlow (Keras)

PyTorch

알아두면 좋은 정보

CNN vs. ANN vs. RNN

CNN (Convolutional Neural Network)

항목
내용
정의
주로 이미지나 영상 처리에 사용되는 신경망. 입력 데이터의 공간적 구조를 유지하며 특징을 추출함.
특징
- 필터(커널)를 통해 특징 자동 추출 - 지역 연결과 가중치 공유로 파라미터 수 감소 - 이미지 분류, 객체 탐지 등에 우수한 성능 발휘
장점
- 2D 데이터의 공간적 특징을 효과적으로 학습 - 계산 효율성이 높아 대규모 데이터 처리 가능
단점
- 시계열 데이터 처리에 부적합 - 복잡한 모델 구조로 인해 학습 시간 증가

ANN (Artificial Neural Network)

항목
내용
정의
가장 기본적인 형태의 신경망. 입력층, 은닉층, 출력층으로 구성됨.
특징
- 모든 노드가 서로 연결된 완전 연결 층으로 구성 - 단순한 구조로 다양한 데이터 유형 처리 가능
장점
- 구현이 비교적 간단하고 이해하기 쉬움 - 다양한 문제에 적용 가능
단점
- 공간적 또는 시계열적 구조를 가진 데이터 처리에 비효율적 - 과적합(overfitting)에 취약

RNN (Recurrent Neural Network)

항목
내용
정의
순차적 데이터 처리에 특화된 신경망. 이전 입력에 대한 정보를 기억하며 다음 입력에 반영함.
특징
- 순환 연결을 통해 시간적 순서 고려 - 시계열 데이터, 자연어 처리 등에 사용
장점
- 순차적 데이터의 시간적 의존성 학습 가능 - 문장 생성, 기계 번역 등 자연어 처리에 강점
단점
- 긴 시퀀스 데이터 처리 시 기울기 소실 문제(vanishing gradient problem) 발생 - 학습 속도가 느리고 계산 비용이 높음

3가지 비교 요약

신경망 유형
주 사용 분야
장점
단점
CNN
이미지, 영상 처리
공간적 특징 학습, 계산 효율성
시계열 데이터 처리 부적합
ANN
다양한 문제
구현 간단, 다양한 문제 적용
구조적 데이터 처리 비효율적
RNN
시계열 데이터, 자연어 처리
시간적 의존성 학습
긴 시퀀스 데이터 처리 어려움

미니퀘스트

1번 미니퀘스트 - CNN, ANN, RNN 모델 생성 및 비교

CNN, ANN, RNN 모델을 각각 생성하고, 간단한 데이터셋에 대해 학습시켜 성능을 비교해 보세요.

문제 설명

1.
필요한 라이브러리 임포트
2.
가상 데이터셋 생성 및 전처리
예제데이터
# 가상 데이터셋 생성 및 전처리 num_classes = 10 input_shape = (32, 32, 3) x_train = np.random.random((1000, 32, 32, 3)) y_train = np.random.randint(num_classes, size=(1000, 1)) x_test = np.random.random((200, 32, 32, 3)) y_test = np.random.randint(num_classes, size=(200, 1)) y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes)
Python
복사
3.
CNN 모델 생성 및 학습
4.
ANN 모델 생성 및 학습
5.
RNN 모델 생성 및 학습
6.
각 모델의 성능 비교

코드

# 필요한 라이브러리 임포트 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, SimpleRNN from tensorflow.keras.utils import to_categorical import numpy as np # 가상 데이터셋 생성 및 전처리 num_classes = 10 input_shape = (32, 32, 3) x_train = np.random.random((1000, 32, 32, 3)) y_train = np.random.randint(num_classes, size=(1000, 1)) x_test = np.random.random((200, 32, 32, 3)) y_test = np.random.randint(num_classes, size=(200, 1)) y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes) # CNN 모델 생성 및 학습 cnn_model = Sequential([ Input(shape=input_shape), Conv2D(32, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dense(256, activation='relu'), Dense(num_classes, activation='softmax') ]) cnn_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) cnn_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.1) # ANN 모델 생성 및 학습 ann_model = Sequential([ Input(shape=input_shape), Flatten(), Dense(512, activation='relu'), Dense(256, activation='relu'), Dense(num_classes, activation='softmax') ]) ann_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ann_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.1) # RNN 모델 생성 및 학습 rnn_input_shape = (32, 32 * 3) # 2D 이미지를 1D 시퀀스로 변환 x_train_rnn = x_train.reshape((1000, 32, 32 * 3)) x_test_rnn = x_test.reshape((200, 32, 32 * 3)) rnn_model = Sequential([ Input(shape=rnn_input_shape), SimpleRNN(128, activation='relu'), Dense(num_classes, activation='softmax') ]) rnn_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) rnn_model.fit(x_train_rnn, y_train, epochs=10, batch_size=64, validation_split=0.1) # 각 모델의 성능 비교 cnn_loss, cnn_accuracy = cnn_model.evaluate(x_test, y_test) ann_loss, ann_accuracy = ann_model.evaluate(x_test, y_test) rnn_loss, rnn_accuracy = rnn_model.evaluate(x_test_rnn, y_test) print(f"CNN Test Accuracy: {cnn_accuracy}") print(f"ANN Test Accuracy: {ann_accuracy}") print(f"RNN Test Accuracy: {rnn_accuracy}")
Python
복사

결과 (예시)

CNN Test Accuracy: 0.08
CNN 모델은 이미지 데이터의 공간적 특징을 학습하는 데 뛰어난 성능을 보입니다.
그러나 첫 번째 문제에서는 랜덤으로 생성된 가상 데이터셋을 사용하였기 때문에, 의미 있는 패턴을 학습하기 어렵습니다. 따라서 정확도가 낮게 나왔습니다.
ANN Test Accuracy: 0.09
ANN 모델은 모든 노드가 완전히 연결된 구조로, 데이터의 구조적인 정보를 잘 학습하지 못합니다.
이에 따라, CNN 모델과 마찬가지로 랜덤 데이터셋에서 좋은 성능을 발휘하지 못하여 낮은 정확도를 보입니다.
RNN Test Accuracy: 0.10
RNN 모델은 순차적 데이터 처리에 특화되어 있으며, 이미지와 같은 공간적 데이터를 처리하는 데는 적합하지 않습니다.
랜덤 데이터셋에서 의미 있는 패턴을 학습하지 못해 정확도가 낮습니다.

코드 설명

2번 미니퀘스트 - CIFAR-10 데이터셋을 사용한 모델 비교

CIFAR-10 데이터셋을 사용하여 CNN, ANN, RNN 모델의 성능을 비교해 보세요.

문제 설명

1.
CIFAR-10 데이터셋 로드 및 전처리
CIFAR-10 데이터셋을 로드하고 정규화합니다.
# CIFAR-10 데이터셋 로드 및 전처리 from tensorflow.keras.datasets import cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes)
Python
복사
2.
CNN, ANN, RNN 모델 생성
CNN, ANN, RNN 모델을 각각 생성합니다.
3.
각 모델 학습
각 모델을 동일한 데이터셋으로 학습시킵니다.
4.
성능 평가 및 비교
테스트 데이터셋을 사용하여 각 모델의 성능을 평가하고 비교합니다.

코드

# CIFAR-10 데이터셋 로드 및 전처리 from tensorflow.keras.datasets import cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes) # 모델 생성 함수 def create_cnn_model(input_shape, num_classes): model = Sequential([ Input(shape=input_shape), Conv2D(32, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dense(256, activation='relu'), Dense(num_classes, activation='softmax') ]) return model def create_ann_model(input_shape, num_classes): model = Sequential([ Input(shape=input_shape), Flatten(), Dense(512, activation='relu'), Dense(256, activation='relu'), Dense(num_classes, activation='softmax') ]) return model def create_rnn_model(input_shape, num_classes): model = Sequential([ Input(shape=input_shape), SimpleRNN(128, activation='relu'), Dense(num_classes, activation='softmax') ]) return model cnn_model = create_cnn_model((32, 32, 3), num_classes) ann_model = create_ann_model((32, 32, 3), num_classes) rnn_model = create_rnn_model((32, 32 * 3), num_classes) # 모델 학습 cnn_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ann_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) rnn_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) cnn_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.1) ann_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.1) x_train_rnn = x_train.reshape((x_train.shape[0], 32, 32 * 3)) x_test_rnn = x_test.reshape((x_test.shape[0], 32, 32 * 3)) rnn_model.fit(x_train_rnn, y_train, epochs=10, batch_size=64, validation_split=0.1) # 성능 평가 및 비교 cnn_loss, cnn_accuracy = cnn_model.evaluate(x_test, y_test) ann_loss, ann_accuracy = ann_model.evaluate(x_test, y_test) rnn_loss, rnn_accuracy = rnn_model.evaluate(x_test_rnn, y_test) print(f"CNN Test Accuracy: {cnn_accuracy}") print(f"ANN Test Accuracy: {ann_accuracy}") print(f"RNN Test Accuracy: {rnn_accuracy}")
Python
복사

결과 (예시)

CNN Test Accuracy: 0.69
CNN 모델은 CIFAR-10 데이터셋에서 공간적 특징을 잘 학습하여 비교적 높은 정확도를 보입니다.
CIFAR-10은 실제 이미지 데이터셋이므로 CNN의 강점을 발휘할 수 있습니다.
ANN Test Accuracy: 0.46
ANN 모델은 CIFAR-10 데이터셋에서 CNN보다는 낮은 성능을 보입니다.
이미지 데이터의 공간적 정보를 학습하지 못하기 때문에 CNN에 비해 정확도가 떨어집니다.
RNN Test Accuracy: 0.38
RNN 모델은 순차적 데이터에 특화되어 있어 이미지 데이터 처리에는 적합하지 않습니다.
이미지 데이터는 주로 공간적 구조를 가지고 있어, RNN의 시퀀스 처리 방식으로는 효과적인 학습이 어렵습니다.
따라서 CIFAR-10 데이터셋에서도 성능이 낮게 나왔습니다.
RNN은 주로 시계열 데이터나 자연어 처리에 강점을 보입니다.

코드 설명

미니퀘스트 답안지

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