Элементарный слой фильтра PyTorch

1

Привет, я хочу добавить элементный уровень умножения, чтобы дублировать входные данные на многоканальные, как этот рисунок. (Таким образом, размер ввода M x N и размер фильтра M x N умножения), как показано на этом рисунке

Изображение 174551

Я хочу добавить настраиваемое значение инициализации для фильтрации, а также хочу, чтобы они получали градиент во время обучения. Тем не менее, я не могу найти элементный слой фильтра в PyTorch. Могу ли я это сделать? Или это просто невозможно в PyTorch?

Теги:
python-3.x
neural-network
pytorch

1 ответ

2
Лучший ответ

В pytorch вы всегда можете реализовать свои собственные слои, сделав их подклассами nn.Module. Вы также можете иметь обучаемые параметры в вашем слое, используя nn.Parameter.
Возможная реализация такого слоя может выглядеть

import torch
from torch import nn

class TrainableEltwiseLayer(nn.Module)
  def __init__(self, n, h, w):
    super(TrainableEltwiseLayer, self).__init__()
    self.weights = nn.Parameter(torch.Tensor(1, n, h, w))  # define the trainable parameter

  def forward(self, x):
    # assuming x is of size b-1-h-w
    return x * self.weights  # element-wise multiplication

Вам все еще нужно беспокоиться об инициализации весов. посмотрите в nn.init способы nn.init весов. Обычно один инициализирует веса всей сети перед обучением и перед загрузкой любой сохраненной модели (таким образом, частично обученные модели могут перекрывать случайные инициализации). Что-то вроде

model = mymodel(*args, **kwargs)  # instantiate a model
for m in model.modules():
  if isinstance(m, nn.Conv2d):
     nn.init.normal_(m.weights.data)  # init for conv layers
  if isinstance(m, TrainableEltwiseLayer):
     nn.init.constant_(m.weights.data, 1)  # init your weights here...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню