GroupLinear¶
Описание¶
Этот модуль является групповой модификацией полносвязного слоя 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)