RNN

Danger

Документирование модуля не завершено и может содержать неточности.

Описание

Данный модуль реализует слой рекуррентной нейронной сети с заданными параметрами.

Наследуется от класса Module.

RNN - это вид нейронных сетей, где связи между элементами образуют направленную последовательность. Благодаря этому появляется возможность обрабатывать серии событий во времени или последовательные пространственные цепочки.

В отличие от многослойных перцептронов, рекуррентные сети могут использовать свою внутреннюю память для обработки последовательностей произвольной длины.

Поэтому сети RNN применимы в таких задачах, где нечто целостное разбито на части, например: - распознавание рукописного текста - распознавание речи.

Было предложено много различных архитектурных решений для рекуррентных сетей от простых до сложных. В последнее время наибольшее распространение получили сеть с долговременной и кратковременной памятью (LSTM) и управляемый рекуррентный блок (GRU).

Подробнее можно прочитать в этой и этой статьях.

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

def __init__(self, insize, hsize, layers=1, mode="relu", direction="uni", dropout=0.0, getSequences=False,
                 initscheme=None, modifier="orthogonal", wscale=1.0, hintBatchSize=None, name=None):

Параметры

Параметр Возможные типы Описание По умолчанию
insize int Размер входных данных. -
hsize int Размер скрытого слоя. -
layers int Количество слоев. 1
mode str Тип слоя. relu
direction str Направление потока инфорамации. uni
dropout float Значение дропаута. 0.0
getSequences bool Вывод последовательностей. False
initscheme Union[tuple, str] Указывает схему инициализации весов слоя (см. createTensorWithScheme). None ("xavier_uniform", "in")
modifier str - orthogonal
wscale float Масштабирование весов. 1.0
hintBatchSize int Размер батча. None
name str Имя слоя. None

Пояснения

mode - Тип слоя. Возможные значения relu, tanh, lstm и gru.

direction - Направление распространения потока инфорамации. Возможные значения uni и bi.

initscheme - схема инициализации начального заполнения слоя.

modifier - преобразователь весов слоя. Возможные значения: orthogonal и identity.

Примеры

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

>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import RNN
>>> from PuzzleLib.Variable import Variable

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

Сгенерируем данные. Обратите внимание на формат: (seqlen, batchsize, insize).

>>> seqlen, batchsize, insize, hsize = 4, 1, 3, 3
>>> data = gpuarray.to_gpu(np.arange(seqlen * batchsize * insize).reshape((seqlen, batchsize, insize)).astype(np.float32))
>>> data

[[[ 0.  1.  2.]]

 [[ 3.  4.  5.]]

 [[ 6.  7.  8.]]

 [[ 9. 10. 11.]]]

Инициализируем модуль с указанными параметрами.

>>> rnn = RNN(insize, hsize, mode="relu", getSequences=True)
>>> rnn(data)

[[[0.         0.         0.2918247 ]]

 [[0.31463516 0.6462393  0.22470516]]

 [[0.435279   0.8795779  0.50135785]]

 [[0.94629204 1.501351   0.6262567 ]]]

Параметр getSequences

Используем параметры из предыдущего примера, но значение параметра getSequences теперь выставим как False.

>>> rnn = RNN(insize, hsize, mode="relu", getSequences=True)
>>> rnn(data)

[[[0.         0.         0.        ]]

 [[0.         0.         0.33020186]]

 [[0.         0.         0.8174335 ]]

 [[0.         0.         1.2767388 ]]]
 ```


### Параметр mode

Используем параметры из базового примера, но значение параметра `mode` выставим как `lstm`.


```python
>>> rnn = RNN(insize, hsize, mode="lstm", getSequences=True)
>>> rnn(data)

[[[ 4.8403159e-02  4.3665797e-02  2.0609833e-02]]

 [[-4.1056603e-02  2.8816430e-02  2.4628153e-03]]

 [[-5.1223528e-02  1.3443527e-02  2.7199136e-04]]

 [[-2.4379266e-02  6.2266723e-03  3.4860324e-05]]]