ScatterNd

כיתת גמר ציבורית ScatterNd

פזרו `עדכונים` לטנזור חדש לפי `מדדים`.

יוצר טנזור חדש על ידי החלת 'עדכונים' דלילים על ערכים בודדים או פרוסות בתוך טנזור (בהתחלה אפס למספרי, ריק למחרוזת) של ה'צורה' הנתונה לפי מדדים. אופרטור זה הוא היפוך של האופרטור `tf.gather_nd` אשר מחלץ ערכים או פרוסות מטנזור נתון.

פעולה זו דומה ל-tensor_scatter_add, אלא שהטנזור מאותחל באפס. קריאה ל-'tf.scatter_nd(indexes, 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`) לאורך הממד `מדדים` .shape[-1]` של `shape`. 'עדכונים' הוא טנסור עם צורה

indices.shape[:-1] + shape[indices.shape[-1]:]

הצורה הפשוטה ביותר של פיזור היא הכנסת אלמנטים בודדים בטנזור לפי אינדקס. לדוגמה, נניח שאנו רוצים להכניס 4 אלמנטים מפוזרים בטנזור דרגה 1 עם 8 אלמנטים.

ב-Python, פעולת הפיזור הזו תיראה כך:

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 עם שתי מטריצות של ערכים חדשים.

ב-Python, פעולת הפיזור הזו תיראה כך:

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>
ליצור ( היקף היקף, מדדי Operand <T>, עדכוני Operand <U>, צורת Operand <T>)
שיטת מפעל ליצירת מחלקה העוטפת פעולת ScatterNd חדשה.
פלט <U>
פלט ()
טנזור חדש עם הצורה הנתונה ועדכונים מיושמים לפי המדדים.

שיטות בירושה

שיטות ציבוריות

פלט ציבורי <U> asOutput ()

מחזירה את הידית הסמלית של טנזור.

כניסות לפעולות TensorFlow הן יציאות של פעולת TensorFlow אחרת. שיטה זו משמשת להשגת ידית סמלית המייצגת את חישוב הקלט.

Public static ScatterNd <U> create ( היקף היקף , מדדי Operand <T>, עדכוני Operand <U>, צורת Operand <T>)

שיטת מפעל ליצירת מחלקה העוטפת פעולת ScatterNd חדשה.

פרמטרים
תְחוּם ההיקף הנוכחי
מדדים טנסור אינדקס.
עדכונים עדכונים לפיזור בפלט.
צוּרָה 1-D. צורת הטנזור שנוצר.
החזרות
  • מופע חדש של ScatterNd

פלט ציבורי <U> פלט ()

טנזור חדש עם הצורה הנתונה ועדכונים מיושמים לפי המדדים.