본문 바로가기

파이썬 & 머신러닝과 딥러닝

18일차 - 합성곱 신경망의 개념, 2차원 합성곱, 3차원 합성곱, 합성곱 신경망 시각화

 

합성곱 신경망 (Convolutional Neural Network, CNN) 

고양이의 눈에서 답을 얻다

전체 뉴런을 활용하지 않고 이미지에 따라 고앵이의 뉴런이 활성화된다. -> CNN 만들어짐

 

  CNN은 이미지를 위해 사용되는 인공신경망의 한 종류 

 

  입력 이미지로부터 특징을 추출하여 입력 이미지가 어떤 이미지인지 클래스를 분류함

-> 기존의 일반 신경망은 한픽셀 한픽셀 정보가 동등하게 중요했지만

CNN은 이미지의 모든 특성을 고려하지 않고(전체 뉴런을 활용하지 않고) 

특징점을 찾아 부분부분의 특징을 찾아내는 신경망

 

  일반 신경망의 경우, 이미지 전체를 하나의 데이터로 입력하기 때문에 (뉴런을 100% 써서)

이미지의 특성을 찾지 못하고, 이미지의 위치가 약간 변경되거나 왜곡된

경우 올바른 성능을 기대할 수 없음 -> 데이터의 형상이 무시됨

 

  CNN은 이미지를 하나의 데이터가 아닌 여러 개로 분할하여 처리함

-> 이미지가 왜곡되더라도 이미지의 부분적 특성을 추출할 수 있어 올바른 성능을 낼 수 있음

 

밀집층은 784개의 일차원 이미지라고 생각하면 모든 각 특성에 뉴런의 가중치(w)를 곱하고 절편 더하기

 

 

합성곱 층은 2차원 그대로 들어올 수 있지만 일차원이라 생각하면

뉴런 전체를 안넣고 3개 정도만 넣은 다음 각 특성에 뉴런의 가중치 곱하고 절편 더하기

그 후 shift 하여 밑으로 가서 또 출력

 


 

2차원 합성곱

합성곱 신경망(CNN)은 2차원도 그대로 들어와서 진행

-> 곱하고 더한다.

 

 


 

특성맵

 

합성곱 신경망의 결과가 특성맵

곱하고 더한(Convolution 한) 결과를 특성맵에 써준다.

-> (2,2) 출력된 결과가 특성맵

 


 

소벨 필터 (Sobel operator)

: 이미지의 edge를 검출해내는 필터

 

x filter : edge에 걸쳤을 때 큰 값이 나옴

-> 이미지 안과 밖은 0이 나오고 경계에서만 큰 출력 값이 나옴

 

-> 필터에 weight들을 학습시키는 게 목표

소벨 필터처럼 edge 잘 찾아낼 수 있는 값들을 만들어보라고 인공지능에게 시키는 것

 


 

여러 개의 필터

 

  • 필터 == 뉴런
  • 여러 개의 뉴런 == 여러 개의 필터
  • 뉴런 안 weight == 커널

 

 

특성맵이 필터의 개수만큼 여러개 나옴

 


 

패딩 (Padding)

 

패딩을 하지 않으면? 

곱하고 더하는 과정이 픽셀의 값이 weight에 영향을 주는 것임

3이 중요한 정보인데 weight에 한 번밖에 영향을 주지못함.

-> 최대한 모든 픽셀을 공평하게 반영되게 하려고 패딩 사용 -> 0으로 채워넣는다.

 


 

패딩을 할 경우

 

이러한 방식을 Same padding이라 함 (입력의 크기와 특성맵의 크기가 동일)

0으로 채워넣으면 출력도 (4,4) 특성맵으로 나와 사이즈가 유지된다.

 


 

스트라이드

 

몇칸씩 움직일지 결정 (몇칸씩 시프트 할 지 지정)

일반적으로 스트라이드는 1을 사용 (즉, 한 칸씩 움직이는 것이 일반적)

 


 

케라스 합성곱층 생성 

Keras.layers 패키지 아래에 클래스로 구현되어 있음

• Conv2D 클래스

 

keras.layers.Conv2D(필터의 개수, 커널의 크기, 활성화 함수, same padding(생략시 valid padding), strides = 1))

 

필터 : 형태가 2차원으로 바뀐 뉴런이라 생각

stride: 1 : 몇 칸씩 움직일지 지정, 생략하면 1 (일반적으로 생략함)

 


 

풀링 (Pooling) 

  • 합성곱층에서 만든 특성맵의 가로/세로 크기를 줄이는 역할
  • 특성맵의 개수는 줄어들지 않음
  • 풀링에는 가중치가 없음
  • 최대 풀링 vs 평균 풀링

 

