اذهب إلى المحتوى
  • 0

ما هو الاختلاف بين نطاق الاسم name scope والنطاق المتغير variable scope في Tensorflow؟

عامر ابراهيم

السؤال

Recommended Posts

  • 1

أولاً سأبدأ بهذه الملاحظة: اعتباراً من الإصدار 0.11 ، تم إهمال كل من op_scope و variable_op_scope واستبدالهما بـ name_scope و variable_scope.
دعنا نتكلم أولاً عن مفهوم ال variable sharing في TensorFlow: هو آلية تسمح لنا بمشاركة المتغيرات التي يتم الوصول إليها في أجزاء مختلفة من الكود دون تمرير مراجع إلى المتغير. يمكننا استخدام الطريقة tf.get_variable مع اسم المتغير كوسيطة لإنشاء متغير جديد بهذا الاسم أو استرداد المتغير الذي تم إنشاؤه من قبل. وهذا يختلف عن استخدام tf.Variable constructor الذي سينشئ متغيراً جديداً في كل مرة يتم استدعاؤه (ويحتمل أن يضيف لاحقة إلى اسم المتغير إذا كان متغير بهذا الاسم موجوداً بالفعل). ولغرض آلية المشاركة المتغيرة ، تم تقديم نوع منفصل من النطاق (نطاق متغير). نتيجة لذلك ، تم وضع نوعين مختلفين من النطاقات: أولاً، نطاق الاسم ، يتم إنشاؤه باستخدام tf.name_scope، ثانياً، نطاق متغير ، يتم إنشاؤه باستخدام tf.variable_scope . كلا النطاقين لهما نفس التأثير على جميع العمليات وكذلك المتغيرات التي تم إنشاؤها باستخدام متغير tf، أي سيتم إضافة النطاق كبادئة إلى العملية أو اسم المتغير. ومع ذلك ، يتم تجاهل نطاق الاسم بواسطة tf.get_variable. يمكننا أن نرى ذلك في المثال التالي: الطريقة الوحيدة لوضع متغير يتم الوصول إليه باستخدام tf.get_variable في نطاق هو استخدام نطاق متغير ، كما في المثال التالي: 

with tf.name_scope("scope"):
    variable1 = tf.get_variable("variable1", [1], dtype=tf.float64)
    variable2 = tf.Variable(1, name="variable2", dtype=tf.float64)
    op = tf.add(variable1, variable2)
# scope/Add:0
op.name     
# variable1:0
variable1.name 
# scope/variable2:0
variable2.name 
 

الطريقة الوحيدة لوضع متغير يتم الوصول إليه باستخدام tf.get_variable في نطاق هو استخدام نطاق متغير ، كما في المثال التالي:

with tf.name_scope("scope"):
    variable1 = tf.get_variable("variable1", [1], dtype=tf.float64)
    variable2 = tf.Variable(1, name="variable2", dtype=tf.float64)
    op = tf.add(variable1, variable2)
# scope/Add:0
op.name     
# scope/variable1:0
variable1.name 
# scope/variable2:0
variable2.name 
 

يتيح لنا ذلك مشاركة المتغيرات بسهولة عبر أجزاء مختلفة من البرنامج ، حتى ضمن نطاقات الأسماء المختلفة:

with tf.name_scope("bla"):
    with tf.variable_scope("scope"):
        var = tf.get_variable("variable", [1])
with tf.name_scope("blabla"):
    with tf.variable_scope("scope", reuse=True):
        var1 = tf.get_variable("variable", [1])
assert var1 == var
var.name   # scope/variable:0
var1.name  # scope/variable:0
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...