Привет, я хочу добавить элементный уровень умножения, чтобы дублировать входные данные на многоканальные, как этот рисунок. (Таким образом, размер ввода M x N и размер фильтра M x N умножения), как показано на этом рисунке
Я хочу добавить настраиваемое значение инициализации для фильтрации, а также хочу, чтобы они получали градиент во время обучения. Тем не менее, я не могу найти элементный слой фильтра в PyTorch. Могу ли я это сделать? Или это просто невозможно в PyTorch?
В 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...