Tensorflow将LSTM的最终状态保存在dynamic_rnn中用于预测

2024-03-28

我想保存 LSTM 的最终状态,以便在恢复模型时将其包含在内并可用于预测。如下所述,当我使用时,保护程序仅了解最终状态tf.assign。但是,这会引发错误(也将在下面解释)。

在训练期间,我总是将最终的 LSTM 状态反馈回网络,如中所述这个帖子 https://stackoverflow.com/questions/39112622/how-do-i-set-tensorflow-rnn-state-when-state-is-tuple-true。以下是代码的重要部分:

构建图表时:

            self.init_state = tf.placeholder(tf.float32, [
                self.n_layers, 2, self.batch_size, self.n_hidden
            ])

            state_per_layer_list = tf.unstack(self.init_state, axis=0)

            rnn_tuple_state = tuple([
                tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0],
                                              state_per_layer_list[idx][1])

                for idx in range(self.n_layers)
            ])

            outputs, self.final_state = tf.nn.dynamic_rnn(
                cell, inputs=self.inputs, initial_state=rnn_tuple_state)

在训练期间:

        _current_state = np.zeros((self.n_layers, 2, self.batch_size,
                                   self.n_hidden))

            _train_step, _current_state, _loss, _acc, summary = self.sess.run(
                [
                    self.train_step, self.final_state,
                    self.merged
                ],
                feed_dict={self.inputs: _inputs,
                           self.labels:_labels, 
                           self.init_state: _current_state})

当我稍后从检查点恢复模型时,最终状态也不会恢复。如中所述这个帖子 https://stackoverflow.com/questions/39112622/how-do-i-set-tensorflow-rnn-state-when-state-is-tuple-true问题是 Saver 不知道新的状态。该帖子还提出了一个解决方案,基于tf.assign。遗憾的是,我无法使用建议的

            assign_op = tf.assign(self.init_state, _current_state)
            self.sess.run(assign_op)

因为 self.init state 不是一个变量而是一个占位符。我收到错误

AttributeError:“张量”对象没有属性“分配”

我已经尝试解决这个问题几个小时了,但我无法让它工作。

任何帮助表示赞赏!

EDIT:

我已将 self.init_state 更改为

            self.init_state = tf.get_variable('saved_state', shape=
            [self.n_layers, 2, self.batch_size, self.n_hidden])

            state_per_layer_list = tf.unstack(self.init_state, axis=0)

            rnn_tuple_state = tuple([
                tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0],
                                              state_per_layer_list[idx][1])

                for idx in range(self.n_layers)
            ])

            outputs, self.final_state = tf.nn.dynamic_rnn(
                cell, inputs=self.inputs, initial_state=rnn_tuple_state)

在训练期间,我不为 self.init_state 提供值:

            _train_step, _current_state, _loss, _acc, summary = self.sess.run(
                [
                    self.train_step, self.final_state,
                    self.merged
                ],
                feed_dict={self.inputs: _inputs,
                           self.labels:_labels})

但是,我仍然无法运行分配操作。知道我得到

