CNN과 앞 챕터에서 배운 신경망(완전연결 계층Affine)의 차이?
-CNN에는 합성곱 계층과 풀링 계층이 추가
-CNN에서는 2차원이상의 데이터도 처리가 가능하다.
합성곱 연산
-입력데이터에 필터를 서로 곱한다.(필터가 일정간격으로 이동하면서 곱하여 새로운 벡터에 저장)
-필터는 가중치와 비슷하며 필터 적용후에 편향을 더해준다.
-채널과 필터의 채널수가 같아야한다.
합성곱 계층의 패딩?
-합성곱을 하기 전에 주변을 0으로 채우기
-패딩을 이용하면 입력데이터 바깥부분을 둘러주니 필터를 계속 적용하다가 출력크기가 1이 되버리는 상황을 막아준다.
합성곱 계층의 스트라이드?
-필터를 적용하는 간격이다.
-스트라이드의 크기는 보통 윈도우 크기로 설정
-스트라이드가 증가하면 이동간격이 증가하니 출력 데이터도 작아진다.
풀링 계층?
-특정 크기의 영역을 원소하나로 집약하여 공간을 줄이는 방법
-맥스 풀링-->각 영역의 최대값을 대표값으로 설정
-평균 풀링-->각 영역의 평균값 이용
-학습해야할 매개변수가 없다! 출력데이터 수가 변하지 않는다! 인풋데이터에 영향을 적게 받는다!
im2col ?
-이미지를 나타내는 4차원 배열을 2차원행렬로 변환.(im2col)
-원소 수가 원래 블록의 원소 수보다 많아져서 메모리를 더 잡아먹는다.
-큰 행렬로 묶여있어서 계산 속도가 빠르다
class Convolution:#합성곱 계층
def __init__(self, W , b ,stride=1 , pad=0):
self.W=W#여기서는 필터
self.b=b
self.stride=stride
self.pad=pad
def forward(self , x):
FN , C , FH , FW = self.W.shape #shape을 이용하여 필터의 수 , 채널, 필터 높이, 필터 폭을 저장한다
N , C , H , W=x.shape #입력 데이터의 필터 수 ,채널 수 ,높이, 폭을 저장
out_h = int(1 + (H + 2*self.pad - FH) / self.stride)#출력 데이터 높이 계산
out_w = int(1 + (W + 2*self.pad - FW) / self.stride)#출력 데이터 폭 계산
col = im2col(x , FH , FW , self.stride , self.pad)#입력 데이터를 im2col로 2차원 배열ㄹ 바꾸어준다
col_W = self.W.reshape(FN , -1).T
out = np.dot(col , col_W) + self.b
out = out.reshape(N , out_h , out_w , -1).transpose(0, 3, 1, 2)
return out
class Pooling:#풀링계층
def __init__(self , pool_h , pool_w , stride=1 , pad=0):
self.pool_h=pool_h
self.pool_w=pool_w
self.stride=stride
self.pad=pad
def forward(self, x):
#컨볼루션층 지나서 활성화함수 지나서 나온 값에 대하여
N , C , H , W=x.shape
out_h = int(1+H-(self.pool_h)/self.stride)#출력 데이터의 높이
out_w = int(1+W-(self.pool_w)/self.stride)#출력 데이터의 폭
#이미지 투 컬럼으로 데이터를 변형시키고
col = im2col(x , self.pool_h , self.pool_w , self.stride , self.pad)
col = col.reshape(-1 , self.pool_h*self.pool_w)
#각각의 최댓값을 out에 저장한다
out=np.max(col , axis=1)
#출력을 위해서 형태를 다시 맞춘다.
out=out.reshape(N , out_h , out_w , C).transpose(0,3,1,2)
return out
CNN의 종류
-LeNet:합성곱 계층과 풀링 계층을 반복하고 마지막에는 완전연결 계층을 이어서 결과를 출력
-AlexNet: LeNet의 구조는 크게 바꾸지 않았으나 활성화 함수로 ReLu와 드롭아웃을 사용한다.
데이터 확장?
-입력된 이미지를 인위적으로 조작(회전, 이동)하여 이미지의 데이터의 수를 확장
VGG
-기본적인 CNN이지만 비중있는 층을 심화시킨다.
-구성이 간단하다
GoogLeNet
-이 신경망은 세로 방향의 깊이 뿐만 아니라 가로 방향도 깊다.
-위의 구조를 인셉션 구조라고한다.
ResNet
-층이 너무 깊으면 학습이 잘 되지않아서 성능이 떨어지는 것을 막고자 '스깁 연결'이라는 것을 추가한다.
딥러닝은 사물 검출(R-CNN) , 분할 사진(FCN) , 캡션 생성(NIC)등 여러 분야에서 활용