Python 带fast.ai课程的问题第8课g属性

Python 带fast.ai课程的问题第8课g属性,python,pytorch,fast-ai,Python,Pytorch,Fast Ai,在fast.ai 2019第8课的课程中,反向传播中使用了一个奇怪的g属性,我检查了torch。张量这个属性不存在。我试图在call方法中打印inp.g/out.g的值,但是我得到了AttributeError:“Tensor”对象没有属性“g”,但是我能够在向后赋值之前获得inp.g/out.g的值,这个g属性是如何工作的 class Linear(): 定义初始值(self,w,b): self.w,self.b=w,b 定义呼叫(自我,inp): 打印('林中呼叫') self.inp=i

在fast.ai 2019第8课的课程中,反向传播中使用了一个奇怪的g属性,我检查了torch。张量这个属性不存在。我试图在call方法中打印inp.g/out.g的值,但是我得到了AttributeError:“Tensor”对象没有属性“g”,但是我能够在向后赋值之前获得inp.g/out.g的值,这个g属性是如何工作的

class Linear():
定义初始值(self,w,b):
self.w,self.b=w,b
定义呼叫(自我,inp):
打印('林中呼叫')
self.inp=inp
self.out=inp@self.w+self.b
尝试:
打印('out.g',self.out.g)
例外情况除外,如e:
打印('out.g dne yet')
退出
def向后(自我):
打印('out.g',self.out.g)
self.inp.g=self.out.g@self.w.t()
self.w.g=(self.inp.unsqueze(-1)*self.out.g.unsqueze(1)).sum(0)
self.b.g=self.out.g.sum(0)

-更新-

我能够计算出self.out.g值与代价函数MSE self.inp.g完全相同,但仍然无法计算出该值是如何传递到最后一个线性层的

class MSE():
定义呼叫(自我、inp、targ):
self.inp=inp
self.targ=targ
self.out=(inp.squence()-target.pow(2.mean)()
退出
def向后(自我):
self.inp.g=2。*(self.inp.squence()-self.target).unsqueze(-1)\
/自我目标形状[0]
打印('in mse backward',self.inp.g)
类模型():
定义初始值(self,w1,b1,w2,b2):
self.layers=[Lin(w1,b1),Relu(),Lin(w2,b2)]
self.loss=Mse()
定义呼叫(self,x,target):
对于self.layers中的l:
x=l(x)
返回自损(x,targ)
def向后(自我):
self.loss.backward()
对于反向(自分层)中的l:
l、 向后()

基本上,这必须处理python赋值的工作方式(指针,类似于C指针的工作方式)。在使用id(变量名)跟踪变量之后,我能够弄清楚g属性是如何产生的

#。。。在模型中(向前传球)。。。
x=层(x)#从线性层>>返回self.out并分配给x
# ...
返回自我。损失(x,目标)#x与从模型中获得的x(id)相同
# ========
# ... 在模型中(向后传球)。。。
self.loss.backward()#self.inp.g就是这样出现的
# ... 在线性。。。
self.inp.g=self.out.g@self.w.t()
#这个self.out.g与loss中的self.inp.g是同一个实例