인공지능/파이토치

파이토치 무작정 시작하기 5 - GPU를 사용한 전이 학습 (colab 사용)

해피밀세트 2020. 7. 16. 03:56
반응형

 

 

 

 

 

전이학습

  • 이미 알고 있는 지식(데이터, 모델 등)을 다른 문제에 적용하여 풀어가는 과정
  • 가지고 있는 데이터 양이 충분하지 않을 때, 외부 소스로 부터 좋은 특징들을 가져와서 모델에 사용
  • 학습 데이터가 부족하더라도 원하는 모델을 학습할 수 있고 학습 시간을 줄일 수 있다.

 

 

 

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

 

 

# 라이브러리 불러오기

 

import torch

import torchvision

from torchvision import transforms

import torchvision.transforms as transforms  # data processing

from torch.utils.data import DataLoader  # mini-batch

 

import torch.nn as nn  # loss

import torch.optim as optim  # optimizer

 

# 구글 드라이브와 구글 코랩을 연동

 

from google.colab import drive

drive.mount('/content/gdrive')

path = '/content/gdrive/My Drive/cifar10'

# gpu 연산이 가능하면 'cuda:0', 아니면 'cpu' 출력

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

print(device)

# traindata, testdata 불러오기

 

transform = transforms.Compose(

    [transforms.ToTensor(),

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

 

trainset = torchvision.datasets.CIFAR10(root=path+'data', train=True, download=True, transform=transform)

 

trainloader = torch.utils.data.DataLoader(trainset,batch_size=100, shuffle=True, num_workers=2)

 

testset = torchvision.datasets.CIFAR10(root=path+'data', train=False, download=True, transform=transform)

 

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

 

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

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

# 데이터 확인하기

 

import matplotlib.pyplot as plt

import numpy as np

 

def imshow(img):

  img = img / 2 + 0.5

  npimg = img.numpy()

  fig = plt.figure(figsize=(10,5))

  plt.imshow(np.transpose(npimg, (120)))

  plt.show()

 

dataiter = iter(trainloader)

images, labels = dataiter.next()

 

imshow(torchvision.utils.make_grid(images[:8]))

# 모델 불러오기
# pretrained=True : Imagenet 데이터로 미리 학습한 모델 가져오기 (False면 그냥 모델 구조만 가져옴)
# to(device) : 매우중요!!없으면 cpu로 연산함

 

model = torchvision.models.resnet50(pretrained=True).to(device)

# 불러온 모델 구조 확인

 

model




# 모델의 마지막 줄을 보면 out_features=1000 으로 되어있다.

# pretrained에 사용된 Imagenet의 클래스가 1000개이기 때문

# output을 10개로 바꿔주기

 

num_ftrs = model.fc.in_features

model.fc = nn.Linear(num_ftrs, 10)

model = model.to(device)

 

# 수정한 모델 확인

 

model

# loss함수와 optimizer 정의

 

criterion = nn.CrossEntropyLoss()

optimizer = optim.Adam(model.parameters(), lr=1e-3)

 

# training loss를 기준으로 모델 업데이트

 

old_loss = 10

PATH = path+'cifar_model.pth'

 

for epoch in range(5):

 

  running_loss = 0.0

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

    

   # to(device) : GPU연산을 위해 GPU용 텐서로 만들어야함

    inputs, labels = data[0].to(device), data[1].to(device)

 

    optimizer.zero_grad()

    outputs = model(inputs)

    loss = criterion(outputs, labels)

    loss.backward()

    optimizer.step()

 

    running_loss += loss.item()

 

  cost = running_loss / len(trainloader)

  print('[%d] loss : %.3f' %(epoch + 1, cost))

  if cost < old_loss:

    print("Save the best model")

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

    old_loss = cost

 

print('Finished Training')

# 저장된 모델 불러오기

 

model.load_state_dict(torch.load(PATH))

# 테스트 데이터로 예측하고 정확도 확인

 

correct = 0

total = 0

with torch.no_grad():

    for data in testloader:

        images, labels = data[0].to(device), data[1].to(device)

        outputs = model(images)

        _, predicted = torch.max(outputs.data, 1)

        total += labels.size(0)

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

        

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

 

반응형