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