【问题标题】:variable scope issue in TensorflowTensorflow 中的变量范围问题
【发布时间】:2017-01-10 20:03:11
【问题描述】:
def biLSTM(data, n_steps):


    n_hidden= 24
    data = tf.transpose(data, [1, 0, 2])
    # Reshape to (n_steps*batch_size, n_input)
    data = tf.reshape(data, [-1, 300])
    # Split to get a list of 'n_steps' tensors of shape (batch_size, n_input)
    data = tf.split(0, n_steps, data)    

    lstm_fw_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)
    # Backward direction cell
    lstm_bw_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)

    outputs, _, _ = tf.nn.bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, data, dtype=tf.float32)


    return outputs, n_hidden

在我的代码中,我调用此函数两次以创建 2 个双向 LSTM。然后我遇到了重用变量的问题。

ValueError: 变量 lstm/BiRNN_FW/BasicLSTMCell/Linear/Matrix 已经存在,不允许。你的意思是设置reuse=True 变量范围?

为了解决这个问题,我在 with tf.variable_scope('lstm', reuse=True) as scope: 的函数中添加了 LSTM 定义

这导致了一个新问题

ValueError: 变量 lstm/BiRNN_FW/BasicLSTMCell/Linear/Matrix 确实 不存在,不允许。您的意思是在 VarScope 中设置 reuse=None 吗?

请帮助解决这个问题。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    当您创建 BasicLSTMCell() 时,它会创建所有必需的权重和偏差以在后台实现 LSTM 单元。所有这些变量都会自动分配名称。如果您在同一范围内多次调用该函数,则会收到错误消息。由于您的问题似乎表明您要创建两个单独的 LSTM 单元,因此您不想重用变量,但您确实想在单独的范围内创建它们。您可以通过两种不同的方式执行此操作(我实际上并没有尝试运行此代码,但它应该可以工作)。你可以在一个独特的范围内调用你的函数

    def biLSTM(数据,n_steps): ……废话…… 使用 tf.variable_scope('LSTM1'): 输出,隐藏 = biLSTM(数据,步骤) 使用 tf.variable_scope('LSTM2'): 输出,隐藏 = biLSTM(数据,步骤)

    或者您可以将唯一的范围名称传递给函数并在内部使用范围

    def biLSTM(数据,n_steps,layer_name): ……废话…… 以 tf.variable_scope(layer_name) 作为范围: lstm_fw_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0) lstm_bw_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0) 输出,_,_ = tf.nn.bidirectional_rnn(lstm_fw_cell,lstm_bw_cell,数据,dtype=tf.float32) 返回输出,n_hidden l1 = biLSTM(数据,步骤,'layer1') l2 = biLSTM(数据,步骤,'layer2')

    选择哪种方法取决于您的编码敏感性,它们在功能上几乎相同。

    【讨论】:

    【解决方案2】:

    我也有类似的问题。但是我使用的是带有预训练 Resnet50 模型的 keras 实现。

    当我使用以下命令更新 tensorflow 版本时,它对我有用:

    conda update -f -c conda-forge tensorflow
    

    使用过

    from keras import backend as K
    K.clear_session
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-18
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2011-11-21
      相关资源
      最近更新 更多