Pointers 如何在训练神经网络时节省中间权重

Pointers 如何在训练神经网络时节省中间权重,pointers,pytorch,Pointers,Pytorch,我正在使用pytorch训练一个神经网络,我想在每次迭代时保存权重。换句话说,我想创建一个列表,其中包含神经网络在训练期间拥有的所有权重 我做了以下工作: for i, (images, labels) in enumerate(train_loader): (.....code that is used to train the model here.....) weight = model.fc2.weight.detach().numpy() weight

我正在使用pytorch训练一个神经网络,我想在每次迭代时保存权重。换句话说,我想创建一个列表,其中包含神经网络在训练期间拥有的所有权重

我做了以下工作:

for i, (images, labels) in enumerate(train_loader):

     (.....code that is used to train the model here.....)

     weight = model.fc2.weight.detach().numpy()
     weights_list.append(weight)
然后,当我打印列表“权重列表”的条目时,我注意到它们都是相同的,这不可能是真的,因为我在训练期间打印了权重,它们确实发生了变化(网络确实在学习,因此它们必须学习)。 我的猜测是,在检查列表时,列表的每个条目实际上都是指向网络权重的指针。因此:

1) 我的猜测正确吗? 2) 我怎样才能解决这个问题


谢谢大家!

内置了保存和加载权重的功能。要保存到可以使用的文件,请执行以下操作:

torch.save('checkpoint.pt', model.state_dict())
model.load_state_dict(torch.load('checkpoint.pt'))
要加载,您可以使用

torch.save('checkpoint.pt', model.state_dict())
model.load_state_dict(torch.load('checkpoint.pt'))

也就是说,转换为numpy并不一定会创建副本。例如,如果您有一个numpy数组
y
,并且希望创建一个可以使用的副本

x = numpy.copy(y)

谢谢我这里还有一个额外的问题:从这里开始,我如何获得一个包含在单个层中的权重的数组?这取决于模型。加载模型后,可以作为成员变量访问其子模块。例如,如果您定义了一个模型
类MyModel(nn.Module):def\uu init\uuu(self):。。。self.layer1=nn.Linear(1,10).
(忽略空格错误)。假设一个实例被定义为
model=MyModel()
,您可以访问权重作为
model.layer1.weight
model.layer1.bias
。或者,如果您加载了此处描述的
'checkpoint.pt'
,您可以使用前面注释中的
state\u dict
变量
state\u dict['layer1.weight']
state\u dict['layer1.bias']
获取权重。如果有疑问,您可以
打印(state_dict.keys())
并找到您感兴趣的特定层的字典键(在上一个示例中,它们是
'layer1.weight'
'layer1.bias'
)。