【问题标题】:Tensorflow Keras LSTM Inference one input at a timeTensorflow Keras LSTM 推断一次输入一个
【发布时间】:2020-06-30 15:31:58
【问题描述】:

我有以下序列标记 Keras 模型:

model = tf.keras.Sequential([
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.LSTM(64, return_sequences=True),
  tf.keras.layers.Dense(2)
])

该模型采用一系列向量并预测两个类的 logits。

在实时应用程序中,我每秒获取一个这些向量,并且我想仅对收到的新向量执行推理,以便使用 LSTM 的先前隐藏状态。


例如,如果我只是接收向量并运行:

# Received a
model(a)
# Received b
model(b)

该模型独立运行两个向量(ab),并且不利用 LSTM 在步骤 a 之后存储在隐藏状态的时间信息。

有没有办法执行推理并使用这些状态?


不使用时间信息的示例预测代码

model = tf.keras.models.load_model('./.save/3jbry45d')
model.build(input_shape=(None, None, 25))

random_vec = tf.convert_to_tensor(np.random.randn(1, 1, 25))

for i in range(5):
    print(model.predict(random_vec))

打印 5 次:

[[[ 0.11500816 -0.5686636 ]]]

【问题讨论】:

  • 使用model.predict就可以了。
  • @BjörnLindqvist 我如何确认它实际上使用了以前的隐藏状态而不是全新的隐藏状态?有什么来源吗?
  • 简单。两次输入相同的输入向量并观察输出。
  • @BjörnLindqvist 这总是返回相同的输出。我添加了示例代码,以便您可以看到我在做什么

标签: python tensorflow keras lstm


【解决方案1】:

然后试试这个:

model = tf.keras.Sequential([
  tf.keras.layers.LSTM(64,
                       batch_input_shape = (1, None, 64),
                       return_sequences=True,
                       stateful = True),
  tf.keras.layers.Dense(2)
])
for _ in range(10):
    print(model.predict(np.ones(64)[np.newaxis, np.newaxis])[0, 0])

打印的向量会有所不同,所以会占用内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多