Tensorflow: Получена ошибка при инициализации двунаправленного rnn с ячейкой LSTM

Созданный на 18 янв. 2016  ·  3Комментарии  ·  Источник: tensorflow/tensorflow

Я хочу построить модель bi-rnn с тензорным потоком с ячейкой LSTM, когда я пытаюсь инициализировать двунаправленный_rnn,
это дает: ValueError: Over-sharing: Variable BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix already exists, disallowed. Did you mean to set reuse=True in VarScope?

import tensorflow as tf
from tensorflow.models.rnn import rnn, rnn_cell
from tensorflow.python.ops.constant_op import constant
import numpy as np

class Model(object):
    def __init__(self, batch_size, len_word, num_chars, dim_embed, dim_hidden):
        self.batch_size = batch_size
        self.dim_embed = dim_embed
        self.dim_hidden = dim_hidden
        self.num_chars = num_chars
        self.len_word = len_word

        with tf.device("/cpu:0"):
            self.embedding = tf.Variable(tf.random_uniform([num_chars, dim_embed], -0.1, 0.1), name='embedding')

        self.W_emb = tf.Variable(tf.random_uniform([dim_hidden*2, dim_embed], -0.1, 0.1), name='W_emb')
        self.b_emb = tf.Variable(tf.zeros([dim_embed]), name='b_emb')
        self.lstm_fw_cell = rnn_cell.BasicLSTMCell(dim_hidden)
        self.lstm_bw_cell = rnn_cell.BasicLSTMCell(dim_hidden)

    def build_model(self):
        inputs = tf.placeholder(tf.int32, [self.batch_size, self.len_word])
        input_length = tf.placeholder(tf.int64, [self.batch_size])
        lstm_state_fw = self.lstm_fw_cell.zero_state(self.batch_size, tf.float32)
        lstm_state_bw = self.lstm_bw_cell.zero_state(self.batch_size, tf.float32)

        with tf.device("/cpu:0"):
            embedded_input = tf.nn.embedding_lookup(self.embedding, tf.transpose(inputs))

        brnn_output = rnn.bidirectional_rnn(
            self.lstm_fw_cell, self.lstm_bw_cell,
            tf.unpack(embedded_input),
            sequence_length=input_length,
            initial_state_fw=lstm_state_fw,
            initial_state_bw=lstm_state_bw,
        )

        pooled_output = tf.reduce_sum( tf.pack(brnn_output), 0 )
        pooled_output = pooled_output / tf.expand_dims( tf.to_float(input_length) + 1e-6, 1)
        final_emb = tf.nn.xw_plus_b(pooled_output, self.W_emb, self.b_emb)
        final_emb = tf.nn.l2_normalize(final_emb, dim=1, epsilon=1e-7)

        return final_emb

Самый полезный комментарий

Вам необходимо указать разные области действия переменных для ячеек LSTM.

with tf.variable_scope('forward'):
    self.lstm_fw_cell = rnn_cell.BasicLSTMCell(dim_hidden)   
with tf.variable_scope('backward'):
    self.lstm_bw_cell = rnn_cell.BasicLSTMCell(dim_hidden)

В противном случае произойдет конфликт имен (обе ячейки попытаются использовать имя «BiRNN_FW / RNN / BasicLSTMCell / Linear / Matrix»), и tf будет интерпретировать это так, как будто ваше намерение состоит в том, чтобы поделиться параметрами в двух ячейках, что не является ты хочешь. TF выдаст исключение, потому что вы явно не указали ему повторно использовать переменные во второй области: with variable_scope(name, reuse=True) .

Установка областей действия переменных, как указано выше, создаст уникальные имена для переменных:
BiRNN_FW / RNN / BasicLSTMCell / вперед / Линейный / Матричный
BiRNN_FW / RNN / BasicLSTMCell / backward / Linear / Matrix

Прочтите руководство по совместному использованию переменных для получения дополнительной информации.

Все 3 Комментарий

Вам необходимо указать разные области действия переменных для ячеек LSTM.

with tf.variable_scope('forward'):
    self.lstm_fw_cell = rnn_cell.BasicLSTMCell(dim_hidden)   
with tf.variable_scope('backward'):
    self.lstm_bw_cell = rnn_cell.BasicLSTMCell(dim_hidden)

