Как суммировать значения в соответствии с индексами в другом векторе, используя keras / tensorflow?

#python #tensorflow #machine-learning #keras #nlp

#python #tensorflow #машинное обучение #keras #nlp

Вопрос:

Я здесь новичок, и у меня есть вопрос, касающийся индексации тензоров в 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->0
2->1
3->1
4->0.1
5->0.6
  

Как я могу добиться чего-то подобного без необходимости перебирать каждый элемент? Я думал о чем-то в направлении разреженного тензора (поскольку возможный словарь очень большой), но я не знаю, как его эффективно реализовать.
Кто-нибудь может помочь?
Я в основном хочу реализовать сеть генератора указателей, и эта часть требуется при вычислении вероятности копирования входного слова, а не его генерации.

Ответ №1:

Вам нужен tf.bincount() , который подсчитывает количество вхождений каждого значения в целочисленный массив. Пример:

 import tensorflow as tf
import numpy as np

indices_tf = tf.placeholder(shape=(None,None),dtype=tf.int32)
weights_tf = tf.placeholder(shape=(None,None),dtype=tf.float32)

# The returned index counts from 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}))

# print
[0.  0.  1.  1.  0.1 0.6]
[0.  0.  2.  2.  0.2 1.2]