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가지는 다음과 같다.
- nn.Module 을 참고하는 init 함수를 작성 : 이 함수는 신경망에서 fully connected layers를 만드는 것에 사용됨
- 계산 그래프(즉, 신경망)에 데이터를 지나가게 하는 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
댓글