Tensorflow: Fehler beim Initialisieren von bidirektionalem rnn mit LSTM-Zelle

Erstellt am 18. Jan. 2016  ·  3Kommentare  ·  Quelle: tensorflow/tensorflow

Ich möchte ein bi-rnn-Modell mit tensorflow mit LSTM-Zelle erstellen, wenn ich versuche, bidirektional_rnn zu initialisieren,
es gibt: 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

Hilfreichster Kommentar

Sie müssen unterschiedliche Variablenbereiche für die LSTM-Zellen angeben.

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)

Andernfalls kommt es zu einer Namenskollision (beide Zellen versuchen, den Namen "BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix" zu verwenden) und tf interpretiert dies so, als ob Sie die Parameter in den beiden Zellen teilen möchten, was nicht der Fall ist Sie wollen. TF löst eine Ausnahme aus, weil Sie nicht explizit angewiesen haben, Variablen im zweiten Bereich wiederzuverwenden: with variable_scope(name, reuse=True) .

Durch das Festlegen der Variablenbereiche wie oben werden eindeutige Namen für die Variablen erstellt:
BiRNN_FW/RNN/BasicLSTMCell/ forward /Linear/Matrix
BiRNN_FW/RNN/BasicLSTMCell/ rückwärts /Linear/Matrix

Weitere Informationen finden Sie im Leitfaden zum Teilen von Variablen .

Alle 3 Kommentare

Sie müssen unterschiedliche Variablenbereiche für die LSTM-Zellen angeben.

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)

Andernfalls kommt es zu einer Namenskollision (beide Zellen versuchen, den Namen "BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix" zu verwenden) und tf interpretiert dies so, als ob Sie die Parameter in den beiden Zellen teilen möchten, was nicht der Fall ist Sie wollen. TF löst eine Ausnahme aus, weil Sie nicht explizit angewiesen haben, Variablen im zweiten Bereich wiederzuverwenden: with variable_scope(name, reuse=True) .

Durch das Festlegen der Variablenbereiche wie oben werden eindeutige Namen für die Variablen erstellt:
BiRNN_FW/RNN/BasicLSTMCell/ forward /Linear/Matrix
BiRNN_FW/RNN/BasicLSTMCell/ rückwärts /Linear/Matrix

Weitere Informationen finden Sie im Leitfaden zum Teilen von Variablen .

Beachten Sie, dass dies nicht mehr passieren wird, da die Variablen in ...Cell.__call__ und nicht in ...Cell.__init__ sich innerhalb von bidirectional_rnn sodass Sie es nicht selbst festlegen müssen.

Ich habe immer noch das gleiche Problem. Irgendwelche Vorschläge? Ich habe den von Salomons vorgeschlagenen Ansatz ausprobiert, gleiche Ergebnisse. Geben Sie als Ergebnis kein Tupel zurück.
((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,
input=encoder_inputs_embedded,
Sequenz_Länge=Encoder_Inputs_Länge,
dtype=tf.float64, time_major=True)
)

