【发布时间】: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