Как маскировать веса в весовых параметрах PyTorch? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь замаскировать (принудительно обнулить) значения определенного веса в PyTorch.Веса, которые я пытаюсь замаскировать, определены следующим образом: def __init__

class LSTM_MASK(nn.Module):
        def __init__(self, options, inp_dim):
            super(LSTM_MASK, self).__init__()
            ....
            self.wfx = nn.Linear(input_dim, curernt_output, bias=add_bias)

Маска также определена в def __init__ как

self.mask_use = torch.Tensor(curernt_output, input_dim)

Маска является постоянной и.requires_grad_() равно False для параметра маски.Теперь в def forward части класса я пытаюсь выполнить поэлементное умножение параметра веса и маски до завершения линейной операции

def forward(self, x):
    ....
    self.wfx.weight = self.wfx.weight * self.mask_use
    wfx_out = self.wfx(x)

Я получаю сообщение об ошибке ann:

self.wfx.weight = self.wfx.weight * self.mask_use
  File "/home/xyz/anaconda2/lib/python2.7/site-packages/torch/nn/modules/module.py", line 537, in __setattr__
    .format(torch.typename(value), name))
TypeError: cannot assign 'torch.cuda.FloatTensor' as parameter 'weight' (torch.nn.Parameter or None expected)

Но когда я проверяю оба параметра с помощью .type(), оба они появляются как torch.cuda.FloatTensor.Я не уверен, почему здесь есть ошибка.

1 Ответ

0 голосов
/ 29 ноября 2018

Поэлементная операция всегда возвращает FloatTensor.Нормальные тензоры нельзя назначить как weight слоев.

Есть два возможных варианта решения этой проблемы.Вы можете назначить его атрибуту data вашего веса, там можно назначить обычные тензоры.

Или, в качестве альтернативы, вы конвертируете свой результат в nn.Parameter, а затем можете присвоить его wfx.weight.

Вот пример, который показывает оба способа:

import torch
import torch.nn as nn

wfx = nn.Linear(10, 10)
mask_use = torch.rand(10, 10)
#wfx.weight = wfx.weight * mask_use #your example - this raises an error

# Option 1: write directly to data
wfx.weight.data = wfx.weight * mask_use

# Option 2: convert result to nn.Parameter and write to weight
wfx.weight = nn.Parameter(wfx.weight * mask_use)

Отказ от ответственности: при использовании = (присваивания) для весов вы заменяете тензор весов вашего параметра.Это может оказать нежелательное влияние на график соотв.шаг оптимизации.

...