【问题标题】:Customized loss function in PyTorch which uses DNN outputs and additional variablesPyTorch 中使用 DNN 输出和附加变量的自定义损失函数
【发布时间】:2021-05-04 20:53:02
【问题描述】:

(如果我的英语不好,我很抱歉)

如果函数只需要 DNN 输出向量(预测)和 DNN 输出向量(ground truth),我可以在 PyTorch 中创建自己的损失函数。

我想使用额外的变量来计算损失。

我的训练和测试数据如下所示;

DNN 输入:

  1. Data_A -> 处理 1 -> Data_X

DNN 输出:

  1. Data_A -> 处理 1 -> Data_X
  2. Data_B -> 处理 1 -> Data_P
  3. Data_X , Data_P -> 处理 2 -> Data_Y

我将Data_X 和Data_Y 分为训练数据和测试数据。 x_train, x_test, y_train, y_test = train_test_split(Data_X,Data_Y,test_size=0.2, random_state=0)

我想用Data_A、Data_B、Data_Y(predicted)和Data_Y(ground truth)来计算损失。 我看到了很多只使用Data_Y(predicted) 和Data_Y(ground truth) 的自定义损失函数的例子。我以前可以使用这种自定义的损失函数。 但是,当我想使用其他附加变量时,我不知道该怎么做。 有什么好办法吗?感谢您的帮助!

【问题讨论】:

  • 您的命名有点混乱,您的问题似乎很广泛:您有两个模型并使用第一个模型的输出来提供第二个模型。您想根据来自Data_A 和Data_B 的输入、模型的输出和基本事实来计算损失(什么损失?)。你可以实现这样的功能,是的。但是,如果没有更多细节,就很难提供帮助。
  • 感谢您的评论!我明白了,我会展示更多细节。 Data_A 和 Data_B 是复向量。 Processing 1 是 torch.abs()。因此Data_X = torch.abs(Data_A) 和Data_P = torch.abs(Data_B)。 Processing 2 由 torch.pow() 和 torch.div() 组成。详细点,Data_Y = torch.div(torch.pow(torch.abs(Data_A),2), torch.pow(torch.abs(Data_B),2)。 DNN 输入为Data_X。 DNN 输出为Data_Y。我想通过torch.mean(torch.pow(Data_Y * Data_A - Data_B ,2))来计算损失。
  • 只要您使用 PyTorch 运算符就可以了,请参阅下面 Shai 的回答以创建自定义损失函数。
  • 好的。我尝试创建一个自定义函数。谢谢你的帮助!!

标签: python-3.x pytorch loss-function dnn9


【解决方案1】:

您对损失函数的结构没有任何限制(只要梯度有意义)。
例如,您可以:

class MyLossLayer(nn.Module):
  def __init__(self):
    super(MyLossLayer, self).__init__()

  def forward(self, pred_a, pred_b, gt_target):
    # I'm just guessing here - do whatever you want as long as you do not screw the gradients.
    loss = pred_a * (pred_b - target)
    return loss.mean()

【讨论】:

  • 感谢您的评论!我知道了。其实我想这样做; Data_A 和 Data_B 是复向量。 Processing 1 是 torch.abs()。因此Data_X = torch.abs(Data_A) 和Data_P = torch.abs(Data_B)。 Processing 2 由 torch.pow() 和 torch.div() 组成。详细点,Data_Y = torch.div(torch.pow(torch.abs(Data_A),2), torch.pow(torch.abs(Data_B),2)。 DNN 输入为Data_X。 DNN 输出为Data_Y。我想通过torch.mean(torch.pow(Data_Y * Data_A - Data_B ,2))来计算损失。
  • 如果我尝试在您的代码中这样做,pred_a 是 DNN 输出,而 gt_target 是 DNN 地面实况输出,pred_b1 是一个附加变量,等于 Data_A , pred_b2 也是一个附加变量,等于Data_B, 和loss = torch.mean(torch.pow(pred_a * pred_b1 - *pred_b2 ,2))。
  • 在这种情况下,我有一个关于附加变量的问题。我想我不必关心pred_a 或gt_target,它们像往常一样被赋予损失函数。但是,当我使用其他变量时,我需要手动将它们输入到损失函数中。但是,在训练过程中,损失函数是逐批计算的。我想知道我如何知道当前批次选择了哪些数据(索引)。你有什么想法?非常感谢。
  • 我使用了你的代码,它可以工作!!非常感谢。
猜你喜欢
  • 2018-05-06
  • 2019-05-27
  • 2018-08-26
  • 2021-11-13
  • 1970-01-01
  • 2018-09-24
  • 2020-02-25
  • 2021-02-20
  • 2021-10-03
相关资源
最近更新 更多