전이학습
- 이미 알고 있는 지식(데이터, 모델 등)을 다른 문제에 적용하여 풀어가는 과정
- 가지고 있는 데이터 양이 충분하지 않을 때, 외부 소스로 부터 좋은 특징들을 가져와서 모델에 사용
- 학습 데이터가 부족하더라도 원하는 모델을 학습할 수 있고 학습 시간을 줄일 수 있다.
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, (1, 2, 0))) plt.show()
dataiter = iter(trainloader) images, labels = dataiter.next()
imshow(torchvision.utils.make_grid(images[:8])) |
|
# 모델 불러오기
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)) |
'인공지능 > 파이토치' 카테고리의 다른 글
파이토치 - 텐서 / 자동 미분 (0) | 2020.07.18 |
---|---|
파이토치 무작정 시작하기 6 - 모델 변수 프리징 (0) | 2020.07.17 |
파이토치 무작정 시작하기 4 - CNN 기본 모델 구축 (0) | 2020.07.16 |
파이토치 무작정 시작하기 3 - 데이터 불러오기 (0) | 2020.07.14 |
파이토치 무작정 시작하기 2 - 패키지 구성 / 자동 미분 계산 (0) | 2020.07.09 |