Open1

TensorFlow v2.xで固定サイズのテンソルの一部を可変サイズのテンソルで前詰めで更新する tf.tensor_scatter_nd_update

PINTOPINTO

Numpy の put と同じことを TensorFlow v2.x で行いたい。なお、更新対象のテンソル b はサイズが不定(可変)の前提とし、元のテンソルの更新は前詰めで行いたい。フレームワーク間のモデルコンバージョンの際に形状不定のテンソルが発生することを避けるためのワークアラウンド。
https://python.atelierkobato.com/where/

import tensorflow as tf

a = tf.fill([10], -1)
print(a)
"""
tf.Tensor([-1 -1 -1 -1 -1 -1 -1 -1 -1 -1], shape=(10,), dtype=int32)
"""
b = tf.constant([1,2,3,4], dtype=tf.int32)
print(b)
"""
tf.Tensor([1 2 3 4], shape=(4,), dtype=int32)
"""

c = tf.shape(b)[0]
print(c)
"""
tf.Tensor(4, shape=(), dtype=int32)
"""

d = tf.range(c)
print(d)
"""
tf.Tensor([0 1 2 3], shape=(4,), dtype=int32)
"""

e = tf.reshape(d,(c, 1))
print(e)
"""
tf.Tensor(
[[0]
 [1]
 [2]
 [3]], shape=(4, 1), dtype=int32)
"""

"""
https://www.tensorflow.org/api_docs/python/tf/tensor_scatter_nd_update
tf.tensor_scatter_nd_update(
    tensor, indices, updates, name=None
)
"""
f = tf.tensor_scatter_nd_update(a, e, b)
print(f)

tf.Tensor([-1 -1 -1 -1 -1 -1 -1 -1 -1 -1], shape=(10,), dtype=int32)
tf.Tensor([1 2 3 4], shape=(4,), dtype=int32)
tf.Tensor([ 1  2  3  4 -1 -1 -1 -1 -1 -1], shape=(10,), dtype=int32)