如何在一个 pytorch nn 中对两个数据集使用两个损失?

How do I use two loss for two dataset in one pytorch nn?

我对 pytorch 和深度学习还很陌生。这是我的问题。我有两个具有相同特征域的不同数据集共享一个神经网络来解决回归问题。输入是特征,输出是目标值。第一个数据集使用正常损失,而第二个数据集,我正在尝试为其创建一个新的损失。

我搜索过multi-loss问题,人们通常有两个loss加起来用于落后的过程。但是我想反过来使用损失。 (当我训练第一个数据集时,nn使用第一个损失,而当我训练第二个数据集时,nn使用另一个损失)

这可以吗?不胜感激,如果有人有想法。

损失函数不一定与网络拓扑有关。您可以对您使用的每个数据集使用相应的损失,例如

if first_task:
    dataloader = torch.utils.data.DataLoader(first_dataset)
    loss_fn = first_loss_fn
else: 
    dataloader = torch.utils.data.Dataloader(second_dataset)
    loss_fn = second_loss_fn

# The pytorch training loop, very roughly
for batch in dataloader: 
   x, y = batch
   optimizer.zero_grad()
   loss = loss_fn(network.forward(x), y) # calls the corresponding loss function
   loss.backward()
   optimizer.step()

您可以按顺序对两个数据集执行此操作(意味着您按时期交错):

for batch in dataloader_1: 
    ...
    loss = first_loss_fn(...)

for batch in dataloader_2: 
    ...
    loss = second_loss_fn(...)

或更好

dataset = torch.utils.data.ChainDataset([first_dataset, second_dataset])
dataloader = torch.utils.data.DataLoader(dataset) 

你也可以同时做(通过例子交叉)。我认为的标准方法是使用 torch.utils.data.ConcatDataset

dataset = torch.utils.data.ConcatDataset([first_dataset, second_dataset])
dataloader = torch.utils.data.DataLoader(dataset)

请注意,此处您需要每个样本存储有关其来源数据集的信息,以便您可以确定要应用的成本。

一种更简单的方法是按批次交错(然后对整个批次应用相同的成本)。对于这种情况,一种方法 proposed here 是使用单独的数据加载器(这样您就可以灵活地选择对每个数据加载器进行采样的频率)。