Инициализация пользовательского веса в conv1d pytorch

#python #pytorch

#python #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:ProgramDataMiniconda3envspytorchcuda102libsite-packagestorchnnmodulesmodule.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)”
  

Что я делаю не так?

Ответ №1:

Вы были близки к этому. Обратите внимание, что вам не нужно вызывать ‘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
  

Ответ №2:

Согласно обсуждению здесь, обновите свой код, чтобы включить torch.nn.Parameter() , что в основном делает weight узнаваемым как параметр в optimizer.

 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])
  

Комментарии:

1. Вам нужно будет установить K как трехмерный, иначе вы получите следующую ошибку: RuntimeError: вес должен иметь как минимум три измерения

2. я не получил ничего в pytorch 1.3.1

3. но да, вы правы, поскольку вывод print(conv.weight.data.shape) является torch.Size([1, 1, 2])

4. Попробуйте применить слой conv к некоторому тензору, и вы получите эту ошибку. Например: conv(torch.randn(1,1,10))

5. да, вы правы. вот почему я предпочитаю использовать net.state_dict() .