2017-01-10 6 views
1
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 

В моем коде я дважды вызываю эту функцию для создания двух двунаправленных LSTM. Тогда у меня возникла проблема повторного использования переменных.переменная область выпуска в Tensorflow

ValueError: Variable lstm/BiRNN_FW/BasicLSTMCell/Linear/Matrix already exists, disallowed. Did you mean to set reuse=True in VarScope?

Чтобы решить эту проблему, я добавил определение LSTM в функции в with tf.variable_scope('lstm', reuse=True) as scope:

Это привело к новому выпуску

ValueError: Variable lstm/BiRNN_FW/BasicLSTMCell/Linear/Matrix does not exist, disallowed. Did you mean to set reuse=None in VarScope?

Пожалуйста, помогите с решением этого.

ответ

6

При создании BasicLSTMCell() он создает все необходимые веса и смещения для реализации ячейки LSTM под капотом. Все эти переменные назначаются именам автоматически. Если вы вызываете функцию более одного раза в пределах одной области, вы получаете полученную вами ошибку. Поскольку ваш вопрос, похоже, указывает, что вы хотите создать две отдельные ячейки LSTM, вы не хотите повторно использовать переменные, но вы хотите создать их в отдельных областях. Вы можете сделать это двумя разными способами (я на самом деле не пытался запустить этот код, но он должен работать). Вы можете позвонить функцию из уникальной сферы

 
def biLSTM(data, n_steps): 
    ... blah ... 

with tf.variable_scope('LSTM1'): 
    outputs, hidden = biLSTM(data, steps) 

with tf.variable_scope('LSTM2'): 
    outputs, hidden = biLSTM(data, steps) 

или вы можете передать уникальное имя области функции и использовать объем внутри

 
def biLSTM(data, n_steps, layer_name): 
    ... blah... 
    with tf.variable_scope(layer_name) as scope: 
     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) 
     outputs, _, _ = tf.nn.bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, data, dtype=tf.float32) 
    return outputs, n_hidden 

l1 = biLSTM(data, steps, 'layer1') 
l2 = biLSTM(data, steps, 'layer2') 

Это до вашего кодирования чувствительности, какой подход к выберите, они функционально почти одинаковы.

+0

Спасибо @ mad-wombat. Это сработало. Я попробовал второй вариант. –

+0

@Mad Wombat У меня есть аналогичная проблема в https://stackoverflow.com/questions/47657157/variables-of-tensorflow-generate-error-in-a-loop/47718155?noredirect=1#comment82519963_47718155, можете ли вы любезно получить смотреть и отвечать. – khan