繁体   English   中英

conv1d pytorch 中的自定义权重初始化

[英]Custom weight initiatlization in conv1d pytorch

我正在尝试在 conv1d 中创建自定义权重,如下所示:

import torch
from torch import nn
conv = nn.Conv1d(1,1,kernel_size=2)
K = torch.Tensor([[[0.5, 0.5]]])
with torch.no_grad():
conv.weight = K

但我得到了错误

"File “D:\ProgramData\Miniconda3\envs\pytorchcuda102\lib\site-packages\torch\nn\modules\module.py”, line 611, in setattr
raise TypeError(“cannot assign ‘{}’ as parameter ‘{}’ "
TypeError: cannot assign ‘torch.FloatTensor’ as parameter ‘weight’ (torch.nn.Parameter or None expected)”

我究竟做错了什么?

你很亲密。 请注意,您不需要调用“with torch.no_grad()”,因为在权重分配过程中不会计算梯度。 您需要做的就是删除它并调用“conv.weight.data”而不是“conv.weight”,以便您可以访问基础参数值。 请参阅下面的固定代码:

import torch
from torch import nn
conv = nn.Conv1d(1,1,kernel_size=2)
K = torch.Tensor([[[0.5, 0.5]]])
conv.weight.data = K

根据此处的讨论,更新您的代码以包含torch.nn.Parameter() ,这基本上使权重可识别为优化器中的参数。

import torch
from torch import nn
conv = nn.Conv1d(1,1,kernel_size=2)
K = torch.tensor([[[0.5, 0.5]]]) #use one dimensional as per your conv layer
conv.weight = nn.Parameter(K) #use nn.parameters

对于更大和更复杂的模型,您可以看到这个使用 pytorch state_dict()方法的玩具示例。

import torch
import torch.nn as nn
import torchvision

net = torchvision.models.resnet18(pretrained=True)

pretrained_dict = net.state_dict()
conv_weights = pretrained_dict['conv1.weight'] #64,3,7,7

new = torch.tensor((), dtype=torch.int32)
new = new.new_ones(conv_weights.shape) #assigning all ones

pretrained_dict['conv1.weight'] = new


net.load_state_dict(pretrained_dict)
param = list(net.parameters())

print(param[0])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM