Skip to content

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.

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)