PyTorch-更改Conv2d的权重

PyTorch-更改Conv2d的权重,pytorch,tensor,Pytorch,Tensor,由于某些原因,我似乎无法在PyTorch中分配Conv2d层的所有权重-我必须分两步完成。谁能帮我解决我做错了什么 layer = torch.nn.Conv2d(in_channels=1, out_channels=2, kernel_size=(2,2), stride=(2,2)) layer.state_dict()['weight'] 给我一个大小为(2,1,2,2)的张量 当我尝试这样分配权重时 layer.state_dict()['weight'] = torch.tenso

由于某些原因,我似乎无法在PyTorch中分配Conv2d层的所有权重-我必须分两步完成。谁能帮我解决我做错了什么

layer = torch.nn.Conv2d(in_channels=1, out_channels=2, kernel_size=(2,2), stride=(2,2))
layer.state_dict()['weight']
给我一个大小为(2,1,2,2)的张量

当我尝试这样分配权重时

layer.state_dict()['weight'] = torch.tensor([
  [[[ 1, 2],
    [3, 4]]],

  [[[-1, -2],
    [-3, -4]]]
])
重量不变。但是如果我这样做

layer.state_dict()['weight'][0] = torch.tensor([
  [[[1, 2],
    [3, 4]]],
])
layer.state_dict()['weight'][1] = torch.tensor([
  [[[-1, -2],
    [-3, -4]]],
])

重量会改变。为什么会这样?

我不确定为什么不能直接分配它们,但实现您想要做的事情更合适的方法是

layer.load_state_dict({'weight': torch.tensor([[[[0.4738, -0.2197],
                      [-0.3436, -0.0754]]],
                    [[[0.1662, 0.4098],
                      [-0.4306, -0.4828]]]])}, strict=False)

如果使用您自己的重量,您可能需要使用torch.nn.functional.conv2d
layer.load_state_dict({'weight': torch.tensor([[[[0.4738, -0.2197],
                      [-0.3436, -0.0754]]],
                    [[[0.1662, 0.4098],
                      [-0.4306, -0.4828]]]])}, strict=False)