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
# 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)) |
![]() |
'인공지능 > 파이토치' 카테고리의 다른 글
파이토치 무작정 시작하기 6 - 모델 변수 프리징 (0) | 2020.07.17 |
---|---|
파이토치 무작정 시작하기 5 - GPU를 사용한 전이 학습 (colab 사용) (0) | 2020.07.16 |
파이토치 무작정 시작하기 3 - 데이터 불러오기 (0) | 2020.07.14 |
파이토치 무작정 시작하기 2 - 패키지 구성 / 자동 미분 계산 (0) | 2020.07.09 |
파이토치 무작정 시작하기 1 - 파이토치 / 텐서 (0) | 2020.07.07 |