인공지능/파이토치

파이토치 무작정 시작하기 4 - CNN 기본 모델 구축

해피밀세트 2020. 7. 16. 01:11
반응형

 

 

 

 

https://www.youtube.com/watch?v=Gm9Spk2Nmj0

 

# 라이브러리 불러오기

 

import torch

import torchvision

import torchvision.transforms as transforms

from torch.utils.data import DataLoader

 

Load data set

 

# 파이토치에서 제공하는 CIFAR10 데이터셋 불러오기

 

transform = transforms.Compose([transforms.ToTensor(),

transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])

 

trainset = torchvision.datasets.CIFAR10(root='C:/pypy', train=True, download=True, transform=transform)

 

trainloader = torch.utils.data.DataLoader(trainset,batch_size=8,

shuffle=True, num_workers=2)

 

testset = torchvision.datasets.CIFAR10(root='C:/pypy', train=False, download=True, transform=transform)

 

testloader = torch.utils.data.DataLoader(testset, batch_size=8, shuffle=False, num_workers=2)

 

classes = ('plane', 'car', 'bird', 'cat',

           'deer','dog','frog','horse','ship','truck')

 

 

 

Build a model

 

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

 

# nn.Module을 상속 받는다.

class Net(nn.Module):

    # 사용하고자 하는 연산 정의

    def __init__(self):

        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(3, 6, 5)

        self.pool = nn.MaxPool2d(2, 2)

        self.conv2 = nn.Conv2d(6, 16, 5)

        self.fc1 = nn.Linear(16 * 5 * 5, 120)

        self.fc2 = nn.Linear(120, 84)

        self.fc3 = nn.Linear(84, 10)

   

    # 연산 순서 정의   

    def forward(self, x):

        x = self.pool(F.relu(self.conv1(x)))

        x = self.pool(F.relu(self.conv2(x)))

        x = x.view(-1, 16 * 5 * 5)

        x = F.relu(self.fc1(x))

        x = F.relu(self.fc2(x))

        x = self.fc3(x)

        return x

 

# 클래스에 대한 인스턴스 생성

net = Net()

 
print(net)

 

 

 

Implement the model with training set

 

# optimizer 사용 정의

 

import torch.optim as optim

 

criterion = nn.CrossEntropyLoss()

# net안에 있는 parameters를 업데이트한다.

optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

 

for epoch in range(5):

   

    running_loss = 0.0

    # traindata 불러오기(배치 형태로 들어옴)

    for i, data in enumerate(trainloader, 0):

        inputs, labels = data

       

        # optimizer 초기화

        optimizer.zero_grad()

       

        # net input 이미지 넣어서 output 나오기

        outputs = net(inputs)

        # output loss값 계산

        loss = criterion(outputs, labels)

        # loss를 기준으로 미분자동계산

        loss.backward()

        # optimizer 계산

        optimizer.step()

       

        # loss값 누적

        running_loss += loss.item()

        if i % 2000 == 1999:

            print('[%d, %5d] loss: %.3f' %

                 (epoch + 1, i + 1, running_loss / 2000))

            running_loss = 0.0

           

print('Finished Training')

 

 

 

 

Save the trained model

 

# 학습한 모델 저장

 

PATH = "C:/pypy/cifar_net.pth"

torch.save(net.state_dict(), PATH)

 

 

 

 

Load the pre-trained model

 

# 저장한 모델 불러오기

 

net = Net()

net.load_state_dict(torch.load(PATH))

# 테스트 데이터로 예측하기

 

correct = 0

total = 0

with torch.no_grad():

    for data in testloader:

        images, labels = data

        outputs = net(images)

        _, predicted = torch.max(outputs.data, 1) # argmax랑 비슷

        total += labels.size(0)

        correct += (predicted == labels).sum().item()

       

print("Accuracy of the network on th 10000 test images : %d %%" % (100 * correct / total))

 

반응형