Python 如何在Pytorch中将神经网络划分为子网络?

Python 如何在Pytorch中将神经网络划分为子网络?,python,machine-learning,neural-network,pytorch,Python,Machine Learning,Neural Network,Pytorch,我想用Pytorch把一个神经网络分成两个子网络。要使事物具体化,请考虑这幅图像: 在1中,我有一个3x4x1神经网络。我想要的是,例如在历元1期间,我只想更新子网络1中的权重,即子网络2中出现的权重必须冻结。然后,在第二个历元中,我想训练出现在子网络2中的权重,而其余的应该被冻结 我如何才能做到这一点?如果子网是层的子集,则可以轻松做到这一点。也就是说,不需要冻结任何部分图层。要么全力以赴,要么一事无成 对于您的示例,这意味着将隐藏层划分为两个不同的2节点层。每一个都只属于其中一个子网络,这让

我想用Pytorch把一个神经网络分成两个子网络。要使事物具体化,请考虑这幅图像:

在1中,我有一个3x4x1神经网络。我想要的是,例如在历元1期间,我只想更新子网络1中的权重,即子网络2中出现的权重必须冻结。然后,在第二个历元中,我想训练出现在子网络2中的权重,而其余的应该被冻结


我如何才能做到这一点?

如果子网是层的子集,则可以轻松做到这一点。也就是说,不需要冻结任何部分图层。要么全力以赴,要么一事无成

对于您的示例,这意味着将隐藏层划分为两个不同的2节点层。每一个都只属于其中一个子网络,这让我们回到要么全有要么全无的状态

完成后,可以使用切换单个图层。将参数设置为False将禁用训练并冻结权重。要对整个模型、子模型或子模型执行此操作,请遍历model.parameters

对于您的示例,有3个输入、1个输出和一个现在分割的2x2隐藏层,它可能看起来像这样:

导入torch.nn作为nn 导入torch.nn.功能为F def set_梯度模型,梯度: 对于model.parameters中的参数: param.requires_grad=grad 类HalfFrozenModeltorch.nn.Module: 定义初始自我: 超级__ self.hid1=torch.nn.Linear3,2 self.hid2=torch.nn.Linear3,2 self.out=torch.nn.Linear4,1 def set_冻结自身,hid1=False,hid2=False: 设置_gradself.hid1,而不是hid1 设置_gradself.hid2,而不是hid2 def forwardself,inp: hid1=self.hid1inp hid2=self.hid2inp 隐藏=火炬。cat[hid1,hid2],1 返回self.outp.reluhidden 然后你可以像这样训练一半或另一半:

model = HalfFrozenModel()
model.set_freeze(hid1=True)
# Do some training.
model.set_freeze(hid2=True)
# Do some more training.
# ...

如果您碰巧使用了,那么图层组的概念也用于此。详细介绍了如何工作。

如果子网是层的子集,则可以轻松完成此操作。也就是说,不需要冻结任何部分图层。要么全力以赴,要么一事无成

对于您的示例,这意味着将隐藏层划分为两个不同的2节点层。每一个都只属于其中一个子网络,这让我们回到要么全有要么全无的状态

完成后,可以使用切换单个图层。将参数设置为False将禁用训练并冻结权重。要对整个模型、子模型或子模型执行此操作,请遍历model.parameters

对于您的示例,有3个输入、1个输出和一个现在分割的2x2隐藏层,它可能看起来像这样:

导入torch.nn作为nn 导入torch.nn.功能为F def set_梯度模型,梯度: 对于model.parameters中的参数: param.requires_grad=grad 类HalfFrozenModeltorch.nn.Module: 定义初始自我: 超级__ self.hid1=torch.nn.Linear3,2 self.hid2=torch.nn.Linear3,2 self.out=torch.nn.Linear4,1 def set_冻结自身,hid1=False,hid2=False: 设置_gradself.hid1,而不是hid1 设置_gradself.hid2,而不是hid2 def forwardself,inp: hid1=self.hid1inp hid2=self.hid2inp 隐藏=火炬。cat[hid1,hid2],1 返回self.outp.reluhidden 然后你可以像这样训练一半或另一半:

model = HalfFrozenModel()
model.set_freeze(hid1=True)
# Do some training.
model.set_freeze(hid2=True)
# Do some more training.
# ...

如果您碰巧使用了,那么图层组的概念也用于此。这篇文章详细介绍了它的工作原理。

谢谢。这似乎是一个很好的解决方案。唯一的缺点是,这不是通用的,因为您必须像这样配置每个模型。谢谢。这似乎是一个很好的解决方案。唯一的缺点是,这不是通用的,因为您必须像这样配置每个模型。