Neural Network with Pytorch #2

Flash·2021년 12월 31일
0

인공지능

목록 보기
3/4

CNN Convolutional Neural Network

MLP, CNN의 개념 및 학습 성능 비교

실험의 dataset으로 CIFAR 10을 사용했다.


#2 CNN

CNN은 Convolutional Neural Network의 약자로 DNN이 이미지, 영상
데이터를 처리할 때, 1차원 데이터로 만드는 문제를 극복하기 위해 제시됨

보통 CNN의 수행 과정은 아래와 같다.
convlutional layer => activation func => pooling => 최종적으로
FC(Fully connected layer)

근데 분명 CNN은 flatten 하는 문제를 해결하기 위해 만들어졌다고 했는데
마지막에 FC를 통해 fully connected로 만든다.

이유는 다음과 같다.

CNN의 수행 과정

CNN은 2차원 이미지 데이터에 filter를 적용하여 기존의 데이터를 축소한다.
이 축소과정이 단순히 크기만 작아지는 것이 아니라 이미지 데이터의
*주요 특징을 추출해내는 과정이다.*

이 역할을 Convolutional Layer에서 해준다.
Convolutional Layer는 1.filter 2.Activation Function으로
이루어진다.

필터는 이미지 데이터의 어떤 위치에 특징이 존재하는 지 검출하는데
필터와 연산을 했을 때, 값이 크면 특징이 있고 특징이 없으면 0에 가깝다

Activation Function은 이렇게 필터가 연산한 값을 
*특징이 있다 없다의 비선형 값으로 변경한다.*
(Activation Function은 앞에서 설명했다.)

중간 중간 Pooling의 과정이 있는데 Pooling은 교정의 과정이다.
우리가 앞서 어떤 특징들을 추출했을 때, 정말 식별하기 위한 특정 특징을
남기는 과정이 pooling이다.

그 중에서도 Max pooling은 filter size의 영역에서 최대 값만을 뽑아
내는 과정을 뜻한다.

Pooling을 이용하면 데이터의 크기를 줄일 수 있다. 
따라서 과적합이 일어나는 것을 어느 정도 방지해줄 수 도 있다.

마지막에 Flatten을 해주는 이유도 위의 과정을 통해서 특징만을 가진
데이터로 이미지가 축소화 되면 더 이상 1차원 벡터로 만들었을 때 문제가
발생하지 않기 때문에 변형하는 과정을 가질 수 있기 떄문이다.

최종적으로 우리가 구분하고 싶은 class 개수만큼 데이터를 줄인다.

Max pooling


다음으로 CNN 코드를 확인한다.

class CNNModel(nn.Module):
   def __init__(self, input_channel, active_func):
      self.activatoin_func = active_func
      self.layer = nn.Sequential(
      		nn.Conv2d(3,12,3),
                self.activation_func,
                nn.Conv2d(12,12,3),
                self.activation_func,
                nn.MaxPool2d(2,2),
                nn.Conv2d(12,24,3),
                self.activation_func,
                nn.Conv2d(24,24,3),
                self.activation_func,
                nn.MaxPool2d(2,2)
      )
      self.fc_layer = nn.Sequential(
                nn.Linear(5*5*24,300),
                self.activation_func,
                nn.Linear(300,100),
                self.activation_func,
                nn.Linear(100, 10),
      )
   def forward(self, output):
      res = self.layer(output)
      res = res.view(res, size(0), -1)
      res = self.fc_layer(res)
      return res

최종 결과를 확인한다.

CNN이 MLP보다 정확도 측면에서 훨씬 좋은 성능을 보이는 것을 
확인할 수 있다.

하지만 정확도 측면에서 40~50 % 밖에 되지 않기 때문에 학습하는 과정에는
수정이 필요할 것으로 보인다.

전체 소스코드는 차후에 github으로 제공한다.

profile
Whiplash We Flash

0개의 댓글