В противном случае произойдет конфликт имен (обе ячейки попытаются использовать имя «BiRNN_FW / RNN / BasicLSTMCell / Linear / Matrix»), и tf будет интерпретировать это так, как будто ваше намерение состоит в том, чтобы поделиться параметрами в двух ячейках, что не является ты хочешь. TF выдаст исключение, потому что вы явно не указали ему повторно использовать переменные во второй области: with variable_scope(name, reuse=True) .

Установка областей действия переменных, как указано выше, создаст уникальные имена для переменных:
BiRNN_FW / RNN / BasicLSTMCell / вперед / Линейный / Матричный
BiRNN_FW / RNN / BasicLSTMCell / backward / Linear / Matrix

Прочтите руководство по совместному использованию переменных для получения дополнительной информации.

Обратите внимание, что этого больше не будет, потому что переменные создаются внутри ...Cell.__call__ а не в ...Cell.__init__ , поэтому ему не нужна область действия для построения ячеек, и она будет обрабатывать область видимости переменной. сам находится внутри bidirectional_rnn поэтому вам не нужно его определять самостоятельно.

У меня все еще та же проблема. Есть предложения? Я пробовал подход, предложенный саломонами, результаты те же. В результате Doenst вернет любой кортеж.
((encoder_fw_outputs,
encoder_bw_outputs),
(encoder_fw_final_state,
encoder_bw_final_state)) = (
tf.nn.bidirectional_dynamic_rnn (cell_fw = encoder_cell,
cell_bw = encoder_cell,
входы = encoder_inputs_embedded,
sequence_length = encoder_inputs_length,
dtype = tf.float64, time_major = True)
)

