[英]How to partition a neural network into sub-networks in Pytorch?
如果您的子网是层的子集,您可以轻松地做到这一点。 也就是说,您不需要冻结任何部分图层。 要么全有,要么全无。
对于您的示例,这意味着将隐藏层分为两个不同的 2 节点层。 每个都属于恰好一个子网,这使我们回到全部或全部。
完成后,您可以使用requires_grad切换各个层。 在参数上将此设置为False
将禁用训练并冻结权重。 要对整个 model、子模型或Module执行此操作,请遍历model.parameters()
。
对于您的示例,有 3 个输入、1 个 output 和一个现在拆分的 2x2 隐藏层,它可能看起来像这样:
import torch.nn as nn
import torch.nn.functional as F
def set_grad(model, grad):
for param in model.parameters():
param.requires_grad = grad
class HalfFrozenModel(torch.nn.Module):
def __init__(self):
super().__init__()
self.hid1 = torch.nn.Linear(3, 2)
self.hid2 = torch.nn.Linear(3, 2)
self.out = torch.nn.Linear(4, 1)
def set_freeze(self, hid1=False, hid2=False):
set_grad(self.hid1, not hid1)
set_grad(self.hid2, not hid2)
def forward(self, inp):
hid1 = self.hid1(inp)
hid2 = self.hid2(inp)
hidden = torch.cat([hid1, hid2], 1)
return self.out(F.relu(hidden))
然后你可以像这样训练一半或另一半:
model = HalfFrozenModel()
model.set_freeze(hid1=True)
# Do some training.
model.set_freeze(hid2=True)
# Do some more training.
# ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.