أرغب في إنشاء نموذج ثنائي الاتجاه باستخدام 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
اقرأ دليل متغيرات المشاركة لمزيد من المعلومات.
لاحظ أن هذا لن يحدث بعد الآن لأن المتغيرات يتم إنشاؤها داخل ...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__
النطاق = النطاق)
ملف "
time_major = صحيح
التعليق الأكثر فائدة
تحتاج إلى تحديد نطاقات متغيرة مختلفة لخلايا LSTM.
وإلا سيكون هناك تضارب في الاسم (تحاول كلتا الخليتين استخدام اسم "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
اقرأ دليل متغيرات المشاركة لمزيد من المعلومات.