Python 通过torch.ge获取导数,或者如何在pytorch中明确定义导数
我试图建立一个网络,其中一层从实数映射到{0,1}(即使输出为二进制) 我试过的 虽然我发现,Python 通过torch.ge获取导数,或者如何在pytorch中明确定义导数,python,pytorch,autograd,Python,Pytorch,Autograd,我试图建立一个网络,其中一层从实数映射到{0,1}(即使输出为二进制) 我试过的 虽然我发现,torch.ge提供了这样的功能,但只要我想训练网络中该层崩溃之前出现的任何参数,PyTorch就会崩溃 我还一直在试图找到PyTorch/autograd中是否有任何方法可以手动覆盖模块的导数。更具体地说,在这个原因中,我只想通过torch.ge传递导数,而不改变它 最小示例 这里是我制作的一个最小示例,它使用PyTorch中的典型神经网络训练结构 导入火炬 导入torch.nn作为nn 将torch
torch.ge
提供了这样的功能,但只要我想训练网络中该层崩溃之前出现的任何参数,PyTorch就会崩溃
我还一直在试图找到PyTorch/autograd中是否有任何方法可以手动覆盖模块的导数。更具体地说,在这个原因中,我只想通过torch.ge传递导数,而不改变它
最小示例
这里是我制作的一个最小示例,它使用PyTorch中的典型神经网络训练结构
导入火炬
导入torch.nn作为nn
将torch.optim导入为optim
类LinearGE(nn.模块):
定义初始化(自、特征输入、特征输出):
super()。\uuuu init\uuuuu()
self.fc=nn.Linear(特征输入,特征输出)
def前进(自身,x):
返回火炬.ge(self.fc(x),0)
x=火炬。随机数(尺寸=(10,30))
y=torch.randint(2,尺寸=(10,10))
#定义模型
m1=线性大(30,10)
opt=optm.SGD(m1.parameters(),lr=0.01)
crit=nn.MSELoss()
#列车模型
对于x_批次,zip中的y_批次(x,y):
#将参数梯度归零
选项0_梯度()
#向前+向后+优化
pred=m1(x_批次)
loss=crit(pred.float(),y_batch.float())
loss.backward()
选择步骤()
我遇到的
运行上述代码时,出现以下错误:
File "__minimal.py", line 33, in <module>
loss.backward()
...
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
文件“\uuuu minimal.py”,第33行,在
loss.backward()
...
RuntimeError:张量的元素0不需要梯度,也没有梯度fn
此错误是有意义的,因为torch.ge
函数是不可微的。然而,由于MaxPool2D
也是不可微的,我相信有一些方法可以缓解PyTorch中的不可微性
如果有人能给我指出任何可以帮助我实现自定义模块的backprop或避免此错误消息的方法的源代码,那就太好了
谢谢 我注意到两件事
ge
=大于等于。如代码所示,x>=0个元素。我们可以使用relutorch.max
torch.max(self.fc(x), 0)[0]
为什么y
3000x10
?如果x是10x30
torch.max(self.fc(x), 0)[0]