Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有自定义损失函数的反向传播问题_Python_Machine Learning_Pytorch_Backpropagation_Fast Ai - Fatal编程技术网

Python 具有自定义损失函数的反向传播问题

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

上下文

我正在建立一个超分辨率成像模型(U-Net)。我的数据包括显微镜下的血液涂片。我正在使用快速人工智能。 我想尝试一种新的损失函数,它将“关注”细胞的成分

我所做的

我创建了一个伪_mask函数,它接受两个参数,一个图像和一个从0到255的整数β。此函数首先计算单元分割遮罩,将遮罩的0值转换为β,并将结果应用于原始图像

我想创建一个自定义的loss函数,它将计算pseudo_mask函数输出上的MSE,并将其反向传播到原始图像

我的代码相当简单,因为我只是“完成”了Pytorch MSE loss函数

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