【问题标题】:How to modify the initial value in BasicLSTMcell in tensorflow如何在tensorflow中修改BasicLSTMcell中的初始值
【发布时间】:2018-01-24 08:21:12
【问题描述】:

我想用我预先训练的值在 Tensorflow 中的 BasicLSTMcell 中初始化权重和偏差值(我通过 .npy 得到它们)。但是当我使用get_tensor_by_name 来获取张量时,它似乎只是为我返回了一个副本,并且原始值永远不会改变。我需要你的帮助!

【问题讨论】:

    标签: python tensorflow lstm recurrent-neural-network


    【解决方案1】:

    在第一次迭代中添加一些tf.assign 操作以将您想要的值分配给内部变量。

    确保这只发生在第一次迭代中,否则你会覆盖你所做的任何训练。

    该单元格有一个名为 get_trainable_variables 的方法,可以根据需要为您提供帮助。

    【讨论】:

      【解决方案2】:

      我猜BasicRNNCell太基础了。从BasicRNNCell 接受kernel_initializerbias_initializer 创建自己的单元格会更容易。

      import tensorflow as tf
      from tensorflow.python.ops.rnn_cell_impl import _Linear
      
      class MyNNCell(tf.nn.rnn_cell.BasicRNNCell):
        def __init__(self, num_units, activation=None, reuse=None,
                     kernel_initializer=None,
                     bias_initializer=None):
          super(MyNNCell, self).__init__(num_units, activation, reuse)
          self._kernel_initializer = kernel_initializer
          self._bias_initializer = bias_initializer
      
        def call(self, inputs, state):
          if self._linear is None:
            self._linear = _Linear([inputs, state], self._num_units, True,
                                   bias_initializer=self._bias_initializer,
                                   kernel_initializer=self._kernel_initializer)
          return super(MyNNCell, self).call(inputs, state)
      

      这可能也有帮助:tf.nn.static_rnntf.nn.dynamic_rnn 都有 initial_state 参数。它不是设置单元的内核和偏差,而是在第一次调用时它将接收到的状态。因为BasicLSTMcell中的kernel和bias都是用0初始化的,所以是等价的预置cell state的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 2019-09-29
        相关资源
        最近更新 更多