กระจาย 'อัปเดต' เป็นเทนเซอร์ใหม่ตาม 'ดัชนี'
สร้างเทนเซอร์ใหม่โดยใช้ "การอัปเดต" แบบเบาบางกับค่าแต่ละค่าหรือส่วนย่อยภายในเทนเซอร์ (เริ่มแรกเป็นศูนย์สำหรับตัวเลข ว่างสำหรับสตริง) ของ "รูปร่าง" ที่กำหนดตามดัชนี โอเปอเรเตอร์นี้จะกลับกันของโอเปอเรเตอร์ tf.gather_nd
ซึ่งจะแยกค่าหรือการแบ่งส่วนจากเทนเซอร์ที่กำหนด
การดำเนินการนี้คล้ายกับ tensor_scatter_add ยกเว้นว่าเทนเซอร์จะเริ่มต้นเป็นศูนย์ การเรียก tf.scatter_nd(indices, values, shape)
จะเหมือนกับ `tensor_scatter_add(tf.zeros(shape,values.dtype), indices,values)`
หาก `ดัชนี` มีรายการที่ซ้ำกัน การอัปเดตจะถูกสะสม (สรุป)
คำเตือน : ลำดับที่ใช้การอัปเดตนั้นไม่ได้กำหนดไว้ ดังนั้นเอาต์พุตจะไม่สามารถกำหนดได้หาก "ดัชนี" มีรายการที่ซ้ำกัน เนื่องจากปัญหาการประมาณตัวเลขบางประการ ตัวเลขที่สรุปในลำดับที่แตกต่างกันอาจทำให้ได้ผลลัพธ์ที่แตกต่างกัน
`indices` คือเทนเซอร์จำนวนเต็มที่มีดัชนีอยู่ในเทนเซอร์ใหม่ของรูปร่าง 'รูปร่าง' มิติสุดท้ายของ "ดัชนี" สามารถอยู่ในอันดับสูงสุดของ "รูปร่าง" ได้:
indices.shape[-1] <= รูปร่างอันดับ
มิติสุดท้ายของ `ดัชนี` สอดคล้องกับดัชนีในองค์ประกอบ (หาก `indices.shape[-1] = shape.rank`) หรือชิ้น (หาก `indices.shape[-1] < รูปร่างอันดับ`) ตามแนว `ดัชนี .shape[-1]` ของ `รูปร่าง` `updates` เป็นเทนเซอร์ที่มีรูปร่าง
ดัชนีรูปร่าง[:-1] + รูปร่าง[ดัชนีรูปร่าง[-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 หากพบดัชนีนอกขอบเขต ดัชนีนั้นจะถูกละเว้น
ค่าคงที่
สตริง | OP_NAME | ชื่อของ op นี้ ซึ่งรู้จักกันในชื่อของเอ็นจิ้นหลัก TensorFlow |
วิธีการสาธารณะ
เอาท์พุต <U> | เป็นเอาท์พุต () ส่งกลับค่าแฮนเดิลสัญลักษณ์ของเทนเซอร์ |
คงที่ <U ขยาย TType , T ขยาย TNumber > ScatterNd <U> | สร้าง (ขอบเขต ขอบเขต ดัชนีตัว ดำเนินการ <T> การอัพเดตตัวดำเนิน การ <U> รูปร่าง ตัวถูกดำเนินการ <T>) วิธีการจากโรงงานเพื่อสร้างคลาสที่รวมการดำเนินการ ScatterNd ใหม่ |
เอาท์พุต <U> | เอาท์พุท () เทนเซอร์ใหม่ที่มีรูปทรงที่กำหนดและมีการอัพเดตตามดัชนี |
วิธีการสืบทอด
ค่าคงที่
สตริงสุดท้ายแบบคงที่สาธารณะ OP_NAME
ชื่อของ op นี้ ซึ่งรู้จักกันในชื่อของเอ็นจิ้นหลัก TensorFlow
วิธีการสาธารณะ
เอาท์พุท สาธารณะ <U> asOutput ()
ส่งกลับค่าแฮนเดิลสัญลักษณ์ของเทนเซอร์
อินพุตสำหรับการดำเนินการ TensorFlow คือเอาต์พุตของการดำเนินการ TensorFlow อื่น วิธีการนี้ใช้เพื่อรับหมายเลขอ้างอิงสัญลักษณ์ที่แสดงถึงการคำนวณอินพุต
การสร้าง ScatterNd <U> แบบคงที่สาธารณะ (ขอบเขต ขอบเขต , ดัชนี ตัวดำเนินการ <T>, การอัปเดตตัวดำเนิน การ <U>, รูปร่าง ตัวดำเนินการ <T>)
วิธีการจากโรงงานเพื่อสร้างคลาสที่รวมการดำเนินการ ScatterNd ใหม่
พารามิเตอร์
ขอบเขต | ขอบเขตปัจจุบัน |
---|---|
ดัชนี | ดัชนีเทนเซอร์ |
อัปเดต | อัปเดตเพื่อกระจายไปยังเอาต์พุต |
รูปร่าง | 1-D. รูปร่างของเทนเซอร์ผลลัพธ์ |
การส่งคืน
- ตัวอย่างใหม่ของ ScatterNd