Python PyTorch中的简单L1损失

Python PyTorch中的简单L1损失,python,machine-learning,deep-learning,pytorch,Python,Machine Learning,Deep Learning,Pytorch,我想计算一个神经网络中的L1损失,我在上遇到了这个例子,但这段代码中有一些错误 这真的是如何计算NN中的L1损耗,还是有更简单的方法 l1_crit = nn.L1Loss() reg_loss = 0 for param in model.parameters(): reg_loss += l1_crit(param) factor = 0.0005 loss += factor * reg_loss 这是否等同于简单的操作: loss = torch.nn.L1Loss() 我

我想计算一个神经网络中的L1损失,我在上遇到了这个例子,但这段代码中有一些错误

这真的是如何计算NN中的L1损耗,还是有更简单的方法

l1_crit = nn.L1Loss()
reg_loss = 0
for param in model.parameters():
    reg_loss += l1_crit(param)

factor = 0.0005
loss += factor * reg_loss
这是否等同于简单的操作:

loss = torch.nn.L1Loss()

我假设不是,因为我没有传递任何网络参数。只需检查是否存在执行此操作的现有函数

如果我理解得很好,您需要计算模型的L1损失,正如您在开始时所说的。然而,我认为你可能会对pytorch论坛上的讨论感到困惑

据我所知,在Pytorch论坛和您发布的代码中,作者试图用L1正则化规范化网络权重。因此,它试图强制要求权重值落在一个合理的范围内,不要太大,也不要太小。这就是使用L1规范化的权重规范化,这就是它使用model.parameters的原因。标准化将值作为输入,并生成标准化值作为输出。 检查此项以了解权重规格化:

另一方面,L1损耗它只是一种确定两个值之间差异的方法,所以损耗只是这种差异的度量。在L1损失的情况下,使用平均绝对误差损失=| x-y |计算该误差,其中x和y是要比较的值。因此,错误计算将2个值作为输入,并生成一个值作为输出。 检查此项以了解损失计算:

回答您的问题:不,上面的代码片段并不等效,因为第一个代码片段尝试进行权重标准化,第二个代码片段尝试计算损失。这将是在某些情况下的损失计算:

sample, target = dataset[i]
target_predicted = model(sample)
loss = torch.nn.L1Loss()
loss_value = loss(target, target_predicted)

如果我理解得很好,您需要计算模型的L1损失,正如您在开始时所说的。然而,我认为你可能会对pytorch论坛上的讨论感到困惑

据我所知,在Pytorch论坛和您发布的代码中,作者试图用L1正则化规范化网络权重。因此,它试图强制要求权重值落在一个合理的范围内,不要太大,也不要太小。这就是使用L1规范化的权重规范化,这就是它使用model.parameters的原因。标准化将值作为输入,并生成标准化值作为输出。 检查此项以了解权重规格化:

另一方面,L1损耗它只是一种确定两个值之间差异的方法,所以损耗只是这种差异的度量。在L1损失的情况下,使用平均绝对误差损失=| x-y |计算该误差,其中x和y是要比较的值。因此,错误计算将2个值作为输入,并生成一个值作为输出。 检查此项以了解损失计算:

回答您的问题:不,上面的代码片段并不等效,因为第一个代码片段尝试进行权重标准化,第二个代码片段尝试计算损失。这将是在某些情况下的损失计算:

sample, target = dataset[i]
target_predicted = model(sample)
loss = torch.nn.L1Loss()
loss_value = loss(target, target_predicted)

那代码根本不起作用。l1_crit需要两个参数,而不是一个。为什么要根据模型参数计算损失?第二行显然与第一行不同,因为第一行是相同的,具有不同的大小\u平均值,这是不推荐的,但是其余的都被忽略了。很抱歉,我从中获得了这段代码。我怎样才能让它起作用呢,我将删除这个被贬低的论点。但是我可以把参数输入函数吗,不是吗?@dorien你提供的链接是关于L1正则化的。这就是你想要的吗?这与计算网络末端的损耗不同。另外,若你们真的想要L1正则化,你们应该用zerosOh替换或者更确切地说填充目标,我确实想要包括L1正则化。你能更具体地说我应该如何用零替换目标吗?@dorien和L1你基本上希望你的参数是稀疏的,所以你想惩罚它们为零L1_critparam,target=torch.zeros_likeparam,size_average=False,但通常你不需要使用L1Loss。你也可以使用norm,请看,我不认为有一个更简单的方法来做这个norm。当然,在链接中,用例是不同的,您将获取代码甚至不起作用的模型的所有参数。l1_crit需要两个参数,而不是一个。为什么要根据模型参数计算损失?第二行显然与第一行不同,因为第一行是相同的,具有不同的大小\u平均值,这是不推荐的,但是其余的都被忽略了。很抱歉,我从中获得了这段代码。我怎样才能让它起作用呢,我将删除这个被贬低的论点。但是我可以把参数输入函数吗,不是吗?@dorien你提供的链接是关于L1正则化的。这就是你想要的吗?这与计算网络末端的损耗不同。另外,若你们真的想要L1正则化,你们应该用zerosOh替换或者更确切地说填充目标,我确实想要包括L1正则化。你能更具体地说明我应该如何替换t吗
他用零作为目标?@dorien用L1你基本上希望你的参数是稀疏的,所以你想惩罚它们为零L1_critparam,target=torch.zeros_likeparam,size_average=False,但通常你不需要使用L1Loss。你也可以使用norm,请看,我不认为有一个更简单的方法来做这个norm。当然,在链接中,用例是不同的,您将获取模型的所有参数她实际上确认了它是关于L1正则化的,她只是碰巧使用了L1Loss而不是norm她实际上确认了它是关于L1正则化的,她只是碰巧使用了L1Loss而不是norm