【问题标题】:Calculate loss in Pytorch with convolutional network only for image section仅针对图像部分使用卷积网络计算 Pytorch 中的损失
【发布时间】:2023-03-22 08:15:02
【问题描述】:

我有一个卷积神经网络,可以将以下帧预测为一个序列。我为图像添加了不同颜色的边框,以向网络提供更多信息。但是,当然,这些额外的信息并不是系统应该专注于预测或计算损失的。有没有办法在计算损失之前切断边界?我试过了:

imgs_pred = model(imgs_input)
#compare prediction with what should have happended and calculate loss
#for this, cut frame from image
croppedImages_gt = []
for i in range(0,cfg.dec_frames):
    img_input = imgs_pred[i,:,:,:]
    img_save = ToPILImage()(img_input)
    img_cv2 = np.asarray(img_save)
    img_cv2 = cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB)
    img_cv2 = cv2.resize(img_cv2, (76,76))
    crop_img = img_cv2[6:70,6:70]
    crop_img = cv2.resize(crop_img, (256,448))
    img_tensor = ToTensor()(crop_img)
    img_tensor_grad = Variable(img_tensor, requires_grad=True)
    croppedImages_gt.append(img_tensor_grad)
croppedImages_gt_tensor = torch.stack(croppedImages_gt, dim=0)

croppedImages_pred = []
for i in range(0,cfg.dec_frames):
    img_input = imgs_gt[i,:,:,:]
    img_save = ToPILImage()(img_input)
    img_cv2 = np.asarray(img_save)
    img_cv2 = cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB)
    img_cv2 = cv2.resize(img_cv2, (76,76))
    crop_img = img_cv2[6:70,6:70]
    crop_img = cv2.resize(crop_img, (256,448))
    img_tensor = ToTensor()(crop_img)
    img_tensor_grad = Variable(img_tensor, requires_grad=True)
    croppedImages_pred.append(img_tensor_grad)
croppedImages_pred_tensor = torch.stack(croppedImages_pred, dim=0)

loss = criterion_mse(imgs_pred, imgs_gt)

一点都不漂亮,但已经是第一次尝试了。我转换了很多类型,因为我没有找到从 PIL 到张量的函数,没有从张量到 cv2 的函数,也没有在 PIL 中裁剪图像的函数。真是一团糟。

但是当我在没有 "img_tensor_grad = Variable(img_tensor, requires_grad=True)" 行的情况下执行此操作时,它告诉我

RuntimeError: element 0 of variables 不需要 grad 并且没有 grad_fn

我搜索了互联网并添加了该行。然后,DataLoader 无法再分配足够的内存。我是不是做错了什么?

我也想知道我的 DataSet 是否以一种不幸的方式或类似的方式被读取。我发现使用 .tar 可能会提供更好的效率,但不是如何创建我自己的 .tar 数据集并读取它。目前,我有 3 个数据集(预测、训练、验证),每个数据集都有多个文件夹,其中包含 6 帧的序列。这 6 帧由 DataLoader 一次读取并提供给模型。

【问题讨论】:

    标签: memory pytorch loss dataloader


    【解决方案1】:

    我可能遗漏了一些东西,因为我很难理解您的代码,但您可能应该准备带边界的 GT,计算带边界的网络输出并在 MSE 之前裁剪张量:

    loss = criterion_mse(imgs_pred[:, :, 6:70, 6:70], imgs_gt[:, :, 6:70, 6:70])
    

    一般来说,您还可以屏蔽像素丢失。即不用聚合计算损失,乘以二进制掩码并求和。

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2018-07-25
      • 1970-01-01
      • 2019-03-16
      • 2019-08-18
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多