-
[HandsOn]14. 합성곱 신경망을 사용한 컴퓨터 비전 - 내용 정리1[도서완독]Hands On Machine Learning 2022. 8. 1. 21:01
어느덧 14과까지 왔다~! 아직 6과나 더 남긴했지만...ㅋㅋㅋ 그래도 1월달에 앞부분 깔짝거리다가 그만 뒀었는데 14화까지 왔네 어떻게 .... ㅋㅋㅋ ㅠㅠ 앞으로 6주만 더 힘내자!! 😍
합성곱 신경망(CNN)은 음성 인식이나 자연어 처리, 이미지 분야에서 많이 사용됨!
여기서는 이미지 애플리케이션에 초점을 맞출 것임!
사실 밑에 이러쿵 저러쿵 책의 내용을 요약해놨지만 책이 너무 어렵게 설명함...
얘가 이해하기 훨씬 쉬움!
14.2 합성곱 층
CNN의 가장 중요한 구성 요소는 합성곱 층 : 첫번 째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장(네모..) 안에 있는 픽셀에만 연결됨.
두번째 합성곱 층도 마찬가지.
지금까지는 이미지를 신경망에 주입하기 전에 1D 배열로 펼쳐야 했지만, CNN은 각 층이 2D로 표현되므로 뉴런을 그에 상응하는 입력과 연결하기가 더 쉬움.
높이와 너비를 이전층과 같이 하기 위해 입력의 주위에 0을 일반적으로 추가하는데, 이를 제로 패딩 이라고 함.
수용장 사이에 간격을 두어서 큰 입력층을 훨씬 작은 층에 연결하는 것도 가능함. 이렇게 하면 모델의 계산 복잡도를 크게 낮춰줌. 한 수용장과 다음 수용장 사이 간격을 스트라이드 라고 함.
14.2.1 커널(kernel) 또는 필터(filer)
- 위에 있는 3x3개의 가중치와 1개의 편향을 의미
- 이 커널은 해당 은닉층을 만들기 위한 모든 윈도우에 공통으로 적용됨
- 이것이 바로 CNN의 가장 중요한 특징 중의 하나
- ex) 입력층 = 28x28 일때,
- 기본 신경망으로 모든 뉴런을 연결 : 입력 픽셀 하나당 784개의 가중치를 찾아야 함
- 컨볼루션 계층 : 3x3개인 9개의 가중치만 찾아내면 됨
- 따라서 계산량이 매우 적어져 학습이 더 빠르고 효율적으로 이뤄짐
층의 전체 뉴런에 적용된 하나의 필터는 하나의 특성 맵을 만듬.
이 맵은 필터를 가장 크게 활성화시키는 이미지의 영역 강조
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 다시 보기
'[도서완독]Hands On Machine Learning' 카테고리의 다른 글
[HandsOn]15. RNN과 CNN을 사용해 시퀀스 처리하기 - 내용 정리2 (0) 2022.08.13 [HandsOn]15. RNN과 CNN을 사용해 시퀀스 처리하기 - 내용 정리1 (0) 2022.08.08 [HandsOn]13. 텐서플로에서 데이터 적재와 전처리하기 - 연습문제 (0) 2022.07.29 [HandsOn]13. 텐서플로에서 데이터 적재와 전처리하기 - 내용 정리2 (0) 2022.07.29 [HandsOn]13. 텐서플로에서 데이터 적재와 전처리하기 - 내용 정리1 (0) 2022.07.26