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

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

Сгенерируем данные. Обратите внимание на формат: (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))
print(data)
[[[ 0.  1.  2.]]

 [[ 3.  4.  5.]]

 [[ 6.  7.  8.]]

 [[ 9. 10. 11.]]]

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

rnn = RNN(insize, hsize, mode="relu", getSequences=True)
print(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=False)
print(rnn(data))
[[ 7.375621 11.44777   0.      ]]

Параметр mode

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

rnn = RNN(insize, hsize, mode="lstm", getSequences=True)
print(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]]]