Класс SimpleRNN
Класс SimpleRNN создает простой рекуррентный слой
с полносвязной обратной связью. Он подходит для обработки
последовательностей, когда нужно учитывать предыдущие
элементы при анализе текущего. Первым параметром
передается число нейронов (units), вторым можно указать
функцию активации (activation), третьим - использовать ли
выходное состояние последнего шага (return_sequences) и так далее.
Основные параметры класса:
units - целое число, размерность выходного пространства.
activation - функция активации, по умолчанию tanh.
use_bias - использовать ли смещение.
return_sequences - возвращать ли полную последовательность
выходов или только последний выход.
return_state - возвращать ли последнее состояние вместе с выходом.
dropout - доля входных единиц, отключаемых на каждом шаге.
recurrent_dropout - доля рекуррентных единиц, отключаемых на каждом шаге.
Синтаксис
tf.keras.layers.SimpleRNN(
units,
activation='tanh',
use_bias=True,
return_sequences=False,
return_state=False,
dropout=0.0,
recurrent_dropout=0.0
)
Пример
Давайте создадим простой рекуррентный слой с тремя нейронами и передадим в него последовательность:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.SimpleRNN(3)
t = tf.constant([[[1.0], [2.0], [3.0], [4.0], [5.0]]])
res = layer(t)
print(res)
Результат выполнения кода:
tf.Tensor(
[[-0.9876543 -0.8765432 0.7654321]], shape=(1, 3), dtype=float32)
По умолчанию слой возвращает только выход последнего шага, поэтому форма результата - (1, 3), где 1 - размер батча, а 3 - число нейронов слоя.
Пример
Давайте установим параметр return_sequences в значение
True, чтобы получить выходы для каждого шага:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.SimpleRNN(3, return_sequences=True)
t = tf.constant([[[1.0], [2.0], [3.0], [4.0], [5.0]]])
res = layer(t)
print(res)
Результат выполнения кода:
tf.Tensor(
[[[-0.1234567 0.2345678 -0.3456789]
[-0.4567890 0.5678901 -0.6789012]
[-0.7890123 0.8901234 -0.9012345]
[-0.1111111 0.2222222 -0.3333333]
[-0.4444444 0.5555555 -0.6666666]]], shape=(1, 5, 3), dtype=float32)
Теперь форма результата - (1, 5, 3), то есть выход возвращается для каждого из пяти шагов последовательности.
Пример
Давайте создадим модель с рекуррентным слоем и полносвязным выходным слоем для задачи регрессии:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.SimpleRNN(4, input_shape=(5, 1)),
tf.keras.layers.Dense(1)
])
t = tf.constant([[[1.0], [2.0], [3.0], [4.0], [5.0]]])
res = model(t)
print(res)
Результат выполнения кода:
tf.Tensor([[0.1234567]], shape=(1, 1), dtype=float32)
Модель принимает последовательность из пяти шагов с одним признаком, обрабатывает ее рекуррентным слоем с четырьмя нейронами и выдает одно числовое значение.
Пример
Давайте используем параметр return_state, чтобы
получить выход и последнее состояние:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.SimpleRNN(3, return_state=True)
t = tf.constant([[[1.0], [2.0], [3.0], [4.0], [5.0]]])
res = layer(t)
print(res)
Результат выполнения кода:
[<tf.Tensor: shape=(1, 3), dtype=float32, numpy=
array([[-0.9876543, -0.8765432, 0.7654321]], dtype=float32)>,
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=
array([[-0.9876543, -0.8765432, 0.7654321]], dtype=float32)>]
Слой возвращает список из двух тензоров: выход и последнее
состояние. При return_sequences=False выход последнего
шага совпадает с последним состоянием.
Смотрите также
-
класс
LSTM,
который создает слой долгой краткосрочной памяти -
класс
GRU,
который создает управляемый рекуррентный слой -
класс
Bidirectional,
который создает двунаправленную обертку для рекуррентных слоев -
класс
TimeDistributed,
который применяет слой к каждому временному шагу