Pytorch 创建一个';这只是身份

Pytorch 创建一个';这只是身份,pytorch,Pytorch,我试图调试不同模块之间相当复杂的交互。如果能够用一个身份网络来代替其中一个进行调试,那将非常有帮助。例如: net\u a=NetworkA() net_b=NetworkB() net_c=NetworkC() 输入=自动加载变量(torch.rand(10,2)) 输出=净输出(输入) out=净值(out) out=净成本(out) 我希望能够将第二行更改为net_b=IdentityNet(),而不必检查并重新连接所有As到Cs。但是,当我创建一个完全空的nnModule时,优化器抛出

我试图调试不同模块之间相当复杂的交互。如果能够用一个身份网络来代替其中一个进行调试,那将非常有帮助。例如:

net\u a=NetworkA()
net_b=NetworkB()
net_c=NetworkC()
输入=自动加载变量(torch.rand(10,2))
输出=净输出(输入)
out=净值(out)
out=净成本(out)
我希望能够将第二行更改为
net_b=IdentityNet()
,而不必检查并重新连接所有As到Cs。但是,当我创建一个完全空的nnModule时,优化器抛出
ValueError:optimizer得到一个空的参数列表

有什么解决办法吗

最低限度的非工作示例:

将torch.optim导入为optim
类标识模块(nnModule):
def前进档(自身,输入):
返回输入
identity=IdentityModule()
opt=optim.Adam(标识,lr=0.001)
out=标识(任意张量)
误差=火炬平均值(out)
error.backward()
选择步骤()
你在这里遇到的问题是合乎逻辑的。看看你这样做意味着什么:

error.backward()
选择步骤()
.backward()
将递归计算从输出到传入网络的任何输入的梯度。就计算图而言,有两种值得注意的输入:传入的输入和模拟网络行为的
nn.Parameter
s。然后执行
opt.step()

但是,伪代码没有单个
nn.参数
!,因为标识模块不包含一个。因此,当您调用这些函数时,
opt.step()
没有目标,这解释了错误消息

这不适用于您前面描述的情况。如果将一个没有参数的模块链接到一个更大的链中,其中一些确实有参数,则计算图中有要训练的参数

不过,您需要确保优化器确实在初始化时传递了所有这些参数。一个简单的技巧是打印以下内容:

net\u a=SomeNetwork()
net_b=IdentityNetwork()#没有参数
net_c=SomeNetwork()
打印(列表(net_a.parameters())#将包含net_a中的任何参数
打印(列表(净参数())#将为[]
打印(列表(net_c.parameters())#将包含net_c中的任何参数
#要培训所有学员,您可以执行以下两项操作之一:
# 1. 创建新模块。这是可行的,因为“.parameters()”递归地从所有子模块收集参数。
类NewNet(nn.Module):
定义初始化(自):
nn.模块初始化(自)
self.net\u a=net\u a
self.net_b=身份
self.net\u c=net\u c
def前进(自我,输入):
返回self.net_c(self.net_b(self.net_a(输入)))
所有参数=列表(NewNet().parameters())
打印(所有参数)#将包含net_a和net_c的所有参数列表
# 2. 只需合并列表
所有参数=列表(净参数())+列表(净参数())+列表(净参数())
打印(所有参数)#将包含net_a和net_c的所有参数列表
opt=optim.SGD(所有参数)
您还可以:


编辑:在PyTorch 1.7中,
[nn.Identity](https://pytorch.org/docs/stable/generated/torch.nn.Identity.html#torch.nn.Identity)出现了
。文档位于[此处]。

pytorch的最新版本有一个标识模块

net_b=nn.Identity()

空模块是什么意思?您的
IdentifyNet()
看起来像什么?它只是返回输入吗?你应该让你的帖子更清晰。是的,我希望IdentityNet只返回它的输入。我想我可以让
forward
方法只返回输入,但是优化器会出现一个错误,说没有要优化的参数。我正在寻找关于编写IdentityNet类的建议。您应该提供一个最小的工作示例,让人们重现您的错误。好的,谢谢。我正在做一些事情,比如我不希望每次都更新所有参数,但我可以使用requires_grad=False来解决这个问题。很好的建议是将它们组合到一个网络中。@SamBobel,为什么不对中间变量使用
detach()
?我会研究一下,谢谢你的建议。我以前没看过《脱衣舞》
net_b = torch.nn.Sequential()