ValueError Traceback (letzter Aufruf zuletzt)
in()
20 Eingänge=encoder_inputs_embedded,
21 sequence_length=encoder_inputs_length,
---> 22 dtype=tf.float32, time_major=True)
23 )
24

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in bidirektional_dynamic_rnn(cell_fw, cell_bw, input, sequence_length, initial_state_fw, initial_state_bw, dtype, parallel_iterations ., swap , time_major, Umfang)
348 initial_state=initial_state_fw, dtype=dtype,
349 parallel_iterations=parallel_iterations, swap_memory=swap_memory,
--> 350 time_major=time_major, scope=fw_scope)
351
352 # Rückwärtsrichtung

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in dynamic_rnn(cell, input, sequence_length, initial_state, dtype, parallel_iterations, swap_memory, time_major, scope )
544 swap_memory=Swap_memory,
545 Sequenz_Länge=Sequenz_Länge,
--> 546 dtype=dtype)
547
548 # Ausgaben von _dynamic_rnn_loop sind immer geformt [Zeit, Stapel, Tiefe].

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in _dynamic_rnn_loop(cell, input, initial_state, parallel_iterations, swap_memory, sequence_length, dtype)
711 loop_vars=(Zeit, Ausgabe_ta, Zustand),
712 parallel_iterations=parallele_iterationen,
--> 713 swap_memory=Swap_memory)
714
715 # Endausgabe entpacken, wenn keine Ausgabetupel verwendet werden.

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in while_loop(cond, body, loop_vars, shape_invariants, parallel_iterations, back_prop, swap_memory, name)
2603 context = WhileContext(parallel_iterations, back_prop, swap_memory, name)
2604 ops.add_to_collection(ops.GraphKeys.WHILE_CONTEXT, Kontext)
-> 2605 Ergebnis = context.BuildLoop(cond, body, loop_vars, shape_invariants)
2606 Ergebnis zurückgeben
2607

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in BuildLoop (self, pred, body, loop_vars, shape_invariants)
2436 selbst.Enter()
2437 original_body_result, exit_vars = self._BuildLoop(
-> 2438 pred, body, original_loop_vars, loop_vars, shape_invariants)
2439 endlich:
2440 selbst.Beenden()

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in _BuildLoop(self, pred, body, original_loop_vars, loop_vars, shape_invariants)
2386 Struktur=original_loop_vars,
2387 flat_sequence=vars_for_body_with_tensor_arrays)
-> 2388 body_result = body(*packed_vars_for_body)
2389 wenn nicht 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 in _time_step(time, output_ta_t, state)
694 call_cell=call_cell,
695 state_size=state_size,
--> 696 skip_conditionals=True)
697 sonst:
698 (Ausgabe, neuer_Zustand) = call_cell()

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in _rnn_step(time, sequence_length, min_sequence_length, max_sequence_length, zero_output, state, call_cell, state_size, skip_conditionals )
175 # Schritte. Dies ist schneller, wenn max_seq_len gleich der Anzahl der Abrollvorgänge ist
176 # (typisch für dynamic_rnn).
--> 177 new_output, new_state = call_cell()
178 nest.assert_same_structure(state, new_state)
179 neuer_zustand = nest.flatten(neuer_zustand)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in()
682
683 input_t = nest.pack_sequence_as(structure=inputs, flat_sequence=input_t)
--> 684 call_cell = lambda: cell(input_t, state)
685
686 wenn Sequenz_Länge nicht None ist:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc in __call__(self, input, state, scope)
336 # i = input_gate, j = new_input, f = vergessen_gate, o = output_gate
337 lstm_matrix = _linear([Inputs, m_prev], 4 * self._num_units, bias=True,
--> 338 Geltungsbereich = Geltungsbereich)
339 i, j, f, o = array_ops.split(
340 value=lstm_matrix, num_or_size_splits=4, Achse=1)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc in _linear(args, output_size, bias, bias_start, scope)
745 mit vs.variable_scope(scope) als äußerer_Scope:
746 Gewichte = vs.get_variable(
--> 747 "Gewichte", [total_arg_size, output_size], dtype=dtype)
748 wenn len(args) == 1:
749 res = math_ops.matmul(args[0], Gewichte)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc in get_variable(name, shape, dtype, initializer, regularizer, trainable, collections, caching_device, partitioner , validiere_form, benutzerdefinierter_getter)
986 Sammlungen=Sammlungen, caching_device=caching_device,
987 partitioner=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 in get_variable(self, var_store, name, shape, dtype, initializer, regularizer, trainable, collections , Caching_Gerät, Partitionierer, Validate_Shape, Custom_Getter)
888 Sammlungen=Sammlungen, caching_device=caching_device,
889 partitioner=partitioner, validate_shape=validate_shape,
--> 890 custom_getter=custom_getter)
891
892 def _get_partitioned_variable(selbst,

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc in get_variable(self, name, shape, dtype, initializer, regularizer, reuse, trainable, collections , Caching_Gerät, Partitionierer, Validate_Shape, Custom_Getter)
346 Wiederverwendung=Wiederverwendung, trainierbar=trainierbar, Sammlungen=Sammlungen,
347 caching_device=caching_device, partitioner=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 in _true_getter(name, shape, dtype, initializer, regularizer, reuse, trainable, collections, caching_device , Partitionierer, Validate_Shape)
331 Initialisierer=Initialisierer, Regularisierer=Regularisierer, Wiederverwendung=Wiederverwendung,
332 trainierbar=trainierbar, Sammlungen=Sammlungen,
--> 333 caching_device=caching_device, validate_shape=validate_shape)
334
335 wenn custom_getter nicht None ist:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc in _get_single_variable(self, name, shape, dtype, initializer, regularizer, partition_info, reuse, trainable , Sammlungen, Caching_Gerät, Validate_Shape)
637 " Wollten Sie reuse=True in VarScope setzen? "
638 "Ursprünglich definiert bei:\n\n%s" % (
--> 639 Name, "".join(traceback.format_list(tb))))
640 gefunden_var = self._vars[name]
641 wenn nicht shape.is_compatible_with(found_var.get_shape()):

ValueError: Variable bidirektional_rnn/fw/lstm_cell/weights existiert bereits, nicht zulässig. Wollten Sie reuse=True in VarScope setzen? Ursprünglich definiert unter:

Datei "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", Zeile 747, in _linear
"weights", [total_arg_size, output_size], dtype=dtype)
Datei "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", Zeile 338, in __call__
Umfang = Umfang)
Datei "", Zeile 24, in
time_major=Wahr

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen