ScatterNd

الطبقة النهائية العامة ScatterNd

قم بتوزيع "التحديثات" في موتر جديد وفقًا لـ "المؤشرات".

ينشئ موترًا جديدًا عن طريق تطبيق "تحديثات" متفرقة على القيم الفردية أو الشرائح داخل موتر (في البداية صفر للأرقام، وفارغ للسلسلة) من "الشكل" المحدد وفقًا للمؤشرات. هذا العامل هو عكس عامل التشغيل `tf.gather_nd` الذي يستخرج القيم أو الشرائح من موتر معين.

تشبه هذه العملية Tensor_scatter_add، فيما عدا أن الموتر تمت تهيئته بصفر. استدعاء `tf.scatter_nd(indices,values,shape)` يطابق `tensor_scatter_add(tf.zeros(shape,values.dtype),indices,value)`

إذا كانت "الفهارس" تحتوي على نسخ مكررة، فسيتم تجميع (جمع) تحديثاتها.

تحذير : الترتيب الذي يتم به تطبيق التحديثات غير حتمي، وبالتالي فإن الإخراج سيكون غير حتمي إذا كانت "المؤشرات" تحتوي على نسخ مكررة - بسبب بعض مشكلات التقريب الرقمي، قد تؤدي الأرقام المجمعة بترتيب مختلف إلى نتائج مختلفة.

"المؤشرات" عبارة عن موتر عدد صحيح يحتوي على مؤشرات في موتر جديد للشكل "الشكل". البعد الأخير من "المؤشرات" يمكن أن يكون على الأكثر رتبة "الشكل":

indices.shape[-1] <= Shape.rank

البعد الأخير من "المؤشرات" يتوافق مع المؤشرات في عناصر (إذا كانت "indices.shape[-1] = Shape.rank") أو شرائح (إذا كانت "indices.shape[-1] < Shape.rank") على طول البعد "indices" .shape[-1]` من `الشكل`. "التحديثات" عبارة عن موتر ذو شكل

indices.shape[:-1] + شكل[indices.shape[-1]:]

أبسط شكل من أشكال التشتت هو إدراج عناصر فردية في موتر حسب الفهرس. على سبيل المثال، لنفترض أننا نريد إدراج 4 عناصر متناثرة في موتر من الرتبة 1 يحتوي على 8 عناصر.

في بايثون، ستبدو عملية التبعثر كما يلي:

indices = tf.constant([[4], [3], [1], [7]])
     updates = tf.constant([9, 10, 11, 12])
     shape = tf.constant([8])
     scatter = tf.scatter_nd(indices, updates, shape)
     print(scatter)
 
وسيبدو الموتر الناتج كما يلي:

[0، 11، 0، 10، 9، 0، 0، 12]

يمكننا أيضًا إدراج شرائح كاملة من موتر ذو رتبة أعلى مرة واحدة. على سبيل المثال، إذا أردنا إدراج شريحتين في البعد الأول لموتر من الرتبة 3 مع مصفوفتين من القيم الجديدة.

في بايثون، ستبدو عملية التبعثر كما يلي:

indices = tf.constant([[0], [2]])
     updates = tf.constant([[[5, 5, 5, 5], [6, 6, 6, 6],
                             [7, 7, 7, 7], [8, 8, 8, 8]],
                            [[5, 5, 5, 5], [6, 6, 6, 6],
                             [7, 7, 7, 7], [8, 8, 8, 8]]])
     shape = tf.constant([4, 4, 4])
     scatter = tf.scatter_nd(indices, updates, shape)
     print(scatter)
 
وسيبدو الموتر الناتج كما يلي:

[[[5، 5، 5، 5]، [6، 6، 6، 6]، [7، 7، 7، 7]، [8، 8، 8، 8]]، [[0، 0، 0] , 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[5, 5, 5, 5], [6, 6] , 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]], [[0, 0, 0, 0], [0, 0, 0, 0], [0] , 0, 0, 0], [0, 0, 0, 0]]]

لاحظ أنه على وحدة المعالجة المركزية، إذا تم العثور على فهرس خارج النطاق، فسيتم إرجاع خطأ. في وحدة معالجة الرسومات، إذا تم العثور على فهرس خارج النطاق، فسيتم تجاهل الفهرس.

الأساليب العامة

الإخراج <U>
كإخراج ()
إرجاع المقبض الرمزي للموتر.
ثابت <U، T يمتد الرقم> ScatterNd <U>
إنشاء (نطاق النطاق ، مؤشرات المعامل <T>، تحديثات المعامل <U>، شكل المعامل <T>)
طريقة المصنع لإنشاء فئة تغلف عملية ScatterNd جديدة.
الإخراج <U>
انتاج ()
موتر جديد بالشكل المحدد والتحديثات المطبقة وفقًا للمؤشرات.

الطرق الموروثة

الأساليب العامة

الإخراج العام <U> كإخراج ()

إرجاع المقبض الرمزي للموتر.

المدخلات إلى عمليات TensorFlow هي مخرجات عملية TensorFlow أخرى. يتم استخدام هذه الطريقة للحصول على مقبض رمزي يمثل حساب الإدخال.

إنشاء ScatterNd <U> ثابت عام (نطاق النطاق ، مؤشرات المعامل <T>، تحديثات المعامل <U>، شكل المعامل <T>)

طريقة المصنع لإنشاء فئة تغلف عملية ScatterNd جديدة.

حدود
نِطَاق النطاق الحالي
المؤشرات مؤشر الموتر.
التحديثات التحديثات لتنتشر في الإخراج.
شكل 1-د. شكل الموتر الناتج.
عائدات
  • مثيل جديد من ScatterNd

الإخراج العام <U> الإخراج ()

موتر جديد بالشكل المحدد والتحديثات المطبقة وفقًا للمؤشرات.