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)