通过torch.ge获取派生词,或者如何在pytorch中显式定义派生词

时间:2019-10-23 19:43:37

标签: python pytorch autograd

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

我尝试过的

每当我想训练网络PyTorch中断该层之前发生的任何参数时,我都能发现def growing_strings(los): sum=0 counter= 0 while counter+1 < len(los) and len(los[counter]) < len(los[counter+1]): sum+=1 counter+=1 if sum==len(los): return True else: return False 提供了这种功能。

我也一直在尝试寻找PyTorch / autograd中是否有任何方法可以手动覆盖模块的派生类。更具体地说,出于这个原因,我只想通过torch.ge传递导数,而不更改它。

最小示例

这是我制作的一个最小示例,它在PyTorch中使用了典型的神经网络训练结构。

torch.ge

我遇到的事情

当我运行上面的代码时,会发生以下错误:

import torch
import torch.nn as nn
import torch.optim as optim


class LinearGE(nn.Module):
    def __init__(self, features_in, features_out):
        super().__init__()
        self.fc = nn.Linear(features_in, features_out)

    def forward(self, x):
        return torch.ge(self.fc(x), 0)


x = torch.randn(size=(10, 30))
y = torch.randint(2, size=(10, 10))

# Define Model
m1 = LinearGE(30, 10)

opt = optim.SGD(m1.parameters(), lr=0.01)

crit = nn.MSELoss()

# Train Model
for x_batch, y_batch in zip(x, y):
    # zero the parameter gradients
    opt.zero_grad()

    # forward + backward + optimize
    pred = m1(x_batch)
    loss = crit(pred.float(), y_batch.float())
    loss.backward()
    opt.step()

由于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 函数不可微,因此此错误是有意义的。但是,由于torch.ge也是不可微的,所以我相信有一些方法可以减轻PyTorch中的不可微分性。

如果有人可以将我指向任何可以帮助我为自定义模块实现自己的反向支持或以任何方式避免出现此错误消息的来源,那将是很棒的事情。

谢谢!

1 个答案:

答案 0 :(得分:1)

我注意到两件事

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

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

class LinearGE(nn.Module):
    def __init__(self, features_in, features_out):
        super().__init__()
        self.fc = nn.Linear(features_in, features_out)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        return self.relu(self.fc(x))

torch.max

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