Keras的“稀疏”张量上张量分配的最佳方法

时间:2019-03-29 20:14:26

标签: python tensorflow keras

我正在尝试创建大小为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)),其中KKeras.backend,并且因此,以“ Pythonic”方式分配值会产生错误:

  

TypeError:“ Tensor”对象不支持   TensorFlow

问题

我想找到一种方法,仅在不使用tf.Variabletf.SparseTensor的情况下,在基于Keras的后端中复制代码,从而使其与Keras完全兼容。

有什么方法可以通过矢量化操作来执行在特定索引处将值分配给稀疏张量的简单任务吗?

谢谢!

1 个答案:

答案 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))