에이블스쿨 6기 DX 트랙/일일 복습

딥러닝 4일차

d061120 2024. 11. 4. 19:10

※ CNN(Convolutional neural network)

  • 데이터로부터 직접 학습하는 딥러닝의 신경망 아키텍처
  • 영상에서 객체, 클래스, 범주 인식을 위한 패턴을 찾을 때 특히 유용함
  • 오디오, 시계열 및 신호 데이터를 분류하는 데도 매우 효과적

1. CNN 구조

CNN 구조

- 복잡해 보이지만 아래 4가지만 기억하자.

① input_shape: 분석 단위인 이미지 한 장의 크기(픽셀 사이즈, 가로*세로*채널)

  • 흑백: 채널 = 1
  • 컬러: 채널 = 3 (RGB 3개이므로)

① input_shape

 

② Convolutional Layer: 필터로 지역적인 특성(feature)을 뽑는 과정

② Convolutional Layer

 

③ Max pooling Layer: 뽑은 특징을 요약(압축)

③ Max pooling Layer

 

④ 펼쳐서(Flatten), Dense Layer에 연결

④ Flatten

 

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을 의도한 그림1
8을 의도한 그림2

 

7을 의도한 그림

  • 위 이미지는 순서대로 각각 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