[도서완독]Hands On Machine Learning

[HandsOn]14. 합성곱 신경망을 사용한 컴퓨터 비전 - 내용 정리1

입짧은달님 2022. 8. 1. 21:01

어느덧 14과까지 왔다~! 아직 6과나 더 남긴했지만...ㅋㅋㅋ 그래도 1월달에 앞부분 깔짝거리다가 그만 뒀었는데 14화까지 왔네 어떻게 .... ㅋㅋㅋ ㅠㅠ 앞으로 6주만 더 힘내자!! 😍


합성곱 신경망(CNN)은 음성 인식이나 자연어 처리, 이미지 분야에서 많이 사용됨! 

여기서는 이미지 애플리케이션에 초점을 맞출 것임!

 

사실 밑에 이러쿵 저러쿵 책의 내용을 요약해놨지만 책이 너무 어렵게 설명함...

https://wikidocs.net/64066

 

1) 합성곱 신경망(Convolution Neural Network)

합성곱 신경망(Convolutional Neural Network)은 이미지 처리에 탁월한 성능을 보이는 신경망입니다. 하지만 합성곱 신경망으로 텍스트 처리를 하기 위한 시 ...

wikidocs.net

얘가 이해하기 훨씬 쉬움!


14.2 합성곱 층

CNN의 가장 중요한 구성 요소는 합성곱 층 : 첫번 째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장(네모..) 안에 있는 픽셀에만 연결됨.

두번째 합성곱 층도 마찬가지.

https://velog.io/@wlsn404/, 사각 형태의 국부 수용장을 가진 CNN층

지금까지는 이미지를 신경망에 주입하기 전에 1D 배열로 펼쳐야 했지만, CNN은 각 층이 2D로 표현되므로 뉴런을 그에 상응하는 입력과 연결하기가 더 쉬움.

 

https://velog.io/@wlsn404/,층과 제로패딩 사이의 연결

높이와 너비를 이전층과 같이 하기 위해 입력의 주위에 0을 일반적으로 추가하는데, 이를 제로 패딩 이라고 함.

 

수용장 사이에 간격을 두어서 큰 입력층을 훨씬 작은 층에 연결하는 것도 가능함. 이렇게 하면 모델의 계산 복잡도를 크게 낮춰줌. 한 수용장과 다음 수용장 사이 간격을 스트라이드 라고 함. 

 

https://seol8118.github.io/ml/3min-dl-ch07/

14.2.1 커널(kernel) 또는 필터(filer)

  • 위에 있는 3x3개의 가중치와 1개의 편향을 의미
  • 이 커널은 해당 은닉층을 만들기 위한 모든 윈도우에 공통으로 적용됨
  • 이것이 바로 CNN의 가장 중요한 특징 중의 하나
  • ex) 입력층 = 28x28 일때,
    • 기본 신경망으로 모든 뉴런을 연결 : 입력 픽셀 하나당 784개의 가중치를 찾아야 함
    • 컨볼루션 계층 : 3x3개인 9개의 가중치만 찾아내면 됨
  • 따라서 계산량이 매우 적어져 학습이 더 빠르고 효율적으로 이뤄짐

층의 전체 뉴런에 적용된 하나의 필터는 하나의 특성 맵을 만듬.

이 맵은 필터를 가장 크게 활성화시키는 이미지의 영역 강조

https://gruuuuu.github.io/machine-learning/cnn-doc/

14.2.2 여러가지 특성 맵 쌓기

위의 이미지를 다시 씀..

실제로 합성 곱 층은 여러가지 필터를 가지고 필터마다 하나의 특성 맵을 출력하므로 3D로 표현하는 것이 정확!

하나의 특성 맵 안에서는 모든 뉴런이 같은 파라미터를 공유, 다른 특성 맵에 있는 뉴런(픽셀)은 다른 파라미터를 사용

 

하나의 합성곱 층이 입력에 여러 필터를 동시에 적용하여 입력에 있는 여러 특성을 감지할 수 있음.

입력 이미지는 컬러채널마다 하나씩 여러 서브 층으로 구성되기도 함(RGB)

 

(548p 그림과 글 물어보기)

 

14.2.3 텐서플로 구현

텐서플로에서 각 입력 이미지는 보통 [높이, 너비, 채널]형태의 3D 텐서로 표현됨

하나의 미니배치는 [미니배치 크기, 높이, 너비, 채널] 형태의 4D 텐서로 표현됨

합성곱 층의 가중치는 [수용장의 높이, 수용장의 너비, 이전 층 특성 맵의 수, 현재 층의 특성 맵의 수(?)] 로 표현됨

 

예제를 살펴보자! 

두 개의 샘플 이미지를 로드함. 그 다음 7by7 필터 2개를 만들어 두 이미지에 모두 적용. 마지막으로 만들어진 특성 맵 중 하나를 그리자.

 

from sklearn.datasets import load_sample_images
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
#%%
#샘플 이미지 로드 (각 픽셀 강도를 0~1 사이의 실수로 바꿈)
china=load_sample_image("china.jpg")/255
flower=load_sample_image("flower.jpg")/255
images=np.array([china,flower])
batch_size,height,width,channels=images.shape
#%%
#필터를 두개 만듬
filters=np.zeros(shape=(7,7,channels,2),dtype=np.float32)
filters[:,3,:,0]=1 #수직선
filters[3,:,:,1]=1 #수평선

outputs=tf.nn.conv2d(images,filters,strides=1,padding="SAME")
#필터를 두 이미지에 적용
plt.imshow(outputs[0,:,:,1],cmap="gray")
# 첫 번째 이미지의 두 번째 특성 맵을 그리기

550p 다시 보기