首页 > 解决方案 > Pytorch-GPU 我忘记转移到 GPU 上的是什么?

问题描述

我收到这个错误。我遗漏了什么,我觉得我已经厌倦了一切。还有没有一种简单的方法可以只使用 GPU 而不是 CPU 我觉得我也尝试了所有这些选项。就像不在任何地方使用 .cuda()

这是我的第一个中立网络之一,所以请放轻松。(大部分来自Class)

 RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking arugment for argument target in method wrapper_nll_loss_forward)


import torch.cuda
import numpy as np
import time
from torchvision import datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt 
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary

torch.cuda.set_device(0)

def load_data():

    num_workers = 0

    load_data.batch_size = 20

    transform = transforms.ToTensor()


    train_data = datasets.MNIST(root='data', train=True, download=True, transform=transform)
    test_data = datasets.MNIST(root='data', train=False, download=True, transform=transform)


    load_data.train_loader = torch.utils.data.DataLoader(train_data, 
                                batch_size=load_data.batch_size, num_workers=num_workers, pin_memory=True)
    test_loader = torch.utils.data.DataLoader(test_data, 
                                batch_size=load_data.batch_size, num_workers=num_workers, pin_memory=True)



def visualize():

    dataiter = iter(load_data.train_loader)
    visualize.images, labels = dataiter.next()
    visualize.images = visualize.images.numpy()

    fig = plt.figure(figsize=(25, 4))
    for idx in np.arange(load_data.batch_size):
        ax = fig.add_subplot(2, load_data.batch_size/2, idx+1, xticks=[], yticks=[])
        ax.imshow(np.squeeze(visualize.images[idx]), cmap='gray')
        ax.set_title(str(labels[idx].item()))
    #plt.show()

def fig_values():
    img = np.squeeze(visualize.images[1])

    fig = plt.figure(figsize = (12,12))
    ax = fig.add_subplot(111)
    ax.imshow(img, cmap='gray')
    width, height = img.shape
    thresh = img.max()/2.5
    for x in range(width):
        for y in range(height):
            val = round(img[x][y],2) if img[x][y] !=0 else 0
            ax.annotate(str(val), xy=(y,x),
                        horizontalalignment='center',
                        verticalalignment='center',
                        color='white' if img[x][y]<thresh else 'black')
    #plt.show()


load_data()
visualize()
fig_values()

class NeuralNet(nn.Module):
    def __init__(self, gpu = True):
        super(NeuralNet, self ).__init__()
        self.fc1 = nn.Linear(28 * 28, 16).cuda()
        self.fc2 = nn.Linear(16, 10).cuda()

    def forward(self, x):
        x = x.view(-1, 28 * 28).cuda()
        x = F.relu(self.fc1(x)).cuda()

        x = self.fc2(x).cuda()

        return x


def training():
    criterion = nn.CrossEntropyLoss().cuda()
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    n_epochs = 100 

    model.train().cuda()

    for epoch in range(n_epochs):
        train_loss = 0.0
        for data, target in load_data.train_loader:
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
            train_loss += loss.item()*data.size(0)

        train_loss = train_loss/len(load_data.train_loader.dataset)

        print('Epoch: {} \tTraining Loss: {:.6f}'.format(
            epoch+1, 
            train_loss
            ))


device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

model = NeuralNet().to(device)
summary(model, input_size=(1, 28, 28))
training()

标签: neural-networkpytorchgpu

解决方案


您的data, 和target不在 GPU 中(考虑删除重复cuda调用)。

你也在做一些不必要的事情cuda()。简单地说,看看你的数据和模型在哪里。将模型带到GPU,将数据和标签带到GPU,最后将数据馈送到模型。

不要使用, cuda(), use to.device(),从长远来看它更安全,并且在多 GPU 设置中易于定制。

import torch.cuda
import numpy as np
import time
from torchvision import datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt 
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary

torch.cuda.set_device(0)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

def load_data():

    num_workers = 0

    load_data.batch_size = 20

    transform = transforms.ToTensor()


    train_data = datasets.MNIST(root='data', train=True, download=True, transform=transform)
    test_data = datasets.MNIST(root='data', train=False, download=True, transform=transform)


    load_data.train_loader = torch.utils.data.DataLoader(train_data, 
                                batch_size=load_data.batch_size, num_workers=num_workers, pin_memory=True)
    test_loader = torch.utils.data.DataLoader(test_data, 
                                batch_size=load_data.batch_size, num_workers=num_workers, pin_memory=True)



def visualize():

    dataiter = iter(load_data.train_loader)
    visualize.images, labels = dataiter.next()
    visualize.images = visualize.images.numpy()

    fig = plt.figure(figsize=(25, 4))
    for idx in np.arange(load_data.batch_size):
        ax = fig.add_subplot(2, load_data.batch_size/2, idx+1, xticks=[], yticks=[])
        ax.imshow(np.squeeze(visualize.images[idx]), cmap='gray')
        ax.set_title(str(labels[idx].item()))
    #plt.show()

def fig_values():
    img = np.squeeze(visualize.images[1])

    fig = plt.figure(figsize = (12,12))
    ax = fig.add_subplot(111)
    ax.imshow(img, cmap='gray')
    width, height = img.shape
    thresh = img.max()/2.5
    for x in range(width):
        for y in range(height):
            val = round(img[x][y],2) if img[x][y] !=0 else 0
            ax.annotate(str(val), xy=(y,x),
                        horizontalalignment='center',
                        verticalalignment='center',
                        color='white' if img[x][y]<thresh else 'black')
    #plt.show()


load_data()
visualize()
fig_values()

class NeuralNet(nn.Module):
    def __init__(self, gpu = True):
        super(NeuralNet, self ).__init__()
        self.fc1 = nn.Linear(28 * 28, 16)
        self.fc2 = nn.Linear(16, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = F.relu(self.fc1(x))

        x = self.fc2(x)

        return x


def training():
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    n_epochs = 100 

    model.train()

    for epoch in range(n_epochs):
        train_loss = 0.0
        for data, target in load_data.train_loader:
            optimizer.zero_grad()
            ###################################
            data = data.to(device)
            target = target.to(device)
            ###################################
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
            train_loss += loss.item()*data.size(0)

        train_loss = train_loss/len(load_data.train_loader.dataset)

        print('Epoch: {} \tTraining Loss: {:.6f}'.format(
            epoch+1, 
            train_loss
            ))




model = NeuralNet().to(device)
summary(model, input_size=(1, 28, 28))
training()

推荐阅读