我正在尝试建立一个网络,其中一层从实数映射到{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中的不可微分性。
如果有人可以将我指向任何可以帮助我为自定义模块实现自己的反向支持或以任何方式避免出现此错误消息的来源,那将是很棒的事情。
谢谢!
答案 0 :(得分:1)
我注意到两件事
如果输入x为10x30(10个示例,30个特征)并且输出节点的数量为10,则参数矩阵为30x10。预期输出矩阵为10x10(10个示例为10个输出节点)
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]