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。
我不知道是否需要重新调整标签尺寸。
您遇到此错误是因为 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,这意味着你的模型输出看起来像图像..
请先检查您的模型,以便它满足您的任务。
我的模型使用 Unet,它输出以像素值张量表示的图像的相同形状,但标签只是一个数据点 [x,y,label] @林平塔