Python PyTorch-自定义损失函数-图形外计算

Python PyTorch-自定义损失函数-图形外计算,python,deep-learning,neural-network,pytorch,data-modeling,Python,Deep Learning,Neural Network,Pytorch,Data Modeling,我对pytorch有点陌生,我正试着去了解它。 我读过关于自定义损失函数的书,就我所见,它们不能与内部计算图解耦。这意味着损失函数消耗张量,对张量执行操作(在pytorch中实现),并输出张量。有没有办法将损耗计算解耦并以某种方式将其插回 用例 我试图训练一个编码器,在那里潜在的空间将被优化到某种统计质量。这意味着我不分批训练,而是为整个历元和整个数据集计算单个损失值。这样教网络有可能吗 类编码器(nn.模块): 定义初始值(自身,基因组大小:int): 超级(编码器,自我)。\uuuu初始化

我对pytorch有点陌生,我正试着去了解它。 我读过关于自定义损失函数的书,就我所见,它们不能与内部计算图解耦。这意味着损失函数消耗张量,对张量执行操作(在pytorch中实现),并输出张量。有没有办法将损耗计算解耦并以某种方式将其插回

用例

我试图训练一个编码器,在那里潜在的空间将被优化到某种统计质量。这意味着我不分批训练,而是为整个历元和整个数据集计算单个损失值。这样教网络有可能吗

类编码器(nn.模块):
定义初始值(自身,基因组大小:int):
超级(编码器,自我)。\uuuu初始化
self.fc1=nn.Linear(基因组大小,基因组大小)
self.fc2=nn.Linear(基因组大小,基因组大小)
self.fc3=nn.Linear(基因组大小,基因组大小)
self.genome\u size=基因组大小
def前进(自身,x):
x=自身.fc1(x)
x=自身.fc2(x)
x=自身.fc3(x)
返回x
def系列编码器(
net:nn.Module,
优化器:优化器,
纪元:int,
人口:张量,
适合度:张量,
):
运行损耗=0.0
对于范围内的历元(历元):
optimizer.zero_grad()
产出=净(人口)
#编码器_损失的计算量很大,不能仅在张量上完成
#我需要将这些张量展开为numpy数组,并将它们用作另一个模型的输入
损耗=编码器损耗(输出、适应度)
运行损耗+=损耗
正在运行_loss.backward()
optimizer.step()
打印('编码器丢失:',丢失)
我见过一些累积
运行\u loss
的示例,但我的编码器无法学习任何东西。收敛图只是到处跳跃


也谢谢你的时间,我不确定每一个历元的一个步骤(也就是分批梯度下降)是否能很好地工作,在许多现实世界的情况下它不会工作。@jodag我知道这一点。这只是纯粹的理论工作。>你可能想在新纪元开始时优化.zero_grad()一次,似乎我在开始时就在调零。我应该把它移到外面吗?啊,我读错了你的一些代码,很抱歉。基本上,我唯一觉得不对的是跑步损失部分。你应该只在该历元的损失项上向后,而不是运行损失。请注意,如果
encoder\u loss
将张量复制到numpy数组并在那里进行操作,autograd无法告诉你的损失函数相对于参数的梯度。在这种情况下,你需要为损失编写你自己的梯度函数