PYTHON/딥러닝
[PYTHON] 합성곱 신경망 (Convolutional Neural Network, CNN)
G허니
2024. 4. 28. 21:40
합성곱 신경망(Convolutional Neural Network, CNN)은 이미지 처리에 주로 사용되는 딥러닝 알고리즘입니다. 주로 이미지 인식, 객체 감지, 얼굴 인식 등과 같은 컴퓨터 비전 작업에 적용됩니다. CNN은 입력 데이터의 공간적 구조를 이해하고 그에 따라 가중치를 학습하여 이미지 내의 패턴을 탐지하는 데 특히 유용합니다.
알고리즘 동작 방식:
- 합성곱 층(Convolutional Layer): 입력 이미지와 여러 개의 필터(커널)를 합성곱 연산하여 특징 맵(feature map)을 생성합니다. 이 과정은 입력 이미지의 특정 패턴이나 특징을 감지하는 역할을 합니다.
- 활성화 함수 적용: 각 합성곱 연산 결과에 비선형 활성화 함수(주로 ReLU)를 적용하여 비선형성을 도입합니다.
- 풀링 층(Pooling Layer): 풀링 연산을 통해 특징 맵의 크기를 줄입니다. 주로 최대 풀링(Max Pooling)이 사용되며, 특징을 유지하면서 공간적 차원을 감소시킵니다.
- 완전 연결층(Fully Connected Layer): 완전 연결층에서는 이전 층에서 추출된 특징을 사용하여 분류나 회귀와 같은 최종 작업을 수행합니다. 이 층은 전통적인 인공 신경망과 유사한 방식으로 동작합니다.
- 소프트맥스 함수: 분류 문제의 경우, 출력층에는 소프트맥스 활성화 함수를 적용하여 각 클래스에 대한 확률을 계산합니다.
주요 특징:
- 공간적 구조 인식: CNN은 이미지의 공간적 구조를 인식하는 데 특히 효과적입니다. 이는 픽셀 간의 공간적 관계를 보존하여 특징을 추출하기 때문입니다.
- 파라미터 공유(Parameter Sharing): 합성곱 연산에서는 필터를 이용하여 이미지를 슬라이딩하면서 연산을 수행하는데, 이때 필터의 가중치가 이미지의 모든 위치에서 공유됩니다. 이는 모델의 파라미터 수를 줄이고 효율적인 학습을 가능하게 합니다.
- 피처 추출: CNN은 이미지 내에서 다양한 수준의 추상적인 피처를 추출할 수 있습니다. 초기 층은 단순한 에지나 질감과 같은 저수준 피처를 추출하고, 뒤로 갈수록 더 추상적이고 의미 있는 피처를 추출합니다.
적용 분야:
- 이미지 분류: CNN은 이미지의 클래스 레이블을 예측하는 데 사용됩니다. 예를 들어, 고양이와 강아지를 구분하는 문제 등에 활용됩니다.
- 객체 감지: CNN은 이미지 내에서 특정 객체의 위치와 경계를 찾는 데 사용됩니다. 이는 자율 주행 자동차나 보안 시스템 등에서 활용될 수 있습니다.
- 얼굴 인식: CNN은 얼굴 인식 및 감정 분석과 같은 얼굴 관련 작업에도 사용됩니다.
모델링
- CNN 모델의 기본 구조
- Conv2D : 지역적인 특징 도출
- MaxPooling : 요약
- Flatten : 1차원으로 펼치기
- Dense : Output Layer
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
from keras.backend import clear_session
from keras.optimizers import Adam
clear_session()
model = Sequential([Conv2D(16, kernel_size = 3, input_shape=(28, 28, 1),
padding='same', activation='relu'), # strides = 1(기본값,1)
MaxPooling2D(pool_size = 2 ), # strides = 2(기본값이 pool_size 동일)
Flatten(),
Dense(10, activation='softmax')
])
model.summary()
model.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy')
history = model.fit(x_train, y_train, epochs = 10, validation_split=0.2).history
pred = model.predict(x_val)
pred_1 = pred.argmax(axis=1)
print(accuracy_score(y_val,pred_1))
print(confusion_matrix(y_val, pred_1))
print(classification_report(y_val, pred_1))
CNN은 이미지 처리에 주로 사용되는 딥러닝 알고리즘으로, 이미지 분류, 객체 감지, 얼굴 인식 등 다양한 컴퓨터 비전 작업에 적용됩니다. 공간적 구조를 인식하고 효율적으로 특징을 추출하여 높은 정확도와 성능을 제공합니다.