Pointers 如何在训练神经网络时节省中间权重
我正在使用pytorch训练一个神经网络,我想在每次迭代时保存权重。换句话说,我想创建一个列表,其中包含神经网络在训练期间拥有的所有权重 我做了以下工作: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
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'
)。