ValueError:目标大小 (torch.Size([555, 3])) 必须与输入大小相同 (torch.Size([2, 3, 320, 320]))

问题描述 投票:0回答:2
def train_loop(dataloader, model, loss_fn, optimizer, device):
    size = len(dataloader.dataset)
    model.train()
    for batch, (X, y) in enumerate(dataloader):
        # Move data to the same device as the model
        X = X.to(device)
        y = y.to(device)

        # Compute prediction and loss
        pred = model(X)

        pred = F.interpolate(pred, size=(320, 320), mode='bilinear', align_corners=False)
        loss = loss_fn(pred, y)

        # Backpropagation
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

        if batch % 100 == 0:
            loss, current = loss.item(), (batch + 1) * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")
 loss_fn = torch.nn.BCEWithLogitsLoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)

    epochs = 5
    for t in range(epochs):
        start_time = time.time()
        print(f"Epoch {t + 1}\n-------------------------------")
        train_loop(train_dataloader, model, loss_fn, optimizer, device)
        #test_loop(test_dataloader, model, loss_fn, device)
    end_time = time.time()

如何处理这个错误?目标尺寸标记为包含 [x,y,label] 为 555 和 [label classes=3],输入图像为 RGB,这就是为什么是 3。

我不知道是否需要重新调整标签尺寸。

python machine-learning pytorch data-mining
2个回答
0
投票

您遇到此错误是因为 pred 和 y 的大小不同。

        pred = F.interpolate(pred, size=(320, 320), mode='bilinear', align_corners=False)

pred 大小是 (2,3,320,320),但是,由于 y 是 (555,..),torch 不知道如何计算它的损失 (BCEWithLogitsLoss)。

您可以将 pred 的大小更改为与 y 相同的大小。由于 y 是具有 3 个类的标签(因此这是多类问题),因此您可以检查模型输出。 我认为你的模型输出很奇怪,因为你之后进行了 F.interpolate,这意味着你的模型输出看起来像图像..

请先检查您的模型,以便它满足您的任务。


0
投票

我的模型使用 Unet,它输出以像素值张量表示的图像的相同形状,但标签只是一个数据点 [x,y,label] @林平塔

© www.soinside.com 2019 - 2024. All rights reserved.