RuntimeError : 입력 유형 (torch.FloatTensor)과 가중치 유형 (torch.cuda.FloatTensor)이 같아야합니다.


9

다음과 같이 다음 CNN을 훈련하려고하지만 .cuda ()와 관련하여 동일한 오류가 계속 발생하며 수정 방법을 잘 모르겠습니다. 지금까지 내 코드 덩어리가 있습니다.

import matplotlib.pyplot as plt
import numpy as np
import torch
from torch import nn
from torch import optim
import torch.nn.functional as F
import torchvision
from torchvision import datasets, transforms, models
from torch.utils.data.sampler import SubsetRandomSampler


data_dir = "/home/ubuntu/ML2/ExamII/train2/"
valid_size = .2

# Normalize the test and train sets with torchvision
train_transforms = transforms.Compose([transforms.Resize(224),
                                           transforms.ToTensor(),
                                           ])

test_transforms = transforms.Compose([transforms.Resize(224),
                                          transforms.ToTensor(),
                                          ])

# ImageFolder class to load the train and test images
train_data = datasets.ImageFolder(data_dir, transform=train_transforms)
test_data = datasets.ImageFolder(data_dir, transform=test_transforms)


# Number of train images
num_train = len(train_data)
indices = list(range(num_train))
# Split = 20% of train images
split = int(np.floor(valid_size * num_train))
# Shuffle indices of train images
np.random.shuffle(indices)
# Subset indices for test and train
train_idx, test_idx = indices[split:], indices[:split]
# Samples elements randomly from a given list of indices
train_sampler = SubsetRandomSampler(train_idx)
test_sampler = SubsetRandomSampler(test_idx)
# Batch and load the images
trainloader = torch.utils.data.DataLoader(train_data, sampler=train_sampler, batch_size=1)
testloader = torch.utils.data.DataLoader(test_data, sampler=test_sampler, batch_size=1)


#print(trainloader.dataset.classes)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = models.resnet50(pretrained=True)

model.fc = nn.Sequential(nn.Linear(2048, 512),
                                 nn.ReLU(),
                                 nn.Dropout(0.2),
                                 nn.Linear(512, 10),
                                 nn.LogSigmoid())
                                 # nn.LogSoftmax(dim=1))
# criterion = nn.NLLLoss()
criterion = nn.BCELoss()
optimizer = optim.Adam(model.fc.parameters(), lr=0.003)
model.to(device)

#Train the network
for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

그러나 콘솔 에서이 오류가 계속 발생합니다.

RuntimeError : 입력 유형 (torch.FloatTensor)과 가중치 유형 (torch.cuda.FloatTensor)이 동일해야합니다.

그것을 고치는 방법에 대한 생각? 모델이 GPU로 푸시되지 않았지만 어떻게 수정 해야할지 모르겠습니다. 감사!

답변:


11

모델이 GPU에 있지만 데이터가 CPU에 있기 때문에이 오류가 발생합니다. 따라서 입력 텐서를 CUDA로 보내야합니다.

inputs, labels = data
inputs, labels = inputs.cuda(), labels.cuda() # add this line

또는 다음과 같이 나머지 코드와 일관성을 유지하십시오.

inputs, labels = inputs.to(device), labels.to(device)

같은 오류 데이터가 CUDA에 있지만 모델이 아닌 경우 메시지가 나타납니다. 이 경우 모델을 CUDA로 보내야합니다.

model = MyModel()

if torch.cuda.is_available():
    model.cuda()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.