neural-network - 在 pytorch 中反向传播时自动更新自定义层参数
问题描述
我有一个 pytorch 自定义层定义为:
class MyCustomLayer(nn.Module):
def __init__(self):
super(MyCustomLayer, self).__init__()
self.my_parameter = torch.rand(1, requires_grad = True)
# the following allows the previously defined parameter to be recognized as a network parameter when instantiating the model
self.my_registered_parameter = nn.ParameterList([nn.Parameter(self.my_parameter)])
def forward(self, x):
return x*self.my_parameter
然后我定义使用自定义层的网络:
class MyNet(nn.Module):
def __init__(self):
super(MyNet, self).__init__()
self.layer1 = MyCustomLayer()
def forward(self, x):
x = self.layer1(x)
return x
现在让我们实例化 MyNet 并观察问题:
# instantiate MyNet and run it over one input value
model = MyNet()
x = torch.tensor(torch.rand(1))
output = model(x)
criterion = nn.MSELoss()
loss = criterion(1, output)
loss.backward()
遍历模型参数显示None
自定义层参数:
for p in model.parameters():
print (p.grad)
None
直接访问该参数显示正确的grad
值:
print(model.layer1.my_parameter.grad)
tensor([-1.4370])
这反过来又阻止了优化步骤自动更新内部参数,让我不得不手动更新这些参数。任何人都知道我该如何解决这个问题?
解决方案
好吧!我不得不将自定义层中的参数变量调用切换到nn.ParameterList
对象(即return x*self.my_registered_parameter[0]
,而不是 x*self.my_parameter )。在此示例中,这意味着将自定义层在 forward 方法中的参数调用更改为:
def forward(self, x):
return x*self.my_registered_parameter[0]
这是通过引用传递的好地方!
现在 optim 按预期更新所有参数!
推荐阅读
- swift - 如何将pickerView选择分配给全局变量,以便可以在另一个类中使用?
- node.js - Node.js - 如何处理管道的 readStream
- python - 尝试在 Selenim Python 中使用 WebDriverWait 直到 present_of_element_located 而不是 sleep.time
- json - 发布成功后尝试发送 JSON 有效负载时出现 Jenkins 管道错误
- python-3.x - 试图安装 tqdm,但它说它已经安装?
- javascript - 如何使用 Javascript 查找所有匹配的类并允许它们全部运行一个函数
- azure - Azure Data Lake Gen2 的 Confluent Sink 连接器失败并出现 TimeoutException:无法创建许可证主题
- pine-script - 在 Pine Script 中使用 label.new 打印标签时出错
- java - Java 在 .bat 文件上模拟“打开方式”
- php - 如何在PHP中的单个字符串中替换所有时间戳?