-> 각 특성맵을 기준으로 필터를 찍어내듯이 가장 큰 값만을 뽑아냄

특징점을 찾아내게 계속 학습하면서 큰 값을 남기게 학습함

 

 

최대풀링 (일반적으로 풀링의 크기는 2를 사용 (2,2))

• 스트라이드는 풀링의 크기에 따라 자동으로 설정

- (2,2) 풀링: 스트라이드 2 -> 한 번씩만 찍겠다는 의미

- (3,3) 풀링: 스트라이드 3

 

9 7 8 6으로 구성된 특성맵이 나온다

 

 


 

케라스 풀링층 생성

 

Keras.layers 패키지 아래에 클래스로 구현되어 있음

• MaxPooling2D

• AveragePooling2D

 

keras.layers.MaxPooling2D(2)

keras.layers.AveragePooling2D(2)

-> 폴링크기 (2x2)

가로, 세로 크기를 다르게 할 수도 있음 (튜플 사용)


 

합성곱 신명망 구조 정리

 

-> (4,4) 이미지 들어오고 same padding 했다 가정 (필터 거쳤을 때 사이즈 유지)

(3,3) 특성 맵 3개가 나온걸 최대 풀링시 (2,2)로 줄어든 특성맵 3장 나옴

최대값을 뽑아내는 기능

최종적으로 예측하려면 소프트맥스가 필요함


 

3차원 합성곱 

입력의 깊이와 필터의 깊이는 항상 같아야 함 !

 

이미지가 3차원으로 들어오는 경우가 있음 (컬러 이미지일 때)

3차원의 input을 깊게 찌르는 느낌

-> 필터가 3차원이라도 출력은 일차원

 

(흑백일 경우는 reshape를 통해 의미 없는 차원 하나를 넣음)


 

여러 개의 필터가 있는 3차원 합성곱

 

-> 깊이가 5, 10개의 필터가 있으면 깊이 5인애가 10개 있는 것


 

CNN을 이용하여 패션 아이템을 분류해 보자

28x28 이미지

첫번째 conv2d에서 필터 32개 사용

그 후 2x2 max padding 

깊이 유지, 가로 세로는 1/2로 줄어듦

두번째 conv2d는 64개의 필터, 깊이 32 

특성맵은 각 한장의 필터가 만들어내 64개

깊이 64, 7x7로 줄어듦

 

 


 

데이터 준비

 

-> reshape를 해서 28*28*1 로 바꿔주기

(케라스 합성곱 층은 기본적으로 3차원 입력을 기대해 차원 늘리기)

 


 

레이어 만들기

 

첫 번째 합성곱 층

 

-> 3x3x1 필터 생성 (깊이는 자동으로) - 한장의 샘플 기준으로 3차원이니까

-> 스트라이드는 합성곱은 1, 맥스 풀링은 2

kernel_size = (3,3) 가능

 

 

 

두번째 합성곱 층 + 완전 연결층 (출력 층)

 

-> 64개의 필터 사용, kernel_size = (3,3)은 3x3x32 필터 생성 (깊이는 자동으로)

 

 

 

-> 분류를 위한 dense 층 + dropout 층

-> 1차원으로 나오는 특성맵 펼쳐주기

-> 10개의 확률 각각 계산

 


 

model.summary()

-> conv2d

    (28, 28) -> same padding, (32) -> 32개의 필터

-> conv2d 320개 ( 1 * 3X3 * 32개 커널 + 32개 바이어스 = 320)

 

-> conv2d_1 18496개 ( 32 * 3*3 * 64개 커널 + 64개 바이어스 = 18496 )

-> dense layer 313700개 학습 (316*100+100)

 

 


 

plot_model()

 

 


 

결과 확인

 

validation loss 나옴 -> 과대적합


 

검증 세트 점수 확인

(현재 best model이 자동 저장되어 있음)

-> loss률과 accurancy 나옴

 


 

테스트 세트 평가

 

 

검증세트 첫번째 샘플에 대한 클래스별 확률 출력

 


 

실습 1: MNIST data set

 

• 60000개의 샘플 (클래스당 6000 이미지)

• 28*28 해상도 (흑백 이미지)

 

MNIST_실습용 (1).ipynb
0.15MB

 

 

 

 


 

실습 2: CIFAR-10 data set

• 60000개의 샘플 (클래스당 6000 이미지)

• 32*32 해상도 (컬러 이미지)

https://www.cs.toronto.edu/~kriz/cifar.html

 

CIFAR_image_(실습용) (1).ipynb
0.28MB

 

 


사진 출처 : 혼자 공부하는 머신러닝 + 딥러닝 강의자료