※ CNN(Convolutional neural network)
- 데이터로부터 직접 학습하는 딥러닝의 신경망 아키텍처
- 영상에서 객체, 클래스, 범주 인식을 위한 패턴을 찾을 때 특히 유용함
- 오디오, 시계열 및 신호 데이터를 분류하는 데도 매우 효과적
1. CNN 구조
- 복잡해 보이지만 아래 4가지만 기억하자.
① input_shape: 분석 단위인 이미지 한 장의 크기(픽셀 사이즈, 가로*세로*채널)
- 흑백: 채널 = 1
- 컬러: 채널 = 3 (RGB 3개이므로)
② Convolutional Layer: 필터로 지역적인 특성(feature)을 뽑는 과정
③ Max pooling Layer: 뽑은 특징을 요약(압축)
④ 펼쳐서(Flatten), Dense Layer에 연결
2. CNN 코드
2.1. ConvNet
- ConvNet (특히 Conv2D): 이미지 분석에 주로 사용
- 데이터에 담겨 있는 지역적(Local)특징을 추출
- 필터(커널): 개수 32개
- 2차원으로 이동하며 Feature Map 구성
- kernel_size = (3, 3): 세로 3, 가로 3 을 의미
- 가로세로 길이가 같으면 kernel_size = 3 으로 입력해도 된다.
- Stride: 몇 칸 씩 이동할 것인지 지정
- strides = (1, 1): 가로 1칸, 세로 1칸 이동
- strides = 1: 가로세로 1칸 씩 이동 (기본값)
- Size 축소: 5x5 → 3x3
- 만약 Size를 유지하려면 padding 옵션 사용
- Padding
- Size가 유지되도록 이미지 둘레에 0으로 덧대기
- Input: 5x5 → output: 5x5
- padding = 'same'
- MaxPooling
- 출력 데이터의 크기를 줄이거나 특정 데이터를 강조하기 위해 사용
- pooling_size: 풀링 크기 행 x 열
- strides: 생략하면 pool_size와 동일
- 출력 데이터 크기: Input Size // Pooling Size (나머지는 버림)
- Flatten과 Dense Layer
- CNN + MaxPooling Layer로 특징을 추출한 후에,
- 최종 예측 결과로 뽑기 위해서는 (1차원 혹은 단일값)
- Dense Layer로 연결해야 한다.
- CNN 구조와 코드 전체
2.2. 실습: MNIST
- 실습: 직접 숫자를 그려서 입력하고, 잘 맞추는지 확인
- 직접 그린 숫자 목록
- 위 이미지는 순서대로 각각 4, 2, 8, 8, 7을 의도하고 그린 그림이다.
- 생성한 모델은 아래와 같다.
# 메모리 정리
clear_session()
# 모델 선언
model3 = Sequential([Input(shape = (28, 28, 1)),
Conv2D(32, kernel_size = 3, padding='same', activation='relu'), # strides = 1(기본값,1)
MaxPooling2D(pool_size = 2 ), # strides = 2(기본값이 pool_size 동일)
Conv2D(64, kernel_size = 3, padding='same', activation='relu'),
MaxPooling2D(pool_size = 2 ),
Flatten(),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
# 모델 요약
model3.summary()
# 컴파일
model3.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy')
# 학습
hist3 = model3.fit(x_train, y_train, epochs = 10, validation_split=0.2, verbose=0).history
# 예측
pred3 = model3.predict(x_val)
pred3 = pred3.argmax(axis=1)
# 평가
print(accuracy_score(y_val,pred3))
print('-'*60)
print(confusion_matrix(y_val, pred3))
print('-'*60)
print(classification_report(y_val, pred3))
※ 약 0.99의 정확도를 가진 모델이 생성됨
- 위 5개의 이미지를 업로드 후 예측했을 때 각각 아래의 순서대로 예측함
- 4를 의도한 그림 → 4
- 2를 의도한 그림 → 2
- 8을 의도한 그림1 → 2 (o 두개 사이의 간격이 너무 멀었던 것이 원인인듯)
- 8을 의도한 그림2 → 8
- 7을 의도한 그림 → 7
'에이블스쿨 6기 DX 트랙 > 일일 복습' 카테고리의 다른 글
딥러닝 심화: Object Detection (0) | 2024.11.08 |
---|---|
딥러닝 2일차 (0) | 2024.11.06 |
딥러닝 1일차 (0) | 2024.10.30 |
머신러닝 - 비지도 학습 1일차 (0) | 2024.10.21 |
성능 평가 (0) | 2024.10.17 |