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]]]