如何在PyTorch中提取线性图层的权重和偏差?

bkhjykvo  于 2023-03-02  发布在  其他
关注(0)|答案(4)|浏览(447)

model.state_dict()中,nn.Linear()模的model.parameters()model.named_parameters()权和偏置是分开的,例如fc1.weightfc1.bias,有没有一种简单的pythonic方法可以同时得到它们?
预期示例如下所示:

layer = model['fc1']
print(layer.weight)
print(layer.bias)
bvn4nwqk

bvn4nwqk1#

可以恢复模型中每个线性层的命名参数,如下所示:

from torch import nn

for layer in model.children():
    if isinstance(layer, nn.Linear):
        print(layer.state_dict()['weight'])
        print(layer.state_dict()['bias'])
rt4zxlrg

rt4zxlrg2#

从图层提取值的步骤。

layer = model['fc1']
print(layer.weight.data[0])
print(layer.bias.data[0])

可以使用要提取的神经元值来代替0索引。

>> nn.Linear(2,3).weight.data
tensor([[-0.4304,  0.4926],
        [ 0.0541,  0.2832],
        [-0.4530, -0.3752]])
8ftvxx2r

8ftvxx2r3#

从完整的模型来看,不存在,但是你可以得到特定Modulestate_dict(),然后你会得到一个dict以及weightbias

import torch

m = torch.nn.Linear(3, 5)  # arbitrary values
l = m.state_dict()

print(l['weight'])
print(l['bias'])

在您的代码中的等效代码为:

layer = model.fc1.state_dict()
print(layer['weight'])
print(layer['bias'])
9rnv2umw

9rnv2umw4#

当我尝试在pytorch中创建原型并在C++ / Eigen中重新实现时,我遇到了同样的问题。
这是我在给我的模型类添加一个方法时得到的结果:

def to_obj(self):
    data = {}
    for lname,child in self.named_children():
      ldict = {}
      data[lname] = ldict
      for key,tens in child.state_dict().items():
        ldict[key] = tens.numpy().tolist()
    return data

然后保存使用

from json import dump

with open(FULLPATH,mode='w') as out:
    dump(model.to_obj(),out)

我的情况很简单,所以你可能要区分孩子的类型...

相关问题