我是新来的,有一个关于Keras/TensorFlow中张量索引的问题想问:
我有一个长度为N
的向量,其中包含词汇表中单词的索引(索引可能重复)。这个向量代表一个句子,例如(40, 25, 99, 26, 34, 99, 100, 100...)
。我还有另一个向量,或者实际上是一个矩阵(因为它是一批示例),长度同样为N
,其中原始向量中的每个单词都被分配了一个权重W_i
。我想对整个句子中特定单词的权重进行求和,以便我能得到一个从单词索引到该单词在句子中权重总和的映射,并且我想以向量化的方式来做这件事。例如,假设句子是(1, 2, 3, 4, 5, 3)
,权重是(0, 1, 0.5, 0.1, 0.6, 0.5)
,我希望结果是这样的映射:
1->02->13->14->0.15->0.6
我怎样才能在不需要遍历每个元素的情况下实现这个功能?我在考虑使用稀疏张量(因为可能的词汇量非常大),但我不知道如何高效地实现它。谁能帮帮我?我基本上想实现一个指针生成网络,而这部分是在计算复制输入单词而不是生成单词的概率时所必需的。
回答:
你需要使用tf.bincount()
,它可以统计整数数组中每个值的出现次数。以下是一个示例:
import tensorflow as tfimport numpy as npindices_tf = tf.placeholder(shape=(None,None),dtype=tf.int32)weights_tf = tf.placeholder(shape=(None,None),dtype=tf.float32)# 返回的索引从0开始result = tf.bincount(indices_tf,weights_tf)indices_data = np.array([1, 2, 3, 4, 5, 3])weights_data = np.array([0, 1, 0.5, 0.1, 0.6, 0.5])with tf.Session() as sess: print(sess.run(result, feed_dict={indices_tf:[indices_data],weights_tf:[weights_data]})) print(sess.run(result, feed_dict={indices_tf: [indices_data]*2, weights_tf: [weights_data]*2}))# 打印[0. 0. 1. 1. 0.1 0.6][0. 0. 2. 2. 0.2 1.2]