pytorch nn中的两个数据集如何使用两个损失?

问题描述

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

我已经研究了多种损失问题,人们通常会为落后过程总结两个损失。但是我想依次使用损失。 (当我训练第一个数据集时,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的一种方法是使用单独的数据加载器(通过这种方式,您可以灵活地采样每个数据加载器)。