신경망 정의
- 원글 : Defining a Neural Network in PyTorch
- 딥러닝은 서로 연결된 수많은 레이어로 구성된 인공신경망(ANN, artificial Neural Network) 모델이다.
- 이렇게 상호연결된 층으로 데이터를 흘려보냄으로써, 입력값과 출력값이 대응되는 연산을 근사하는 방식을 신경망은 학습할 수 있다.
- PyTorch에서는 torch.nn 패키지를 사용해서 신경망을 구성할 수 있다.
Introduction
- PyTorch에서는 torch.nn 패키지에 포함된 모듈과 클래스를 활용하여, 신경망을 생성하고 학습할 수 있다.
- nn.Module이 포함한 층(layer)에서 forward(input) 메소드를 거쳐 output이 반환된다.
- 이 문서에서는 MNIST 데이터셋에 대한 신경망을 torch.nn을 사용해 정의한다.
Setup
- 시작하기 전에 torch를 설치할 필요가 있다.
pip install torch
Steps
- 데이터를 로드하기 위해 필요한 라이브러리를 불러온다.
- 신경망을 정의하고 초기화한다.
- 데이터가 모델에서 어떤 층을 거치는지 명시한다.
- (선택적으로) 테스트를 위한 데이터를 모델에 사용해본다.
1. 데이터를 로드하기 위해, 필요한 라이브러리 불러오기
import torch
import torch.nn as nn
import torch.nn.functional as F
2. 신경망의 정의 및 초기화
- MNIST 데이터셋에 대한 신경망은 이미지를 인식해야 하므로, PyTorch의 컨볼루션(convolution)연산을 사용한다.
- 컨볼루션(Convolution)은 이미지의 각 요소에 해당하는 픽셀값을 커널(kernel)이라 불리는 작은 행렬로 가중치가 곱해진 주위 픽셀값들과 더해준다.
- 이를 통해 입력이미지에서 임의의 특성을 추출할 수 있다.
- 참고) 기존 이미지 처리에서 필터(filter)라고도 불린 컨볼루션(합성곱) 연산을 통해 이미지를 부드럽고 흐리게 만드는 블러링(blurring), 이미지를 날카롭게 만드는 샤프닝(sharpening) 등이 가능하고, 또 모서리와 같은 이미지 내의 특징을 추출할 수 있다(edge detection)
- 아래에서 Net이라고 이름붙인 모델을 정의하기 위해서 우선 nn.Module을 참고하는 __init__ 함수를 작성한다.
- __init__()에서 신경망에 사용되는 레이어들을 선언할 수 있다.
- 아래의 모델은 컨볼루션 레이어를 사용해, 하나의 채널로 구성된 이미지를 입력받아 0~9에 대응되는 출력값을 가진다.
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.dropout1 = nn.Dropout2d(0.25)
self.dropout2 = nn.Dropout2d(0.5)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)
my_nn = Net()
3. 데이터가 모델의 레이어를 거치는 방식을 명시
- PyTorch를 사용해 모델을 구성할 때, forward 함수를 정의하여 데이터가 연산 그래프(computation graph)를 통과하는 방식을 명시한다.
- 참고) 입력 데이터가 출력으로 이어지는 흐름을 feed-forward라고 한다.
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.dropout1 = nn.Dropout2d(0.25)
self.dropout2 = nn.Dropout2d(0.5)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.conv2(x)
x = F.relu(x)
x = F.max_pool2d(x)
x = self.dropout1(x)
x = torch.flatten(x, 1)
x = self.fc1(x)
x = F.relu(x)
x = self.dropout2(x)
x = self.fc2(x)
output = F.log_softmax(x, dim=1)
return output
4. (선택적으로) 테스트를 위해 임의의 데이터를 모델에 입력
- 원하는 형식으로 데이터가 출력되는 지를 확인하기 위하여, 무작위로 생성된 데이터를 모델에 입력해본다.
random_data = torch.rand((1, 1, 28, 28))
my_nn = Net()
result = my_nn(random_data)
print(result)
- 출력된 결과 텐서는 0~9 사이의 레이블에 대한 확률을 각각 가지고 있다.
댓글