【问题标题】:How to run a pre-trained pytorch model on the GPU?如何在 GPU 上运行预训练的 pytorch 模型?
【发布时间】:2020-06-20 02:21:27
【问题描述】:

在这里,我尝试使用 mobilenetv2 移动设备在自定义数据集上进行训练。我可以让它在 CPU 上运行,但我更愿意在 GPU 上运行它。相反,我收到如下错误:

RuntimeError: Expected object of backend CPU but got backend CUDA for argument #2 'weight'

RuntimeError: Expected object of backend CPU but got backend CUDA for argument #4 'mat1

所以就像我的帖子问我怎样才能让预训练模型在 GPU 上运行?

MobileNet = models.mobilenet_v2(pretrained = True)
if torch.cuda.is_available():
    MobileNet.cuda()

for param in MobileNet.parameters():
    param.requires_grad = False

    torch.manual_seed(50)

MobileNet.classifier = nn.Sequential(nn.Linear(1280, 1000), nn.ReLU(), nn.Dropout(0.5), nn.Linear(1000,3), nn.LogSoftmax(dim=1))

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(MobileNet.classifier.parameters(), lr=0.001)

train_transform = transforms.Compose([
        transforms.RandomRotation(10),      # rotate +/- 10 degrees
        transforms.RandomHorizontalFlip(),  # reverse 50% of images
        transforms.Resize(224),             # resize shortest side to 224 pixels
        transforms.CenterCrop(224),         # crop longest side to 224 pixels at center
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ])

test_transform = transforms.Compose([
        transforms.Resize(224),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ])

train_data = datasets.ImageFolder('C:/Users/mixv/Pictures/Summer/datasets/train', transform=train_transform)
test_data = datasets.ImageFolder('C:/Users/mix/Pictures/Summer/datasets/test', transform=test_transform)


torch.manual_seed(42)
batch=64
train_loader = DataLoader(train_data, batch_size=batch, shuffle=True)
test_loader = DataLoader(test_data, batch_size=batch, shuffle=True)

if torch.cuda.is_available():
    train_loader = DataLoader(train_data, batch_size=batch, shuffle=True, pin_memory = True)
    test_loader = DataLoader(test_data, batch_size=batch, shuffle=True, pin_memory = True)

epochs = 10

train_losses = []
test_losses = []
train_correct = []
test_correct = []
start_time =time.time()
for i in range(epochs):
    trn_corr = 0
    tst_corr = 0

    # Run the training batches

    for b, (images, labels) in enumerate(train_loader):

        if torch.cuda.is_available():
            images = images.cuda()
            labels = labels.cuda()

        b+=1

        # Apply the model
        y_pred = MobileNet(images)
        loss = criterion(y_pred, labels)

        # Tally the number of correct predictions
        predicted = torch.max(y_pred.data, 1)[1]
        batch_corr = (predicted == labels).sum()
        trn_corr += batch_corr

        accuracy = trn_corr.item()*100/(b*batch)
        # Update parameters
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    正如 RuntimeError 所说,一些权重仍在 cpu 中。我怀疑一个可能的缺陷是MobileNet.classifier = nn.Sequential(nn.Linear(1280, 1000), nn.ReLU(), nn.Dropout(0.5), nn.Linear(1000,3), nn.LogSoftmax(dim=1)) 在MobileNet.cuda() 之后完成,这意味着这些新创建的权重可能没有发送到 gpu。试试把这两个的顺序倒过来看看

    【讨论】:

    • 非常感谢。这么简单的错误让我困了好几个小时。
    猜你喜欢
    • 2020-11-29
    • 2019-09-11
    • 2018-02-20
    • 2021-07-16
    • 2021-04-05
    • 2021-03-08
    • 2020-02-07
    • 2019-07-17
    • 2020-02-25
    相关资源
    最近更新 更多