ValueError Traceback (последний вызов последним)
в()
20 входов = encoder_inputs_embedded,
21 длина_последовательности = длина_кодера_входов,
---> 22 dtype = tf.float32, time_major = True)
23)
24

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc в twoirectional_dynamic_rnn (cell_fw, cell_bw, inputs, sequence_length, initial_state_fw, initial_state_bmerations, d , time_major, scope)
348 начальное_состояние = начальное_состояние_fw, dtype = dtype,
349 parallel_iterations = parallel_iterations, swap_memory = swap_memory,
-> 350 time_major = time_major, scope = fw_scope)
351
352 # Обратное направление

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc в dynamic_rnn (ячейка, входы, длина_последовательности, начальное_состояние, dtype, parallel_iterations, swap_memory, time_major, scope )
544 swap_memory = swap_memory,
545 длина_последовательности = длина_последовательности,
-> 546 dtype = dtype)
547
548 # Выходы _dynamic_rnn_loop всегда имеют форму [время, пакет, глубина].

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc в _dynamic_rnn_loop (ячейка, входы, initial_state, parallel_iterations, swap_memory, sequence_length, dtype)
711 loop_vars = (время, output_ta, состояние),
712 parallel_iterations = параллельные_ итерации,
-> 713 swap_memory = swap_memory)
714
715 # Распаковать окончательный вывод, если не используются выходные кортежи.

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc в while_loop (cond, body, loop_vars, shape_invariants, parallel_iterations, back_prop, swap_memory, name)
2603 context = WhileContext (parallel_iterations, back_prop, swap_memory, имя)
2604 ops.add_to_collection (ops.GraphKeys.WHILE_CONTEXT, контекст)
-> 2605 результат = context.BuildLoop (cond, body, loop_vars, shape_invariants)
2606 вернуть результат
2607

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc в BuildLoop (self, pred, body, loop_vars, shape_invariants)
2436 self.Enter ()
2437 original_body_result, exit_vars = self._BuildLoop (
-> 2438 pred, body, original_loop_vars, loop_vars, shape_invariants)
2439 наконец:
2440 self.Exit ()

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc в _BuildLoop (self, pred, body, original_loop_vars, loop_vars, shape_invariants)
2386 структура = original_loop_vars,
2387 flat_sequence = vars_for_body_with_tensor_arrays)
-> 2388 body_result = body (* упаковано_vars_for_body)
2389, если не nest.is_sequence (body_result):
2390 body_result = [body_result]

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc в _time_step (время, output_ta_t, состояние)
694 call_cell = call_cell,
695 state_size = state_size,
-> 696 skip_conditionals = True)
697 еще:
698 (вывод, новое_состояние) = call_cell ()

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc в _rnn_step (время, длина_последовательности, min_sequence_length, max_sequence_length, zero_output, state, call_cell, state_sditionals )
175 # шагов. Это быстрее, когда max_seq_len равно количеству разверток.
176 # (что типично для dynamic_rnn).
-> 177 new_output, new_state = call_cell ()
178 nest.assert_same_structure (состояние, новое_состояние)
179 new_state = гнездо.flatten (новое_состояние)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc в()
682
683 input_t = nest.pack_sequence_as (структура = входы, flat_sequence = input_t)
-> 684 call_cell = лямбда: ячейка (input_t, состояние)
685
686, если длина_последовательности не равна Нет:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc в __call __ (себя, входы, состояние, область действия)
336 # i = ворота_входа, j = новый_ввод, f = ворота_забытия, o = ворота_ввода
337 lstm_matrix = _linear ([входы, m_prev], 4 * self._num_units, bias = True,
-> 338 объем = объем)
339 i, j, f, o = array_ops.split (
340 значение = lstm_matrix, num_or_size_splits = 4, axis = 1)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc в _linear (args, output_size, bias, bias_start, scope)
745 с vs.variable_scope (scope) как outer_scope:
746 весов = vs. get_variable (
-> 747 "весов", [total_arg_size, output_size], dtype = dtype)
748, если len (args) == 1:
749 res = math_ops.matmul (аргументы [0], веса)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc в get_variable (имя, форма, dtype, инициализатор, регуляризатор, обучаемый, коллекции, caching_device, partitioner , validate_shape, custom_getter)
986 коллекций = коллекции, caching_device = caching_device,
987 partitioner = разделитель, validate_shape = validate_shape,
-> 988 custom_getter = custom_getter)
989 get_variable_or_local_docstring = (
990 "" "% s

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc в get_variable (self, var_store, name, shape, dtype, initializer, regularizer, trainable, collections , caching_device, partitioner, validate_shape, custom_getter)
888 коллекций = коллекций, caching_device = caching_device,
889 partitioner = разделитель, validate_shape = validate_shape,
-> 890 custom_getter = custom_getter)
891
892 def _get_partitioned_variable (self,

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc в get_variable (self, name, shape, dtype, initializer, regularizer, reuse, trainable, collections , caching_device, partitioner, validate_shape, custom_getter)
346 повторное использование = повторное использование, обучаемый = обучаемый, коллекции = коллекции,
347 caching_device = caching_device, partitioner = разделитель,
-> 348 validate_shape = validate_shape)
349
350 def _get_partitioned_variable (

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc в _true_getter (имя, форма, dtype, инициализатор, регуляризатор, повторное использование, обучаемое, коллекции, caching_device , разделитель, validate_shape)
331 инициализатор = инициализатор, регуляризатор = регуляризатор, повторное использование = повторное использование,
332 обучаемых = обучаемых, коллекций = коллекций,
-> 333 caching_device = caching_device, validate_shape = validate_shape)
334
335, если custom_getter не равен None:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc в _get_single_variable (self, name, shape, dtype, initializer, regularizer, partition_info, reuse, обучаемый , коллекции, caching_device, validate_shape)
637 "Вы хотели установить reuse = True в VarScope?"
638 "Первоначально определено в: \ n \ n% s"% (
-> 639 имя, "" .join (traceback.format_list (tb))))
640 found_var = self._vars [имя]
641, если не shape.is_compatible_with (found_var.get_shape ()):

ValueError: переменная twoirectional_rnn / fw / lstm_cell / weights уже существует, запрещена. Вы хотели установить reuse = True в VarScope? Первоначально определено в:

Файл "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", строка 747, в _linear
"веса", [total_arg_size, output_size], dtype = dtype)
Файл "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", строка 338, в __call__
scope = scope)
Файл "", строка 24, в
time_major = Верно

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

RahulKulhari picture RahulKulhari  ·  3Комментарии

as1ndu picture as1ndu  ·  3Комментарии

untom picture untom  ·  3Комментарии

MrSaad picture MrSaad  ·  3Комментарии

Billy4195 picture Billy4195  ·  3Комментарии