Python 通过torch.ge获取导数,或者如何在pytorch中明确定义导数

Python 通过torch.ge获取导数,或者如何在pytorch中明确定义导数,python,pytorch,autograd,Python,Pytorch,Autograd,我试图建立一个网络,其中一层从实数映射到{0,1}(即使输出为二进制) 我试过的 虽然我发现,torch.ge提供了这样的功能,但只要我想训练网络中该层崩溃之前出现的任何参数,PyTorch就会崩溃 我还一直在试图找到PyTorch/autograd中是否有任何方法可以手动覆盖模块的导数。更具体地说,在这个原因中,我只想通过torch.ge传递导数,而不改变它 最小示例 这里是我制作的一个最小示例,它使用PyTorch中的典型神经网络训练结构 导入火炬 导入torch.nn作为nn 将torch

我试图建立一个网络,其中一层从实数映射到{0,1}(即使输出为二进制)

我试过的 虽然我发现,
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或避免此错误消息的方法的源代码,那就太好了

谢谢

我注意到两件事

  • 如果输入x为10x30(10个示例,30个特征),输出节点数为10,则参数矩阵为30x10。预期输出矩阵为10x10(10个示例10个输出节点)

  • ge
    =大于等于。如代码所示,x>=0个元素。我们可以使用relu

  • torch.max

    torch.max(self.fc(x), 0)[0]
    

    为什么y
    3000x10
    ?如果x是
    10x30
    torch.max(self.fc(x), 0)[0]