본문 바로가기
Pytorch/Practice the code

CNN 예제 코드 구현하기

by 소소한 혜밍씨 2022. 8. 23.

PyTorch는 torch.nn 을 포함하여 신경망을 만들고 훈련시키는 것을 도울 수 있도록 모듈과 클래스들을 제공한다.

 

PyTorch에서 신경망 모델은 다음과 같은 순서로 정의된다.

 

1. nn.Module 을 상속받는 클래스(class)를 생성하여 정의하고

2. __init__ 함수에서 신경망의 계층(layer)들을 정의

3. forward 함수에서 신경망에 데이터를 어떻게 전달할지 지정

 

nn.Moduel 은 계층, 그리고 output 을 반환하는 forward(input) 메소드를 포함한다.

 

 

 

 

 

오늘 예제코드에서는 합성곱을 사용해서 다음과 같은 모델을 정의하고자 한다.

 

합성곱(convolution)은 커널이나 작은 행렬(matrix)를 통해 가중치를 부여한 이미지의 각 요소를 주변 값과 더하고

 

입력된 이미지의 특징(모서리 감지, 선명함, 흐릿함 등과 같은)을 추출할 수 있도록 한다.

 

1개의 입력 이미지 채널을 가지고
0부터 9까지 숫자를 대표하는 10개의 라벨과
대응되는 값을 출력하는 모델

 

 

 

모델의 Net 클래스를 정의하기 위한 2가지는 다음과 같다.

 

  1. nn.Module 을 참고하는 init 함수를 작성 : 이 함수는 신경망에서 fully connected layers를 만드는 것에 사용됨
  2. 계산 그래프(즉, 신경망)에 데이터를 지나가게 하는 forward 함수를 정의 :  feed-forward 알고리즘

 

# 필요한 라이브러리 불러오기
import torch
import torch.nn as nn
import torch.nn.functional as F

# 신경망 정의하기
class Net(nn.Module):
    def __init__(self):
        super (Net, self).__init__()
        
        # 첫 번째 2D 합성곱 계층
        self.conv1 = nn.Conv2d(1, 32, 3, 1)  # 1 개의 이미지(입력채널) 받고, 커널 사이즈가 3인 32개의 합성곱 특징 출력
        # 두 번째 2D 합성곱 계층
        self.conv2 = nn.Conv2d(32, 64, 3, 1) # 32 개의 입력계층을 받고, 커널 사이즈가 3인 64개의 합성곱 특징 출력
        
        # 인접한 픽셀들이 입력 확률에 따라 모두 0 값을 가지거나 혹은 모두 유효한 값이 되도록 만듦
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        
        # 첫 번째 fully connected layer
        self.fc1 = nn.Linear(9216, 128)
        # 10 개의 라벨을 출력하는 두 번째 fully connected layer
        self.fc2 = nn.Linear(128, 10)
        
# forward 함수 정의하기(feed-forward 알고리즘)
    def forward(self, x):
        
        # 데이터가 conv1을 지나감
        x = self.conv1(x)
        # x에 ReLU 대입
        x = F.relu(x)
        
        x = self.conv2(x)
        x = F.relu(x)
        
        # x에 대해서 max pooling
        x = F.max_pool2d(x, 2)
        # 데이터가 dropout1을 지나감
        x = self.dropout1(x)
        # start_dim=1 으로 x 압축
        x = torch.flatten(x, 1)
        # 데이터가 fc1 을 지나감
        x = self.fc1(x)
        x = F.relu(x)
        x = self. dropout2(x)
        x = self.fc2(x)
        
        # x에 softmax 적용
        output = F.log_softmax(x, dim=1)
        return output

 

 

 

댓글