Tensorflow: حصل خطأ عند تهيئة rnn ثنائي الاتجاه باستخدام خلية LSTM

تم إنشاؤها على ١٨ يناير ٢٠١٦  ·  3تعليقات  ·  مصدر: tensorflow/tensorflow

أرغب في إنشاء نموذج ثنائي الاتجاه باستخدام Tensorflow باستخدام خلية LSTM ، عندما أحاول تهيئة النطاق ثنائي الاتجاه ،
يعطي: 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 / forward / Linear / Matrix
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 / forward / Linear / Matrix
BiRNN_FW / RNN / BasicLSTMCell / backward / Linear / Matrix

اقرأ دليل متغيرات المشاركة لمزيد من المعلومات.

لاحظ أن هذا لن يحدث بعد الآن لأن المتغيرات يتم إنشاؤها داخل ...Cell.__call__ وليس في ...Cell.__init__ ، وبالتالي فهي لا تحتاج إلى نطاق لبناء الخلايا ، وستتعامل مع النطاق المتغير نفسها داخل bidirectional_rnn وبالتالي لا تحتاج إلى تحديد نطاقها بنفسك.

ما زلت أواجه نفس المشكلة. أي sugestions؟ لقد جربت النهج الذي اقترحه salomons ، نفس النتائج. لا تعيد أي مجموعة نتيجة لذلك.
((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 = صحيح)
)

ValueError Traceback (أحدث مكالمة أخيرة)
في()
20 مدخلات = encoder_inputs_embedded،
21 طول_تسلسل = طول_المدخلات_المدخلة ،
---> 22 نوع dtype = tf.float32 ، time_major = صحيح)
23)
24

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc في dualirectional_dynamic_rnn (cell_fw ، cell_bw ، المدخلات ، التسلسل_الطول ، initial_state_fw ، initial_stty_state ، ، time_major ، نطاق)
348 Initial_state = initial_state_fw، dtype = dtype،
349 المتوازيين
-> 350 time_major = time_major ، النطاق = fw_scope)
351
352 # الاتجاه الخلفي

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc في dynamic_rnn (الخلية ، المدخلات ، التسلسل_الطول ، initial_state ، النوع dtype ، التكرار المتوازي ، swap_memory ، time_major ، النطاق )
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 (الخلية ، المدخلات ، الحالة الأولية ، التكرار المتوازي ، swap_memory ، التسلسل_الطول ، dtype)
711 loop_vars = (time، output_ta، state)،
712 كتابات متوازية = كلمات متوازية
-> 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 ،allel_iterations، back_prop، swap_memory، name
سياق 2603 = whileContext (موازية_المعايير ، back_prop ، swap_memory ، الاسم)
2604 ops.add_to_collection (ops.GraphKeys.WHILE_CONTEXT ، سياق)
-> 2605 نتيجة = سياق .uildLoop (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 (ذاتي ، سابق ، جسم ، حلقات_حلقة ، متغيرات الشكل)
2436 النفس - أدخل ()
2437 original_body_result، exit_vars = self._BuildLoop (
-> 2438 مقدما ، جسم ، original_loop_vars ، loop_vars ، شكل متغير)
2439 أخيرًا:
2440 خروج ذاتي ()

/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 - عدل
-> 2388 body_result = body (* pack_vars_for_body)
2389 if not 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 (الوقت ، الإخراج_ta_t ، الحالة)
694 call_cell = call_cell،
695 state_size = state_size ،
-> 696 skip_conditionals = صحيح)
697 آخر:
698 (الإخراج، new_state) = 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_onds ، call_alsize ، )
175 # خطوات. يكون هذا أسرع عندما يكون max_seq_len مساويًا لعدد مرات إلغاء التسجيل
176 # (وهو نموذجي لـ dynamic_rnn).
-> 177 new_output، new_state = call_cell ()
178 nest.assert_same_structure (state، new_state)
179 new_state = nest.flatten (new_state)

/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 = lambda: cell (input_t، state)
685
686 إذا كان Sequ_length ليس بلا:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc في __call __ (self ، inputs ، state ، range)
336 # i = input_gate ، j = new_input ، f = forget_gate ، o = output_gate
337 lstm_matrix = _ خطي ([المدخلات ، m_prev] ، 4 * self._num_units ، الانحياز = صحيح ،
-> 338 النطاق = النطاق)
339 i، j، f، o = array_ops.split (
قيمة 340 = lstm_matrix ، num_or_size_splits = 4 ، المحور = 1)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc في _خطي (args ، output_size ، bias ، bias_start ، النطاق)
745 مع vs.variable_scope (النطاق) مثل Outer_scope:
746 أوزان = vs.get_variable (
-> 747 "أوزان" ، [total_arg_size ، output_size] ، نوع dtype = نوع dtype)
748 if len (args) == 1:
749 res = math_ops.matmul (args [0] ، أوزان)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc في get_variable (الاسم ، والشكل ، والنوع ، والمهيئ ، والمنظم ، والقابل للتدريب ، والمجموعات ، والتخزين المؤقت للجهاز ، والقسم ، Validate_shape ، custom_getter)
مجموعات 986 = المجموعات ، caching_device = caching_device ،
987 مقسم = مقسم ، Validate_shape = Validate_shape ،
-> 988 custom_getter = custom_getter)
989 = -
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 ، منظم ، قابل للتدريب ، مجموعات ، caching_device ، مقسم ، validate_shape ، custom_getter)
888 مجموعة = المجموعات ، caching_device = caching_device ،
889 مقسم = مقسم ، Validate_shape = Validate_shape ،
-> 890 custom_getter = custom_getter)
891
892 def _get_partitioned_variable

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc في get_variable (self ، name ، shape ، dtype ، initializer ، منظم ، إعادة الاستخدام ، قابل للتدريب ، المجموعات ، caching_device ، مقسم ، validate_shape ، custom_getter)
إعادة استخدام 346 = إعادة استخدام ، قابل للتدريب = قابل للتدريب ، مجموعات = مجموعات ،
347 caching_device = caching_device، مقسم = مقسم،
-> 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 (الاسم ، الشكل ، النوع ، المُهيئ ، المُنظم ، إعادة الاستخدام ، قابل للتدريب ، المجموعات ، التخزين المؤقت للجهاز ، فاصل ، Validate_shape)
مُهيئ 331 = مُهيئ ، مُنظم = مُنظم ، إعادة استخدام = إعادة استخدام ،
332 قابل للتدريب = قابل للتدريب ، المجموعات = مجموعات ،
-> 333 caching_device = caching_device، validate_shape = validate_shape)
334
335 إذا لم يكن custom_getter بلا:

/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، normalizer، partition_info، reuse، trainable ، المجموعات، caching_device، validate_shape)
637 "هل تقصد تعيين إعادة الاستخدام = صحيح في VarScope؟"
638 "معرّفة في الأصل في: \ n \ n٪ s"٪ (
-> 639 اسم، "" .join (traceback.format_list (tb))))
640 found_var = self._vars [الاسم]
641 إن لم يكن الشكل.

ValueError: المتغير ثنائي الاتجاه_rnn / fw / lstm_cell / weights موجود بالفعل ، غير مسموح به. هل تقصد تعيين إعادة الاستخدام = صحيح في VarScope؟ تم تعريفه في الأصل في:

ملف "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py" ، السطر 747 ، في _خطي
"أوزان" ، [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__
النطاق = النطاق)
ملف ""، السطر 24 ، في
time_major = صحيح

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات