Deep learning 如何在一个Pyrotch nn中使用两个数据集的两个丢失?

Deep learning 如何在一个Pyrotch nn中使用两个数据集的两个丢失?,deep-learning,neural-network,pytorch,loss-function,multitasking,Deep Learning,Neural Network,Pytorch,Loss Function,Multitasking,我对pytorch和深度学习还很陌生。这是我的问题。对于一个回归问题,我有两个具有相同特征域的不同数据集共享一个神经网络。输入是特征,输出是目标值。第一个数据集使用正常损耗,而第二个数据集,我正在尝试为其创建新损耗 我搜索过多个损失问题,人们通常会把两个损失归纳为落后的过程。但我想反过来利用损失。(当我训练第一个数据集时,nn使用第一个损失,当我训练第二个数据集时,nn使用另一个损失) 这可能吗?如果有人有什么想法,请欣赏。损耗函数不一定与网络拓扑有关。您可以对使用的每个数据集使用相应的损失,例

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

我搜索过多个损失问题,人们通常会把两个损失归纳为落后的过程。但我想反过来利用损失。(当我训练第一个数据集时,nn使用第一个损失,当我训练第二个数据集时,nn使用另一个损失)


这可能吗?如果有人有什么想法,请欣赏。

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

如果第一个任务:
dataloader=torch.utils.data.dataloader(第一个数据集)
损失=第一次损失
其他:
dataloader=torch.utils.data.dataloader(第二个数据集)
损失=第二次损失
#pytorch训练循环,非常粗略
对于dataloader中的批处理:
x、 y=批次
optimizer.zero_grad()
loss=loss_fn(network.forward(x),y)#调用相应的loss函数
loss.backward()
optimizer.step()
您可以按顺序对两个数据集执行此操作(意味着您可以按年代进行交错):

数据加载器_1中批次的
:
...
损失=第一次损失(…)
对于dataloader_2中的批处理:
...
损耗=第二次损耗fn(…)
或者更好

dataset=torch.utils.data.ChainDataset([第一个数据集,第二个数据集])
dataloader=torch.utils.data.dataloader(数据集)
您也可以同时执行(通过示例进行交错)。我认为标准的方法是使用torch.utils.data.ConcatDataset

dataset=torch.utils.data.ConcatDataset([第一个数据集,第二个数据集])
dataloader=torch.utils.data.dataloader(数据集)
请注意,这里您需要每个示例存储有关其来源的数据集的信息,以便确定应用哪个成本


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

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

如果第一个任务:
dataloader=torch.utils.data.dataloader(第一个数据集)
损失=第一次损失
其他:
dataloader=torch.utils.data.dataloader(第二个数据集)
损失=第二次损失
#pytorch训练循环,非常粗略
对于dataloader中的批处理:
x、 y=批次
optimizer.zero_grad()
loss=loss_fn(network.forward(x),y)#调用相应的loss函数
loss.backward()
optimizer.step()
您可以按顺序对两个数据集执行此操作(意味着您可以按年代进行交错):

数据加载器_1中批次的
:
...
损失=第一次损失(…)
对于dataloader_2中的批处理:
...
损耗=第二次损耗fn(…)
或者更好

dataset=torch.utils.data.ChainDataset([第一个数据集,第二个数据集])
dataloader=torch.utils.data.dataloader(数据集)
您也可以同时执行(通过示例进行交错)。我认为标准的方法是使用torch.utils.data.ConcatDataset

dataset=torch.utils.data.ConcatDataset([第一个数据集,第二个数据集])
dataloader=torch.utils.data.dataloader(数据集)
请注意,这里您需要每个示例存储有关其来源的数据集的信息,以便确定应用哪个成本


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

我不确定我是否正确理解您的意思,您是否尝试按顺序对它们进行培训?与数据集1中的第一个数据一样,数据集1中的数据被送入网络,然后计算损耗并更新权重,然后使用数据集2中的数据并再次更新权重,依此类推?这与将两个损失加在一起,然后做一个反向操作是一样的。嗨,谢谢你的回复。在我的实验中,这两个数据集具有不同的重要性。我想进一步训练第一个数据集,所以我想我不会称之为“以顺序方式”。将第一个数据集训练多个历元,保留参数,然后将另一个数据集训练多个历元。这是我目前的实验设计。这可能吗?我不确定我是否正确理解了你,你是否在尝试按顺序训练他们?与数据集1中的第一个数据一样,数据集1中的数据被送入网络,然后计算损耗并更新权重,然后使用数据集2中的数据并再次更新权重,依此类推?这与将两个损失加在一起,然后做一个反向操作是一样的。嗨,谢谢你的回复。在我的实验中,这两个数据集具有不同的重要性。我想进一步训练第一个数据集,所以我想我不会称之为“以顺序方式”。将第一个数据集训练多个历元,保留参数,然后将另一个数据集训练多个历元。这是我目前的实验设计。这可能吗?谢谢你的精彩回复!我认为第一种格式适合我的实验。我试试看。谢谢你。谢谢你的精彩回复!我认为第一种格式适合我的实验。我试试看。非常感谢。