Python 具有自定义损失函数的反向传播问题
上下文 我正在建立一个超分辨率成像模型(U-Net)。我的数据包括显微镜下的血液涂片。我正在使用快速人工智能。 我想尝试一种新的损失函数,它将“关注”细胞的成分 我所做的 我创建了一个伪_mask函数,它接受两个参数,一个图像和一个从0到255的整数β。此函数首先计算单元分割遮罩,将遮罩的0值转换为β,并将结果应用于原始图像 我想创建一个自定义的loss函数,它将计算pseudo_mask函数输出上的MSE,并将其反向传播到原始图像 我的代码相当简单,因为我只是“完成”了Pytorch MSE loss函数Python 具有自定义损失函数的反向传播问题,python,machine-learning,pytorch,backpropagation,fast-ai,Python,Machine Learning,Pytorch,Backpropagation,Fast Ai,上下文 我正在建立一个超分辨率成像模型(U-Net)。我的数据包括显微镜下的血液涂片。我正在使用快速人工智能。 我想尝试一种新的损失函数,它将“关注”细胞的成分 我所做的 我创建了一个伪_mask函数,它接受两个参数,一个图像和一个从0到255的整数β。此函数首先计算单元分割遮罩,将遮罩的0值转换为β,并将结果应用于原始图像 我想创建一个自定义的loss函数,它将计算pseudo_mask函数输出上的MSE,并将其反向传播到原始图像 我的代码相当简单,因为我只是“完成”了Pytorch MSE
class MSE_Mask_Loss(_Loss):
def __init__(self, size_average=None, reduce=None, reduction: str = 'mean') -> None:
super(MSE_Mask_Loss, self).__init__(size_average, reduce, reduction)
def forward(self, input: Tensor, target: Tensor) -> Tensor:
input = tensor_pseudo_mask(input,255)
target = tensor_pseudo_mask(target,255)
return F.mse_loss(input, target, reduction=self.reduction)
代码运行良好,但我假设反向传播存在一些问题,因为使用此损失和β=255获得的结果非常糟糕,而它们应该与使用原始图像获得的(良好)结果相同
我做错了什么
编辑 张量伪掩模定义如下:
def tensor_pseudo_mask(tns,val):
for i in range(len(tns)):
tns[i,:,:,:] = pseudo_mask(tns[i,:,:,:],val).data
return tns.cuda()
在哪里
嗨,欢迎来到StackOverflow!请发布你的
张量伪掩码的代码。另外,input
是反向传播的变量,因此您对使用该tensor
可以执行的操作的选择仅限于可微操作(您可以使用target
执行任何操作)。感谢您的愿望和解释。这是有道理的,我想我试过蛮力,但没有给它足够的思考。如果有人感兴趣,我不知何故绕过了这个问题,将掩码应用于“损失张量”本身,而不是输入/输出。是的,您可以这样做,因为在这种情况下,如果您将损失归零,值将不会反向传播。嗨,欢迎使用StackOverflow!请发布你的张量伪掩码的代码。另外,input
是反向传播的变量,因此您对使用该tensor
可以执行的操作的选择仅限于可微操作(您可以使用target
执行任何操作)。感谢您的愿望和解释。这是有道理的,我想我试过蛮力,但没有给它足够的思考。如果有人感兴趣,我不知何故绕过了这个问题,将掩码应用于“损失张量”本身,而不是输入/输出。是的,您可以这样做,因为在这种情况下,如果您将损失归零,值将不会反向传播。
def convert(x, val):
if x == 0:
return val
else:
return x
vecfunc = np.vectorize(convert)
def apply_mask(img, mask):
tensor_mask = torch.unsqueeze(torch.Tensor(mask) / 255, 2) #For broadcasting
img_masked = tensor_mask * torch.Tensor(convert_Image_RGB(img))
return Image(convert_RGB_Image(img_masked))
def pseudo_mask(img, val):
mask_value = torch.Tensor(np.array(mask(img)))
pseudo_mask = vecfunc(mask_value, val)
applied_pseudo_mask = apply_mask(img,pseudo_mask)
return applied_pseudo_mask