[PyTorch]PyTorch 입문 튜 토리 얼 6

10413 단어 PyTorch
feedforward_neural_network
CPU 버 전
앞에서 PyTorch 로 논리 회귀 와 선형 회 귀 를 간단하게 소 개 했 고 논리 회귀 에서 하나의 선형 층 을 사용 하여 mnist 데이터 세트 를 분류 했다.사실은 간단 한 신경 망 이 고 틀 은 모두 같다.이 절 에서 우 리 는 두 개의 선형 층 을 사용 하여 어떻게 구 조 를 하 는 지 보 았 다.
우선 mnist 데이터 에서 데 이 터 를 집중 적 으로 불 러 옵 니 다.
import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable


# Hyper Parameters 
input_size = 784
hidden_size = 500
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001

# MNIST Dataset 
train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),  
                            download=True)

test_dataset = dsets.MNIST(root='./data', 
                           train=False, 
                           transform=transforms.ToTensor())

# Data Loader (Input Pipeline)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

그 다음 에 모델 을 정의 하고 두 개의 선형 층 이 있 는데 그 중 하 나 는 은 층 이다.
# Neural Network Model (1 hidden layer)
class Net(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size) 
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, num_classes)  

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

net = Net(input_size, hidden_size, num_classes)

loss 와 최적화 함 수 를 정의 합 니 다.여 기 는 Adam 알고리즘 을 사용 합 니 다.
# Loss and Optimizer
criterion = nn.CrossEntropyLoss()  
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)  

훈련 을 시작 하 다.
# Train the Model
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):  
        # Convert torch tensor to Variable
        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)

        # Forward + Backward + Optimize
        optimizer.zero_grad()  # zero the gradient buffer
        outputs = net(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [%d/%d], Step [%d/%d], Loss: %.4f' 
                   %(epoch+1, num_epochs, i+1, len(train_dataset)//batch_size, loss.data[0]))

테스트 모델.
# Test the Model
correct = 0
total = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28))
    outputs = net(images)
    _, predicted = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicted == labels).sum()

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

최종 정확 도 는 약 97%정도 로 두 개의 선형 층 을 사용 하 는 성능 이 하나의 선형 층 보다 훨씬 좋 은 것 을 볼 수 있다.
GPU 버 전
위의 코드 는 모두 CPU 에서 실 행 됩 니 다.전체 훈련 은 1 분 정도 걸 립 니 다.다음은 GPU 버 전의 코드 를 어떻게 수정 하 는 지 살 펴 보 자.
우선 데 이 터 를 불 러 오 는 것 은 CPU 와 같 습 니 다.그리고 정 의 된 모델 은 GPU 에 올 려 야 합 니 다.이렇게 만 하면 돼.
net = Net(input_size, hidden_size, num_classes)
net.cuda()   

정 의 된 loss 와 최적화 알고리즘 도 이전 과 같다.훈련 을 시작 할 때 는 당연히 데 이 터 를 모두 GPU 에 올 려 야 한다.
# Train the Model
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):  
        # Convert torch tensor to Variable
        images = Variable(images.view(-1, 28*28).cuda())
        labels = Variable(labels.cuda())

        # Forward + Backward + Optimize
        optimizer.zero_grad()  # zero the gradient buffer
        outputs = net(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [%d/%d], Step [%d/%d], Loss: %.4f' 
                   %(epoch+1, num_epochs, i+1, len(train_dataset)//batch_size, loss.data[0]))

그 중에서 Tensor.cuda 의 원형 은?
cuda(device=None, async=False)

4.567917.대상 을 대응 하 는 device 의 memory 에 복사 하 는 것 을 나타 낸다.async 가 true 이 고 이 대상 이 pinned memory(제로 복사 메모리)라면 비동기 복사 방식 을 사용 합 니 다.그렇지 않 으 면 이 매개 변 수 는 유효 하지 않 습 니 다
테스트 할 때 만 같은 방법 을 쓴다.
# Test the Model
correct = 0
total = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28)).cuda()
    outputs = net(images)
    _, predicted = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicted.cpu() == labels).sum()

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

이 가운데 Tensor.cpu 는 GPU 에 있 는 데 이 터 를 CPU 에 복사 하 는 역할 을 한다.최종 입력 결 과 는 97%이 고 소요 시간 은 약 24s 이 며 그래 픽 카드 는 GTX TITAN 이다.

좋은 웹페이지 즐겨찾기