设置表示为Keras顺序模型的RNN的初始状态

时间:2020-07-22 23:09:03

标签: python tensorflow keras neural-network recurrent-neural-network

如何设置下面构造的循环神经网络rnn初始状态

from tensorflow.keras.layers import Dense, SimpleRNN
from tensorflow.keras.models import Sequential

rnn = Sequential([SimpleRNN(3), Dense(1)])

我想在用model.fit拟合模型之前指定第一层的初始状态。

2 个答案:

答案 0 :(得分:1)

根据tf.keras.layers.RNN documentation,您可以使用参数initial_state数字通过调用函数{{1}符号指定初始状态}}。

符号规范意味着您需要将初始状态作为输入添加到模型中。这是我改编自 Keras tests 的示例:

reset_states

一旦您的模型被定义,您就可以执行如下训练:

from tensorflow.keras.layers import Dense, SimpleRNN, Input
from tensorflow.keras.models import Model
import numpy as np
import tensorflow as tf

timesteps = 3
embedding_dim = 4
units = 3

inputs = Input((timesteps, embedding_dim))
# initial state as Keras Input
initial_state = Input((units,))
rnn = SimpleRNN(units)
hidden = rnn(inputs, initial_state=initial_state)
output = Dense(1)(hidden)

model = Model([inputs] + [initial_state], output)
model.compile(loss='categorical_crossentropy', 
              optimizer=tf.compat.v1.train.AdamOptimizer())

请注意,此方法要求您使用 Functional API。对于 Sequential 模型,您需要使用 stateful RNN,指定 num_samples = 2 inputs = np.random.random((num_samples, timesteps, embedding_dim)) # random initial state as additional input some_initial_state = np.random.random((num_samples, units)) targets = np.random.random((num_samples, units)) model.train_on_batch([inputs] + [some_initial_state], targets) ,并调用 batch_input_shape 方法:

reset_states

答案 1 :(得分:0)

对于Keras Layer,您可以在呼叫initial_state的同时直接传递Layer

rnn_output = tf.keras.layers.SimpleRNN( 3 )( prev_layer_output,  initial_state=states )