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