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.
np.random.seed(123)
batchsize, groups, insize = 1, 2, 3
data = gpuarray.to_gpu(np.random.randint(0, 9, (batchsize, groups, insize)).astype(np.float32))
print(data)
[[[2. 2. 6.]
[1. 3. 6.]]]
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)
print(grpLinear(data))
[[[ 10. 10. 10. 10.]
[-10. -10. -10. -10.]]]
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)
print(grpLinear(data))
[[[10. 10. 10. 10.]
[10. 10. 10. 10.]]]
print(grpLinear.data.shape)
(1, 2, 4)
Параметр inmode
¶
Поменяем значение параметра inmode
и инициализируем для этого примера другие данные (имеющие соответствующую размерность):
np.random.seed(123)
data = gpuarray.to_gpu(np.random.randint(0, 9, (batchsize, 1, insize)).astype(np.float32))
print(data)
[[[2. 2. 6.]]]
print(data.shape)
(1, 1, 3)
Снова заполним тензор весов настраиваемыми величинами:
grpLinear = GroupLinear(groups, insize, outsize=4, inmode="one")
print(grpLinear.W.shape)
(2, 3, 4)
grpLinear.W[0].fill(1)
grpLinear.W[1].fill(-1)
print(grpLinear(data))
[[[ 10. 10. 10. 10.]
[-10. -10. -10. -10.]]]
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)