1950년 대 수행했던 고양이의 뇌파 실험에 영감을 얻은 Yann Lecun 교수에 의해 1998년 이미지 인식을 획기적으로 개선할 수 있는 CNN이 제안되었다.
고양이의 눈으로 보는 사물의 형태에 따라 뇌의 특정영역(특정뉴런)
만 활성화 된다는 실험 결과를 기반으로 제안 되었다.
특정추출부의 초반 층들은 데이터의 심플한 특징들을 잡아낸다.
Ex) 1단계 : 세모, 동그라미, 네모, ..등
특성추출부의 층들이 깊어지면서 조금 더 디테일한 특징들을 잡아낸다.
Ex) 2단계 : 코, 입, 귀, 눈, ..등
이러한 특징들이 모여서 최종적으로 고양이라고 판단하게 된다.
Ex) 3단계 : 고양이, ..등
CNN(합성곱)
은 입력된 이미지에서 특징을 추출하기 위해 필터의 개념을 도입했다.
이미지 전체영역(전체픽셀)에 대해 서로 동일한 연관성(중요도)으로 처리하는 대신 특정 범위에 한정해 처리한다면 훨씬 효과적일 것이라는 아이디어 에서 착안 했다.
합성곱 계층에서 이미지의 색상 정보를 채널이라고 부른다.
흑백으로 코딩 된 경우 (ex 손글씨 이미지) 흑백의 글이 스케일 (0:검은색, 255:흰색)만 나타내면 되므로 채널은 1이 된다.
입력신호가 RGB 신호
로 코딩된 경우, 채널은 세가지 색을 각각 나타내는 3이 된다.
(데이터의 색상 정보를 유지 할 수 있음)
필터의 크기로 인해 가장자리 부분의 데이터가 부족해서 입력과 출력의 이미지 크기가 달라지게 되는데 이를 보완하기 위해서 입력데이터의 가장자리 부분에 0을 미리 채워 넣는 것을 패딩(Padding)
이라고 한다.
패딩을 사용하면 입력과 출력의 크기를 갘게 맞춰줄 수 있다.
동시에 층이 깊어지면서 이미지의 크기가 줄어드는 것을 방지 할 수 있다.
Cinv2D 계층에서는 padding 명령을 사용해 패딩을 지정 할 수 있다.
same
을 지정하면 출력과 입력이 같아지게 적절한 수의 패딩을 자동으로 입력valid
로 설정하면 패딩을 사용하지 말라는 뜻합성곱을 수행한 결과 신호를 다음 계층으로 전달할 때, 모든 정보를 전달하지 않고 일부만 샘플링 하여 넘겨주는 작업을 축소샘플링(subsampling)
이라고 한다.
축소 샘플링을 하는 이유는 좀 더 가치있는 정보만을 다음 단계로 넘겨주기 위함이며, 딥러닝에서 원하는 결과를 얻기 위해서는 가치 있는 정보를 줄여가야 하며, 결국 핵심 정보만 다음 계층으로 전달하는 장치가 필요하다.
축소 샘플링에는 크게 스트라이드(stride)
와 풀링(pooling)
두 가지 기법이 있다.
스트라이드는 합성곱 연산을 수행할 때 필터를 한 픽셀씩 옆으로 이동하면서 출력을 얻는게 아니라, 2 픽셀씩 또는 3 픽셀씩 건더 뛰면서 합성곱 연산을 수행하는 방법이다.
이를 스트라이드 2 또는 스트라이드 3이라고 하는데, 이렇게 하면 출력 데이터(특성맵)의 크기를 1/4 또는 1/9로 줄일 수 있다.
플링이란 CNN에서 합성곱 수행 결과를 다음 계층으로 모두 넘기지 않고, 일정 범위 내 (가로, 세로)에서 가장 큰 값을 하나만 선택하여 넘기는 방법을 사용한다.
이렇게 지역내 최대 값만 선택하는 풀링을 최대풀링(max pooling)
이라고 한다.
최대 풀링을 하면 작은 지역공간의 대표정보만 남기고 나머지 신호들을 제거하는 효과를 얻을 수 있다.
평균풀링(Average pooling)
도 있음!풀링은 위에 보이는 것과 같이 입력의 변화에 영향을 적게 받는다.
Conv2D(filters = 32,
kernel_size = (5,5),
padding='valid',
input_shape=(28, 28, 1),
activation='relu',
strides = (2, 2))
학습조기중단(early stopping)
드롭아웃(dropout)
데이터 증강(data augmentation) - 이미지 증식
전이학습이란 다른 데이터 셋으로 이미 학습한 모델을 유사한 다른 데이터를 인식하는데 사용하는 기법이다. 이 방법은 특히 새로 훈련시킬 데이터가 충분히 확보되지 못한 경우에 높은 학습 효율을 높여주었다.
전이학습 모델을 적절히 이용하는 방법은 특성 추출(feature extraction)
방식과 미세 조정(fine-tuning)
방식이 있다.
특성 추출부 부분만 사용하는 이유는 분류기(MLP)
의 경우 우리가 해결하고자 하는 문제에 맞게 새로 설정해줘야 하기 때문이다.
단, 새롭게 분류할 클래스의 종류가 사전 학습에 사용된 데이터와 특징이 매우 다르면, 특성추출부 전체를 재사용해서는 안되고 앞 단의 일부 계층만을 재사용해야 함 (심플한 특징들만 추출해내기 위해)
특성추출부의 층들 중 하단부 몇 개의 계층은 전결합층 분류기(MLP)
와 함께 새로 학습시킴
처음부터 특성추출부 계층들과 분류기(MLP)
를 같이 훈련시키면 새롭게 만든 분류기에서 발생하는 큰 에러 값으로 인해, 특성추출부에서 사전 학습된 가중치가 많이 손실 될 수 있음
처음에는 분류기(MLP)
의 파라미터가 랜덤하게 초기화 되어 있으므로 컨볼루션 베이스 중 앞 단 계층들을 고정(동결)하고 뒷 단의 일부 계층만 학습이 가능하게 설정한 수, MLP
와 같이 학습시켜 파라미터(w,b) 들을 적당하게 잡아 준다.
딥러닝을 배우면서 인공지능에 대한 공부를 하고, 계속 공부하다보면 '알파고' 같은 것을 내가 만들 수 있지 않을까? 하는 생각이 들었지만 공부를 하면 할 수록 너무 큰 꿈을 가지고 있었다는 것을 느끼게 되었다.
어려운 것은 사실이나 아직 뭔가 엄청 어렵다 라는 느낌은 덜받았다.
코드도 비슷한것이 많고, 여러 코드를 쓰는것이 아니라 반복되는 작업이 많기 때문인지 여러번 반복해서 공부하다보면 따라갈 수도 있다고 생각을 했다.