ينثر "التحديثات" في موتر الشكل "الشكل" وفقًا لـ "المؤشرات".
قم بتوزيع "التحديثات" المتفرقة وفقًا للقيم الفردية في "المؤشرات" المحددة. تقوم هذه العملية بإرجاع موتر الإخراج بالشكل الذي تحدده. هذا المرجع هو عكس عامل التشغيل tf.gather_nd
الذي يستخرج القيم أو الشرائح من موتر معين.
تشبه هذه العملية tf.tensor_scatter_nd_add
، باستثناء أن الموتر تمت تهيئته بصفر. استدعاء tf.scatter_nd(indices, updates, shape)
يطابق استدعاء `tf.tensor_scatter_nd_add(tf.zeros(shape, Updates.dtype), indices, Updates)`
إذا كانت "المؤشرات" تحتوي على نسخ مكررة، فسيتم تجميع (جمع) "التحديثات" المرتبطة في موتر الإخراج.
تحذير : بالنسبة لأنواع البيانات ذات الفاصلة العائمة، قد يكون الإخراج غير محدد. وذلك لأن الترتيب الذي يتم تطبيق التحديثات به غير محدد، وعندما تتم إضافة أرقام الفاصلة العائمة بترتيبات مختلفة، قد يكون خطأ التقريب الرقمي الناتج مختلفًا قليلاً. ومع ذلك، سيكون الإخراج حتميًا إذا تم تمكين الحتمية التشغيلية عبر tf.config.experimental.enable_op_determinism
.
"المؤشرات" عبارة عن موتر عدد صحيح يحتوي على مؤشرات في موتر الإخراج. البعد الأخير من "المؤشرات" يمكن أن يكون على الأكثر رتبة "الشكل":
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([[1], [3]])
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)
[[[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]], [[5, 5, 5, 5], [6, 6, 6, 6], [7 , 7, 7, 7], [8, 8, 8, 8]]]
لاحظ أنه على وحدة المعالجة المركزية، إذا تم العثور على فهرس خارج النطاق، فسيتم إرجاع خطأ. في وحدة معالجة الرسومات، إذا تم العثور على فهرس خارج النطاق، فسيتم تجاهل الفهرس.
الأساليب العامة
الإخراج <U> | كإخراج () إرجاع المقبض الرمزي للموتر. |
ثابت <U، T يمتد الرقم> ScatterNd <U> | |
الإخراج <U> | الإخراج () موتر جديد بالشكل المحدد والتحديثات المطبقة وفقًا للمؤشرات. |
الطرق الموروثة
الأساليب العامة
الإخراج العام <U> كإخراج ()
إرجاع المقبض الرمزي للموتر.
المدخلات إلى عمليات TensorFlow هي مخرجات عملية TensorFlow أخرى. يتم استخدام هذه الطريقة للحصول على مقبض رمزي يمثل حساب الإدخال.
إنشاء ScatterNd <U> ثابت عام (نطاق النطاق ، مؤشرات المعامل <T>، تحديثات المعامل <U>، شكل المعامل <T>)
طريقة المصنع لإنشاء فئة تغلف عملية ScatterNd جديدة.
حدود
نِطَاق | النطاق الحالي |
---|---|
المؤشرات | موتر المؤشرات. |
التحديثات | القيم لتنتشر في موتر الإخراج. |
شكل | 1-د. شكل موتر الإخراج. |
المرتجعات
- مثيل جديد من ScatterNd