类型错误:预期 float32 传递给操作“分配”的参数“值”,得到 (LSTMStateTuple(c=array([[ 0.07291573, -0.06366599, -0.23425588, ..., 0.05307654,


为了保存最终状态,您可以创建一个单独的 TF 变量,然后在保存图形之前运行assignop 将最新状态分配给该变量,然后保存图形。您唯一需要记住的是在声明变量之前声明该变量Saver;否则它不会包含在图表中。

这里对此进行了详细讨论,包括工作代码:TF LSTM:从训练会话中保存状态以供以后的预测会话使用 https://stackoverflow.com/questions/43663795/tf-lstm-save-state-from-training-session-for-prediction-session-later

*** 更新:后续问题的答案:

看起来你正在使用BasicLSTMCell, with state_is_tuple=True。我之前提到的讨论使用了GRUCell with state_is_tuple=False。两者之间的细节有些不同,但总体方法可能相似,所以希望这对您有用:

在训练期间,您首先将零作为initial_state into dynamic_rnn然后继续将其自己的输出作为输入重新反馈initial_state。所以,我们的最后输出状态dynamic_rnncall 是您要保存以供以后使用的内容。由于它的结果是sess.run()调用,本质上它是一个 numpy 数组(不是张量,也不是占位符)。所以问题就是“如何将 numpy 数组与图中的其余变量一起保存为 Tensorflow 变量”。这就是为什么您将最终状态分配给其唯一目的的变量。

所以,代码是这样的:

    # GRAPH DEFINITIONS:
    state_in = tf.placeholder(tf.float32, [LAYERS, 2, None, CELL_SIZE], name='state_in')
    l = tf.unstack(state_in, axis=0)
    state_tup = tuple(
        [tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1])
        for idx in range(NLAYERS)])
    #multicell = your BasicLSTMCell / MultiRNN definitions
    output, state_out = tf.nn.dynamic_rnn(multicell, X, dtype=tf.float32, initial_state=state_tup)

    savedState = tf.get_variable('savedState', shape=[LAYERS, 2, BATCHSIZE, CELL_SIZE])
    saver = tf.train.Saver(max_to_keep=1)

    in_state = np.zeros((LAYERS, 2, BATCHSIZE, CELL_SIZE))

    # TRAINING LOOP:
    feed_dict = {X: x, Y_: y_, batchsize: BATCHSIZE, state_in:in_state}
    _, out_state = sess.run([training_step, state_out], feed_dict=feed_dict)
    in_state = out_state

    # ONCE TRAINING IS OVER:
    assignOp = tf.assign(savedState, out_state)
    sess.run(assignOp)
    saver.save(sess, pathModel + '/my_model.ckpt')

    # RECOVERING IN A DIFFERENT PROGRAM:

    gInit = tf.global_variables_initializer().run()
    lInit = tf.local_variables_initializer().run()
    new_saver = tf.train.import_meta_graph(pathModel + 'my_model.ckpt.meta')
    new_saver.restore(sess, pathModel + 'my_model.ckpt')
    # retrieve State and get its LAST batch (latest obervarions)
    savedState = sess.run('savedState:0') # this is FULL state from training
    state = savedState[:,:,-1,:]  # -1 gets only the LAST batch of the state (latest seen observations)
    state = np.reshape(state, [state.shape[0], 2, -1, state.shape[2]]) #[LAYERS, 2, 1 (BATCH), SELL_SIZE]
    #x = .... (YOUR INPUTS)
    feed_dict = {'X:0': x, 'state_in:0':state}
    #PREDICTION LOOP:
    preds, state = sess.run(['preds:0', 'state_out:0'], feed_dict = feed_dict)
    # so now state will be re-fed into feed_dict with the next loop iteration

如前所述,这是一种对我来说很有效的修改方法GRUCell, where state_is_tuple = False。我调整了一下尝试一下BasicLSTMCell with state_is_tuple=True。它有效,但不如原始方法准确。我还不知道这是否只是因为对我来说 GRU 比 LSTM 更好还是出于其他原因。看看这是否适合你......

另请记住,正如您在恢复和预测代码中看到的那样,您的预测可能基于与训练循环不同的批量大小(我猜批量为 1?),因此您必须考虑如何处理您的恢复状态——只取最后一批?或者是其他东西?该代码仅采用保存状态的最后一层(即训练中的最新观察结果),因为这与我相关......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow将LSTM的最终状态保存在dynamic_rnn中用于预测 的相关文章

随机推荐

  • Grails 2.0 中带有新 where 查询的参数

    在 Grails 2 0 中定义 where 查询时是否可以使用参数 例如 def query Book where id it Book sub query find 5 我尝试运行该代码 但它在调用 find 时抛出 MissingMe
  • 创建一个包含比原始元素更多元素的 ReactiveUI 派生集合

    是否可以创建一个 ReactiveUI 派生集合 其中包含比原始集合更多的元素 我已经看到有一种方法可以过滤集合并选择单个属性 但我正在寻找相当于可枚举的 SelectMany 操作 为了说明这一点 想象一下尝试获取代表每个陷入交通拥堵的乘
  • 避免 printf() 中的尾随零

    我一直在发现 printf 系列函数的格式说明符 我想要的是能够打印小数点后最大给定位数的双精度 或浮点数 如果我使用 printf 1 3f 359 01335 printf 1 3f 359 00999 I get 359 013 35
  • C# 中图片框的图像之间的转换[重复]

    这个问题在这里已经有答案了 可能的重复 Windows 窗体图片框中的图像转换 https stackoverflow com questions 3270919 transition of images in windows forms
  • 当数据回发时,MVC 如何填充模型

    MVC对于如何将数据发送到浏览器非常清楚 您访问一个 URL 它运行代码来创建模型 将该类型化模型传递到视图中 然后视图根据模型的状态呈现 HTML 然而 我发现不太清楚的是 当用户在页面上提交表单时 MVC 如何将该表单映射回模型以在控制
  • 连接字符串中包含特殊字符的密码

    我需要从 ASP NET 应用程序连接到我的 Dynamics CRM 365 本地实例 我的问题是连接帐户的密码如下 T jL4O vc t 30
  • Service Fabric 重启应用程序

    我有一个在启动时从 KeyVault 读取的服务结构应用程序 当我们更改 KeyVault 值时 我们必须重新启动节点才能读取新值 这会导致同一节点上的其他应用程序出现故障 我正在尝试编写一个 PowerShell 脚本来重新启动服务结构应
  • iOS 8 上应用内购买失败,提示用户详细信息不正确

    我们有一个带有应用内购买功能的应用程序 该应用程序在 iOS 7 上运行良好 但在 iOS 8 上 当用户尝试在应用程序中购买任何内容时 应用程序内购买会失败 并显示错误 您输入的 Apple ID 无法 找不到或您的密码不正确 请重试 即
  • __libc_start_main@plt 如何工作?

    为了研究目标文件在linux中是如何加载和运行的 我制作了最简单的c代码 文件名为simple c int main 接下来 我创建目标文件并将目标文件另存为文本文件 gcc simple c objdump xD a out gt sim
  • 使用 Perl6 语法解析二进制结构

    使用 Perl6 解析二进制结构的最佳选择是什么 在 Perl5 中 我们在 Perl6 上有 pack unpack 方法 它们似乎是实验性的 是否可以使用 Perl6 语法来解析二进制数据假设我有一个文件 其中包含以下二进制格式的记录
  • Qt 加载指示器通过动画图像(又名预加载器)还是替代方案?

    我想在加载时在我的表格视图上显示动画加载程序图像 下面的截图显示了一个印象 我为此使用了一个动画 gif 由setStyleSheet作为居中的背景图像 我面临两个问题 gif 已显示 但不是动画 是否可以显示动画 gif 作为背景图像 通
  • Celery 错误“没有这样的传输:amqp”

    Celery 工作正常 有一天命令行工作程序无法启动 并显示以下跟踪 Traceback most recent call last File home buildslave venv bin celery line 9 in
  • 如何使用 Cloudinary 将经过转换的 url 输出为字符串?

    我将在开头说这可能是错误的做法 我想做的是使用 url w transformation 到 JSdata 属性 目前 我正在使用以下内容来生成图像标签 cl image tag image asset filename to s tran
  • 将 FeedParser 对象序列化为 Atom

    我使用 feedparserhttp www feedparser org http www feedparser org 解析 Atom feed 并对生成的 Python 对象进行一些操作 之后 我想将对象序列化回 Atom 但 fee
  • React Native - 通过邮件发送照片

    我正在尝试通过邮件发送最近在应用程序中捕获的照片 但遇到以下错误 对于邮件功能 我正在使用此模块 var Mailer require NativeModules RNMail 我试图借助此模块通过邮件发送照片 但出现以下错误 index
  • 如何使用界面生成器更改 ipad 的文本字段高度?

    我们正在使用 Interface Builder 开发 iPad 应用程序 但我们不知道如何增加文本字段的高度 当我们使用 IB 为 osx 开发应用程序时 您可以转到文本字段属性 并在控制部分下将换行符设置为自动换行而不是剪辑 但是 当我
  • MultiColumnText 在 iTextSharp v5.3.3 中工作吗?

    我找不到MultiColumnTextiTextSharp v5 3 3 来自 NuGet 中的任何位置 我能找到的就是ColumnText这当然使用起来不太友好 而且超出了我真正需要的范围 我错过了什么吗 有几个链接说MultiColum
  • 使用 pymc 与 MCMC 拟合两个正态分布(直方图)?

    我正在尝试拟合 CCD 上摄谱仪检测到的线轮廓 为了便于考虑 我提供了一个演示 如果解决了 它与我的演示非常相似actually想要解决 我看过这个 https stats stackexchange com questions 46626
  • TStringList 的 addObject 方法

    我想知道这个方法调用的作用 stringList addObject String Object 我也想知道这个属性是做什么的 stringList Objects i 添加时看起来像键 值对 但是在循环检索时检索到了什么 我还看到 ite
  • Tensorflow将LSTM的最终状态保存在dynamic_rnn中用于预测

    我想保存 LSTM 的最终状态 以便在恢复模型时将其包含在内并可用于预测 如下所述 当我使用时 保护程序仅了解最终状态tf assign 但是 这会引发错误 也将在下面解释 在训练期间 我总是将最终的 LSTM 状态反馈回网络 如中所述这个