정지홍 2023. 1. 25. 21:50

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)등 여러 분야에서 활용