Pytorch中的自定义丢失,其中对象没有向后属性()

Pytorch中的自定义丢失,其中对象没有向后属性(),pytorch,Pytorch,我是pytorch的新手,我尝试创建自己的自定义丢失。这真的很有挑战性。下面是我为我的损失所做的一切 类自定义丢失(nn.模块): def uuu init uuu(self,size_average=True,reduce=True): """ Args: size_average(bool,可选):默认情况下,损失是平均的 对每个小批次进行过多观察。但是,如果 size_average设置为“False”,则将损失汇总为 每个小批量。仅当reduce为“True”时适用。默认值为“True”

我是pytorch的新手,我尝试创建自己的自定义丢失。这真的很有挑战性。下面是我为我的损失所做的一切

类自定义丢失(nn.模块):
def uuu init uuu(self,size_average=True,reduce=True):
"""
Args:
size_average(bool,可选):默认情况下,损失是平均的
对每个小批次进行过多观察。但是,如果
size_average设置为“False”,则将损失汇总为
每个小批量。仅当reduce为“True”时适用。默认值为“True”``
reduce(bool,可选):默认情况下,损失是平均的
每个小批量的过度观察,或汇总,取决于
平均大小。当reduce为“False”时,返回每个输入/目标的损失
元素,并忽略大小\平均值。默认值:``True``
"""
超级(自定义丢失,自我)。\uuuu初始化
def转发(自身、S、N、M,type='softmax',):
返回自损耗校准(S、N、M、类型)
###新损失校准
def损耗校准(自身,S,N,M,type=“softmax”,):
“”“使用相似矩阵式(6)(7)计算损失”
:类型:“softmax”或“对比度”
:返回:丢失
"""
self.A=torch.cat([S[i*M:(i+1)*M,i:(i+1)]
对于范围(N)]内的i,尺寸=0)
self.A=torch.autograd.Variable(self.A)
如果类型==“softmax”:
self.B=torch.log(torch.sum(torch.exp(S.float()),dim=1,keepdim=True)+1e-8)
self.B=火炬自动加载变量(self.B)
总计=火炬绝对值(火炬总和(自我A-自我B))
其他:
raise AssertionError(“损失类型应为softmax或contrast!”)
返回总数
当我运行以下命令时:

loss=CustomLoss()
(损失。损失计算(S=S,N=N,M=M))
loss.backward()
我得到以下错误:

C:\Program Files\Anaconda3\lib\site packages\IPython\core\interactiveshell.py in run\u cell\u magic(self,magic\u name,line,cell)
2113 magic_arg_s=self.var_expand(行、堆栈深度)
2114带自建存水弯:
->2115结果=fn(魔法参数,单元格)
2116返回结果
2117
及时(自身、线路、小区、本地)
C:\ProgramFiles\Anaconda3\lib\site packages\IPython\core\magic.py in(f,*a,**k)
186#但仅仅为了那一点点国家就太过分了。
187 def魔术装饰(arg):
-->188调用=λf,*a,**k:f(*a,**k)
189
190如果可调用(arg):
C:\Program Files\Anaconda3\lib\site packages\IPython\core\magics\execution.py及时(self、line、cell、local)
1178其他:
1179 st=时钟2()
->1180 exec(代码、全局、本地)
1181结束=时钟2()
1182 out=无
在()
C:\Program Files\Anaconda3\lib\site packages\torch\nn\modules\module.py in\uuuuu getattr\uuuuu(self,name)
530返回模块[名称]
531 raise AttributeError(“{}”对象没有属性“{}”。格式(
-->532类型(自身)。_名称_;名称)
533
534定义设置属性(自身、名称、值):
AttributeError:“CustomLoss”对象没有“backward”属性
为什么我会犯这个错误?我没有用TF面对这个错误。我的理解是,这和签名有关?如果有人能解释我为什么要面对这个错误,我就能找出其余的原因

问题是您试图在模块上调用backward函数,而不是在变量上(您可能希望这样做)。由于您尚未在模块上实现向后函数,因此解释器无法找到向后函数。因此,您要做的是:

loss\u func=CustomLoss()
损失=损失函数损失计算(S=S,N=N,M=M)
loss.backward()
总而言之:
您使用的是一个
nn.Module
,它实际上没有参数。虽然这是可行的,但这并不是模块的目的,因此应该避免。相反,只需制作一个纯函数——毕竟,这里的函数是静态的。如果你真的想去上课,想想你想创建什么类型的课-一个
loss
。然而,损耗可能具有特殊的特性。所以你应该仔细阅读一篇讨论。

哇!这是一个非常容易的解决办法!非常感谢你!我按照你的建议做了更改,讨论非常有益。非常感谢。我对这个与优化器相关的问题进行了跟进。