아이공의 AI 공부 도전기

torch.nn을 이용한 간단한 Neural Network 구성하기(Tutorial)

torch.nn 패키지를 이용하여 간단한 신경망을 구성해보고자 합니다.

     

Tutorial 링크

해당 Tutorial은 아래 링크에 있습니다.

 

영문

pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py

 

Neural Networks — PyTorch Tutorials 1.7.1 documentation

Note Click here to download the full example code Neural Networks Neural networks can be constructed using the torch.nn package. Now that you had a glimpse of autograd, nn depends on autograd to define models and differentiate them. An nn.Module contains l

pytorch.org

한글

tutorials.pytorch.kr/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py

 

신경망(Neural Networks) — PyTorch Tutorials 1.6.0 documentation

Note Click here to download the full example code 신경망(Neural Networks) 신경망은 torch.nn 패키지를 사용하여 생성할 수 있습니다. 지금까지 autograd 를 살펴봤는데요, nn 은 모델을 정의하고 미분하는데 autograd

tutorials.pytorch.kr

기본적인 Neural Network 구조는 아래와 같은 구성을 생각하셔야 합니다.

 

1. 데이터가 존재 -> 2. 신경망 모델 정의 -> 3. optimizer를 기준으로 loss 계산 -> 4. backpropagation을 통한 weight 조정 -> 5. 반복

 

가장 간단한 신경망 구조

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=3)
        self.relu1 = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=3)
        self.relu2 = nn.ReLU(inplace=True)
        self.fc1 = nn.Linear(16*6*6, 128)
        self.relu3 = nn.ReLU(inplace=True)
        self.fc2 = nn.Linear(128, 64)
        self.relu4 = nn.ReLU(inplace=True)
        self.fc3 = nn.Linear(64, 16)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu1(x)
        x = F.max_pool2d(x, 2)
        x = self.conv2(x)
        x = self.relu2(x)
        x = F.max_pool2d(x, 2)
        x = x.view(-1, self.num_flat_features(x))
        x = self.fc1(x)
        x = self.relu3(x)
        x = self.fc2(x)
        x = self.relu4(x)
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]
        num_features=1
        for s in size:
            num_features *= s
        return num_features

net = Net()

# data
input = torch.randn(1,1,32,32)
output = net(input)
print(output.size())
target = torch.randn(16)
print(target.size())
target = target.view(1, -1)
print(target.size())

# setting
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)

# train by loss, optimizer
optimizer.zero_grad()
output = net(input)
loss = criterion(output, target)
optimizer.step()

가장 간단한 신경망 구조 설명

앞에서 말씀드린 구조와는 1,2 번 순서가 달라지고 5번은 없지만 직관적으로 이해하시기에는 좋은 예제 내용입니다.

1. 데이터가 존재 -> 2. 신경망 모델 정의 -> 3. optimizer를 기준으로 loss 계산 -> 4. backpropagation을 통한 weight 조정 -> 5. 반복

 

1. 데이터 존재

저의 경우 데이터는 torch.rand로 형태만 맞춘 상태입니다.

batch_size, channel, height, width의 순서에 맞게 input을 생성하였습니다.

torch.randn(batch_size, channel, height, width)

target의 경우도 마찬가지로 결과물은 1,16의 형태가 되도록 구현을 진행했습니다.

 

2. 신경망 모델 정의

신경망을 정의할 때 캡슐화된 nn.Module을 활용하여 만드는 것이 일반적입니다. 이 때 init으로 함수들을 정의하고 forward로 모델이 어떻게 학습을 진행할지를 보입니다. 또한 상황에 따라 함수를 만들어 사용할 수 있습니다.

 

3. optimizer를 기준으로 loss 계산

loss는 MSE로 optimizer로 SGD를 사용하였습니다. 가장 기본이 되는 형태이기에 어떤 모델을 사용하냐의 문제라고 생각합니다. 다만 loss는 해당 loss의 parameter에 맞게 넣어줘야하며 저의 경우 MSE이기 때문에 target과 output 간의 비교를 하도록 넣어줬습니다. optimizer의 경우 신경망의 parameter를 넣음으로써 loss에 따라 변화하는 신경망의 weight 변화를 가능하게 합니다.

 

4. backpropagation

역전파라고 하는 backpropagation을 사용하는 방법은 다음과 같습니다.

1) optimizer의 버퍼를 0으로 만든다.

optimizer.zero_grad()

2) loss를 구하고 backpropagation을 진행한다.

loss = criterion(output, target)

loss.backward()

3) optimizer 변화로 weight 업데이트를 진행한다.

optimizer.step()

 

해당 4개의 순서로 신경망이 학습이 1번 진행됨을 알 수 있습니다.

이해가 되셨으면 좋겠습니다.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading