GroupLinear

Описание

Info

Родительский класс: Module

Производные классы: -

Этот модуль является групповой модификацией полносвязного слоя Linear: если при обычном полносвязном слое к нему на вход приходит вектор и на выходе также получается вектор, то в групповой модификации мы можем получать на выходе несколько векторов, полученных с использованием независимых весов.

Размерность

Если для обычного полносвязного слоя размерность входного тензора (N, L_{in}), а выходного (N, L_{out}), то для групповой модификации размерности будут (N, G, L_{in}) для входного и (N, G, L_{out}) для выходного тензоров (или (G, N, L_{in}) и (G, N, L_{out}) - зависит от параметра batchDim), где N - размер батча, G - количество групп, L_{in} - размер входного вектора признаков, L_{out} - размер выходного вектора признаков

Инициализация

def __init__(self, groups, insize, outsize, wscale=1.0, useW=True, useBias=True, initscheme=None,
                 inmode="full", wmode="full", batchDim=0, name=None, empty=False, transpW=False):

Параметры

Параметр Возможные типы Описание По умолчанию
groups int Количество групп. -
insize int Размер входного вектора. -
outsize int Размер выходного вектора. -
wscale float Дисперсия случайных весов слоя. 1.0
useW bool Использовать ли веса. True
useBias bool Использовать ли смещения. True
initscheme Union[tuple, str] Указывает схему инициализации весов слоя (см. createTensorWithScheme). None -> ("xavier_uniform", "in")
inmode str Режим входных данных. Возможные значения: full и one. full
wmode str Режим весов. Возможные значения: full и one. full
batchDim int Позиция размерности "Величина батча". 0
name str Имя слоя. None
empty bool Инициализировать ли матрицу весов и смещений. False
transpW bool Использовать ли транспонированную матрицу весов. False

Пояснения

groups - параметр, который контролирует соединения между входами и выходами; при значении groups=1 получается частный случай обычного полносвязного слоя;


inmode - при значении параметра one происходит размножение одного входного вектора на groups выходных с использованием независимых весов, т.е. (N, 1, L_{in}) \to (N, G, L_{out}); при значении full модуль работает в обычном режиме: (N, G, L_{in}) \to (N, G, L_{out});


wmode - при значения one из groups входных векторов будут получены groups выходных с использованием одних и тех же весов; при значении параметра full модуль работает в обычном режиме;


batchDim - если по умолчанию ось размера батча стоит на первом месте (N, G, L_{in}), то возможен случай, когда она меняется местами с осью групп при batchDim=1: (G, N, L_{in}).

Примеры


Базовый пример


Необходимые импорты.

>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import GroupLinear

Info

gpuarray необходим для правильного размещения тензора на GPU.

>>> batchsize, groups, insize = 1, 2, 3
>>> data = gpuarray.to_gpu(np.random.randint(0, 9, (batchsize, groups, insize)).astype(np.float32))
>>> print(data)
[[[5. 4. 4.]
  [4. 4. 3.]]]
>>> print(data.shape)
(1, 2, 3)

Инициализируем модуль с параметрами по умолчанию (useW=True, useBias=True, inmode="full", wmode="full", batchDim=0) и заполним тензор весов настраиваемыми величинами, чтобы было удобнее демонстрировать работу модуля:

>>> outsize = 4
>>> grpLinear = GroupLinear(groups, insize, outsize)
>>> print(grpLinear.W.shape)
(2, 3, 4)
>>> grpLinear.W[0].fill(1)
>>> grpLinear.W[1].fill(-1)
>>> grpLinear(data)
[[[ 13.  13.  13.  13.]
  [-11. -11. -11. -11.]]]
>>> print(grpLinear.data.shape)
(1, 2, 4)

Параметр wmode


Поменяем значение параметра wnmode:

>>> grpLinear = GroupLinear(groups, insize, outsize, wmode="one")
>>> print(grpLinear.W.shape)
(1, 3, 4)
>>> grpLinear.W.fill(1)
>>> grpLinear(data)
[[[13. 13. 13. 13.]
  [11. 11. 11. 11.]]]
>>> print(grpLinear.data.shape)
(1, 2, 4)


Параметр inmode


Поменяем значение параметра inmode и инициализируем для этого примера другие данные (имеющие соответствующую размерность):

>>> data = gpuarray.to_gpu(np.random.randint(0, 9, (batchsize, 1, insize)).astype(np.float32))
>>> print(data)
[[[5. 1. 5.]]]
>>> print(data.shape)
(1, 1, 3)

Снова заполним тензор весов настраиваемыми величинами:

>>> grpLinear = GroupLinear(groups, insize, outsize, inmode="one")
>>> print(grpLinear.W.shape)
(2, 3, 4)
>>> grpLinear.W[0].fill(1)
>>> grpLinear.W[1].fill(-1)
>>> grpLinear(data)
[[[ 11.  11.  11.  11.]
  [-11. -11. -11. -11.]]]
>>> print(grpLinear.data.shape)
(1, 2, 4)

Параметр batchDim


>>> data = gpuarray.to_gpu(np.random.randint(0, 9, (groups, batchsize, insize)).astype(np.float32))
>>> print(data.shape)
(2, 1, 3)
>>> grpLinear = GroupLinear(groups, insize, outsize, batchDim=1)
>>> grpLinear(data)
>>> print(grpLinear.data.shape)
(2, 1, 4)