我正在尝试创建大小为n
(其中n
是符号形状张量的一部分)的多维数组。该数组在每个区域中应有0
,但在变量b_class
中将很少。
这是一个简单的Numpy
实现,但是在这种情况下,我们的数组将具有固定大小100
而不是张量:
import numpy as np
index_array = [10, 99, 50, 70]
n = 100
zero_array = np.zeros(100)
for b_class in range(0, 4):
zero_array[index_array[b_class]] = b_class # every class position is defined by index_array
print(zero_array)
这对于定义的常数非常有效,但是在我们的情况下,n
是张量,index_array
也是如此,因此zero_array = K.zeros((n))
,其中K
是Keras.backend
,并且因此,以“ Pythonic”方式分配值会产生错误:
TypeError:“ Tensor”对象不支持 TensorFlow
我想找到一种方法,仅在不使用tf.Variable
和tf.SparseTensor
的情况下,在基于Keras的后端中复制代码,从而使其与Keras完全兼容。
有什么方法可以通过矢量化操作来执行在特定索引处将值分配给稀疏张量的简单任务吗?
谢谢!
答案 0 :(得分:0)
是的,有。您可以使用tf.scatter_nd来应用稀疏更新。这是一个示例:
import tensorflow as tf
n = tf.constant([100])
index_tensor = tf.constant([[10], [99], [50], [70]])
updates = tf.range(4, dtype=tf.float32)
out = tf.scatter_nd(indices=index_tensor,
updates=updates,
shape=n)
with tf.Session() as sess:
print(sess.run(out))