当前位置: 首页 > 面试题库 >

TensorFlow:记住下一批的LSTM状态(有状态LSTM)

许波涛
2023-03-14
问题内容

给定训练有素的LSTM模型,我想对单个时间步执行推断,即seq_length = 1在下面的示例中。在每个时间步之后,需要记住下一个“批”的内部LSTM状态(内存和隐藏状态)。对于推论的最开始,在init_c, init_h给定输入的情况下计算内部LSTM状态。然后将它们存储在LSTMStateTuple传递给LSTM的对象中。在训练期间,此状态会在每个时间步更新。但是,为了进行推断,我希望state在批处理之间保存初始状态,即,仅需在最开始时计算初始状态,然后在每次“批处理”(n
= 1)之后保存LSTM状态。

我发现了这个与StackOverflow相关的问题:Tensorflow,在RNN中保存状态的最佳方法?。但是,仅当时才有效state_is_tuple=False,但TensorFlow很快将弃用此行为(请参见rnn_cell.py)。Keras似乎有一个很好的包装器,可以使
有状态 LSTM成为可能,但是我不知道在TensorFlow中实现这一目标的最佳方法。TensorFlow
GitHub上的这个问题也与我的问题有关:https
:
//github.com/tensorflow/tensorflow/issues/2838

有人建议建立有状态的LSTM模型吗?

inputs  = tf.placeholder(tf.float32, shape=[None, seq_length, 84, 84], name="inputs")
targets = tf.placeholder(tf.float32, shape=[None, seq_length], name="targets")

num_lstm_layers = 2

with tf.variable_scope("LSTM") as scope:

    lstm_cell  = tf.nn.rnn_cell.LSTMCell(512, initializer=initializer, state_is_tuple=True)
    self.lstm  = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_lstm_layers, state_is_tuple=True)

    init_c = # compute initial LSTM memory state using contents in placeholder 'inputs'
    init_h = # compute initial LSTM hidden state using contents in placeholder 'inputs'
    self.state = [tf.nn.rnn_cell.LSTMStateTuple(init_c, init_h)] * num_lstm_layers

    outputs = []

    for step in range(seq_length):

        if step != 0:
            scope.reuse_variables()

        # CNN features, as input for LSTM
        x_t = # ...

        # LSTM step through time
        output, self.state = self.lstm(x_t, self.state)
        outputs.append(output)

问题答案:

我发现在占位符中保存所有图层的整个状态是最容易的。

init_state = np.zeros((num_layers, 2, batch_size, state_size))

...

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size])

然后解压缩它并创建一个LSTMStateTuples元组,然后再使用本机tensorflow RNN Api。

l = tf.unpack(state_placeholder, axis=0)
rnn_tuple_state = tuple(
[tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1])
 for idx in range(num_layers)]
)

RNN传递API:

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True)
outputs, state = tf.nn.dynamic_rnn(cell, x_input_batch, initial_state=rnn_tuple_state)

state-那么变量将被feeded下一批作为占位符。



 类似资料:
  • 我正在尝试在数据库表中上传Excel表。我正在将excel行转换为Hibernate实体并尝试将其保存在数据库中。为了实现这一点,我面临着问题。很少有db约束,如唯一或复合键等,但用户可以上传任何表。所以如果一个网格行无法插入,那么我的要求是其他行应该继续。和事务应该被保存。 '在这里,如果单行失败,那么所有行都失败。我得到org.hibernate.AssertionFailure:null i

  • 根据我到目前为止的理解,在为序列分类任务训练RNN/LSTM模型后,我可以通过以下两种方式进行预测, 获取最后一个状态并使用softmax层进行预测 总的来说,有什么理由选择一个而不是另一个?或者这取决于应用程序?此外,如果我决定使用第二种策略,我应该为每个时间步使用不同的softmax层,还是为所有时间步使用一个softmax层?

  • 帮助用户快速部署有状态的应用。 有状态应用即Statefulset。Statefulset的详细介绍内容,请参考kubernets官方文档-Statefulsets。 Pod是Kubernetes的最小编排单位,有状态statefulset主要用于部署实例之间有不对等关系,以及实例对外部数据有依赖关系的有状态应用。基于statefulset部署的应用有以下特点: 基于statefulset部署的p

  • 问题内容: 我有一个由 N = 4000个样本 组成的数据集X ,每个样本都包含 d = 2个特征 (连续值),这些特征跨越 t = 10个时间步长 。在时间步骤11,我还具有每个样本的相应“标签”,它们也是连续值。 目前,我的数据集的形状为X:[4000,20],Y:[4000]。 给定d个功能的10个先前输入,我想使用TensorFlow训练LSTM来预测Y值(回归),但是我在TensorFl

  • 在接口流中: 中间操作可分为有状态和无状态。它们影响并行流的结果。 只有两个终端操作是非确定性方法:findAny()和forEach(Consumer)。它们影响并行流的结果。 如果中间无状态操作执行惰性操作,它们可能会产生副作用。这会影响并行Stream的结果。 中间操作可分为以下几类: 有状态 不同的() 排序() 极限(长l) 跳过(长l) 无国籍 地图(功能f) 以下是我的两个问题: >

  • 在TensorFlow FAQ中,它说: 在TensorFlow中,张量既有静态(推断)形状,也有动态(真实)形状。可以使用tf.Sensor读取静态形状。get_shape()方法:此形状是从用于创建张量的操作中推断出来的,可能部分完成。如果静态形状没有完全定义,可以通过计算tf.shape(t)来确定张量t的动态形状。 但我仍然不能完全理解静态形状和动态形状之间的关系。有没有例子表明他们的差异