tf.keras.layers.RNN
| Просмотреть исходный код на GitHub |
Базовый класс для рекуррентных слоев.
Наследуется от: Layer
tf.keras.layers.RNN(
cell, return_sequences=False, return_state=False, go_backwards=False,
stateful=False, unroll=False, time_major=False, **kwargs
)
См. Руководство по API рекуррентных нейронных сетей Keras для получения подробной информации о использовании API рекуррентных нейронных сетей.
| Аргументы | |
|---|---|
cell | Экземпляр ячейки RNN или список экземпляров ячеек RNN. Ячейка RNN — это класс, который имеет:
|
return_sequences | Булево (по умолчанию False). Возвращать ли последний выходной сигнал в последовательности вывода или всю последовательность. |
return_state | Булево (по умолчанию False). Возвращать ли последнее состояние помимо вывода. |
go_backwards | Булево (по умолчанию False). Если True, обрабатывать входную последовательность в обратном порядке и возвращать обращённую последовательность. |
stateful | Булево (по умолчанию False). Если True, последнее состояние для каждого образца с индексом i в пакете будет использоваться в качестве начального состояния для образца с индексом i в следующем пакете. |
unroll | Булево (по умолчанию False). Если True, сеть будет развернута, иначе будет использоваться символический цикл. Развёртывание может ускорить RNN, хотя оно, как правило, более ресурсоёмкое. Развёртывание подходит только для коротких последовательностей. |
time_major | Формат формы тензоров inputs и outputs. Если True, входные и выходные данные будут в форме (timesteps, batch, ...), в противном случае в форме (batch, timesteps, ...). Использование time_major = True немного эффективнее, потому что оно избегает транспонирования в начале и в конце вычислений RNN. Однако большинство данных TensorFlow — пакетно-главные, поэтому по умолчанию эта функция принимает вход и генерирует выход в пакетно-главной форме. |
zero_output_for_mask | Булево (по умолчанию False). Используются ли нули для замаскированных временных шагов в выходе. Обратите внимание, что это поле используется только при return_sequences = True и при наличии маски. Это может быть полезно, если вы хотите повторно использовать исходную последовательность вывода RNN без вмешательства от замаскированных временных шагов, например, объединяя двунаправленные RNN. |
Аргументы вызова:
-
inputs: Входной тензор. -
mask: Бинарный тензор формы[batch_size, timesteps], указывающий, должен ли быть замаскирован данный временной шаг. -
training: Булево значение Python, указывающее, должна ли работать ячейка в режиме обучения или в режиме вывода. Этот аргумент передаётся ячейке при вызове. Это необходимо для ячеек, использующих дропаут. -
initial_state: Список тензоров начального состояния, которые необходимо передать в первый вызов ячейки. -
constants: Список константных тензоров, которые необходимо передать ячейке на каждом временном шаге.
Форма входных данных:
N-мерный тензор с формой [batch_size, timesteps, ...] или [timesteps, batch_size, ...] при time_major = True.
Форма выходных данных:
- Если
return_state: список тензоров. Первый тензор — это вывод. Остальные тензоры — это последние состояния, каждое с формой[batch_size, state_size], гдеstate_sizeможет быть многомерной формой тензора. - Если
return_sequences: N-мерный тензор с формой[batch_size, timesteps, output_size], гдеoutput_sizeможет быть многомерной формой тензора, или[timesteps, batch_size, output_size]приtime_major= True. - В противном случае, N-мерный тензор с формой
[batch_size, output_size], гдеoutput_sizeможет быть многомерной формой тензора.
Маскирование:
Этот слой поддерживает маскирование для входных данных с переменным количеством временных шагов. Для введения масок в ваши данные используйте слой [tf.keras.layers.Embedding] с параметром mask_zero установленным в значение True.
Примечание по использованию состояний в RNN: Вы можете установить слои RNN в «состоятельное» состояние, что означает, что состояния, вычисленные для образцов в одном пакете, будут повторно использоваться в качестве начальных состояний для образцов в следующем пакете. Это предполагает взаимно однозначное соответствие между образцами в разных последовательных пакетах.
Чтобы включить состоятельность:
- Specify `stateful=True` in the layer constructor.
- Specify a fixed batch size for your model, by passing
If sequential model:
`batch_input_shape=(...)` to the first layer in your model.
Else for functional model with 1 or more Input layers:
`batch_shape=(...)` to all the first layers in your model.
This is the expected shape of your inputs
*including the batch size*.
It should be a tuple of integers, e.g. `(32, 10, 100)`.
- Specify `shuffle=False` when calling fit().
Чтобы сбросить состояния вашей модели, вызовите .reset_states() на определённом слое или на всей вашей модели.
Примечание об указании начального состояния RNN: Вы можете символически указать начальное состояние слоёв RNN, вызвав их с ключевым аргументом initial_state. Значение initial_state должно быть тензором или списком тензоров, представляющих начальное состояние слоя RNN.
Вы можете численно указать начальное состояние слоёв RNN, вызвав reset_states с ключевым аргументом states. Значение states должно быть массивом NumPy или списком массивов NumPy, представляющих начальное состояние слоя RNN.
Примечание о передаче внешних констант в RNN: Вы можете передавать «внешние» константы в ячейку, используя ключевой аргумент constants метода RNN.call (а также метода RNN.call). Это требует, чтобы метод cell.call принимал тот же ключевой аргумент constants . Такие константы могут использоваться для условного преобразования ячейки на основе дополнительных статических входных данных (не изменяющихся со временем), т.е. механизма внимания.
Примеры:
# First, let's define a RNN Cell, as a layer subclass.
class MinimalRNNCell(keras.layers.Layer):
def __init__(self, units, **kwargs):
self.units = units
self.state_size = units
super(MinimalRNNCell, self).__init__(**kwargs)
def build(self, input_shape):
self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
initializer='uniform',
name='kernel')
self.recurrent_kernel = self.add_weight(
shape=(self.units, self.units),
initializer='uniform',
name='recurrent_kernel')
self.built = True
def call(self, inputs, states):
prev_output = states[0]
h = K.dot(inputs, self.kernel)
output = h + K.dot(prev_output, self.recurrent_kernel)
return output, [output]
# Let's use this cell in a RNN layer:
cell = MinimalRNNCell(32)
x = keras.Input((None, 5))
layer = RNN(cell)
y = layer(x)
# Here's how to use the cell to build a stacked RNN:
cells = [MinimalRNNCell(32), MinimalRNNCell(64)]
x = keras.Input((None, 5))
layer = RNN(cells)
y = layer(x)
| Атрибуты | |
|---|---|
states | |
Методы
reset_states
reset_states(
states=None
)
Сбросить записанные состояния для состоятельного слоя RNN.
Может быть использован только при создании слоя RNN с stateful = True . Args: states: Массивы NumPy, содержащие значения для начального состояния, которые будут переданы ячейке на первом временном шаге. Когда значение None, создаётся массив NumPy, заполненный нулями, на основе размера состояния ячейки.
| Исключения | |
|---|---|
AttributeError | При использовании слоя RNN не в состоятельном режиме. |
ValueError | При неизвестном размере пакета слоя RNN. |
ValueError | При несовместимости входного массива NumPy со состоянием слоя RNN, как по размеру, так и по типу данных. |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/keras/layers/RNN