pytorch: Как реализовать одну ссылку на нейрон? - PullRequest
0 голосов
/ 17 июня 2020

Например, я хотел бы иметь стандартную нейронную сеть с прямой связью со следующей структурой:

  1. n входных нейронов
  2. n нейронов на втором слое
  3. 2 нейрона на третьем слое
  4. n нейронов на четвертом слое

где

  • i-й нейрон в первом слое подключен точно к i-му нейрону во втором слое ( не знаю, как это сделать )
  • второй и третий слой полностью подключены, то же самое касается третьего и четвертый слой (я знаю, как это сделать - используя nn.Linear)
  • функция потерь - это MSE + L1 норма (вектора) весов между первыми двумя слоями (зависит от решения вопроса смогу ли я это сделать)

Мотивация: я хочу реализовать автоэнкодер и попытаться добиться некоторой разреженности (вот почему входные данные умножаются на один вес (переход от первого уровня ко второму )).

1 Ответ

1 голос
/ 17 июня 2020

Вы можете реализовать собственный слой, подобный nn.Linear:

import math
import torch
from torch import nn

class ElementWiseLinear(nn.Module):
    __constants__ = ['n_features']
    n_features: int
    weight: torch.Tensor
    def __init__(self, n_features: int, bias: bool = True) -> None:
        super(ElementWiseLinear, self).__init__()
        self.n_features = n_features
        self.weight = nn.Parameter(torch.Tensor(1, n_features))
        if bias:
            self.bias = nn.Parameter(torch.Tensor(n_features))
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()
    def reset_parameters(self) -> None:
        nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5))
        if self.bias is not None:
            fan_in, _ = nn.init._calculate_fan_in_and_fan_out(self.weight)
            bound = 1 / math.sqrt(fan_in)
            nn.init.uniform_(self.bias, -bound, bound)
    def forward(self, input: torch.Tensor) -> torch.Tensor:
        output = torch.mul(input, self.weight)
        if self.bias is not None:
            output += self.bias
        return output
    def extra_repr(self) -> str:
        return 'in_features={}, out_features={}, bias={}'.format(
            self.n_features, self.n_features, self.bias is not None
        )

, и использовать его следующим образом:

x = torch.rand(3)
layer = ElementWiseLinear(3, bias=False)
output = layer(x)

Конечно, вы делаете вещи намного проще, чем что :)

...