«بهروزرسانیها» را با توجه به «شاخصها» در یک تانسور جدید پراکنده کنید.
یک تانسور جدید با اعمال «بهروزرسانیهای» پراکنده به مقادیر یا برشهای جداگانه در یک تانسور (در ابتدا صفر برای عدد، خالی برای رشته) از «شکل» دادهشده با توجه به شاخصها ایجاد میکند. این عملگر معکوس عملگر «tf.gather_nd» است که مقادیر یا برشهایی را از یک تانسور معین استخراج میکند.
این عملیات شبیه tensor_scatter_add است، با این تفاوت که تانسور صفر اولیه است. فراخوانی «tf.scatter_nd(شاخصها، مقادیر، شکل)» با «tensor_scatter_add(tf.zeros(شکل، values.dtype)، شاخصها، مقادیر)» یکسان است.
اگر «شاخصها» دارای موارد تکراری باشد، بهروزرسانیهای آنها انباشته میشوند (جمع میشوند).
اخطار : ترتیب اعمال بهروزرسانیها غیر قطعی است، بنابراین اگر «شاخصها» دارای موارد تکراری باشند، خروجی غیر قطعی خواهد بود - به دلیل برخی مسائل تقریب عددی، اعدادی که به ترتیب متفاوت جمعبندی میشوند ممکن است نتایج متفاوتی به همراه داشته باشند.
«شاخصها» یک تانسور عدد صحیح است که شامل شاخصهایی در یک تانسور جدید به شکل «شکل» است. آخرین بعد «شاخصها» حداکثر میتواند رتبه «شکل» باشد:
indices.shape[-1] <= shape.rank
آخرین بعد «شاخصها» مربوط به شاخصها در عناصر (اگر «indices.shape[-1] = shape.rank») یا برشها (اگر «indices.shape[-1] < shape.rank») در امتداد «شاخصها» است. شکل[-1]` از «شکل». "به روز رسانی" یک تانسور با شکل است
indices.shape[:-1] + shape[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]]]
توجه داشته باشید که در CPU، اگر یک نمایه خارج از کران پیدا شود، یک خطا برگردانده می شود. در GPU، اگر یک نمایه خارج از کران پیدا شود، شاخص نادیده گرفته می شود.
روش های عمومی
خروجی <U> | asOutput () دسته نمادین یک تانسور را برمیگرداند. |
استاتیک <U، T تعداد را گسترش می دهد> ScatterNd <U> | |
خروجی <U> | خروجی () یک تانسور جدید با شکل داده شده و به روز رسانی های اعمال شده بر اساس شاخص ها. |
روش های ارثی
روش های عمومی
خروجی عمومی <U> asOutput ()
دسته نمادین یک تانسور را برمیگرداند.
ورودی های عملیات TensorFlow خروجی های عملیات تنسورفلو دیگر هستند. این روش برای به دست آوردن یک دسته نمادین که نشان دهنده محاسبه ورودی است استفاده می شود.
ایجاد ScatterNd ایستا عمومی (حوزه دامنه ، شاخص های عملوند <T>، به روز رسانی های عملوند <U>، شکل عملوند <T>)
روش کارخانه برای ایجاد کلاسی که یک عملیات ScatterNd جدید را بسته بندی می کند.
مولفه های
محدوده | محدوده فعلی |
---|---|
شاخص ها | تانسور شاخص |
به روز رسانی ها | به روز رسانی برای پراکندگی در خروجی. |
شکل | 1-D. شکل تانسور حاصل. |
برمی گرداند
- یک نمونه جدید از ScatterNd
خروجی عمومی <U> خروجی ()
یک تانسور جدید با شکل داده شده و به روز رسانی های اعمال شده بر اساس شاخص ها.