В тензорном потоке, как я могу индексировать значение функции, учитывая другую функцию в качестве ключа? - PullRequest
2 голосов
/ 21 июня 2019

У меня есть проблема с предварительной обработкой функций, которая слишком сложна для решения. Я хочу создать «перекрестную особенность» из 3 других, позвольте мне подробнее:

Моя проблема с ML - рекомендовать товар пользователям. В моем примере есть функции о пользователях и функции об элементе. Я пытаюсь предсказать, понравится ли пользователю этот элемент или нет. Мы используем примеры тензорного потока.

Одной из функций моего пользователя является «сопоставление» идентификаторов элементов с «привязанностью» пользователя к ним. Давайте назовем это «карта сродства предметов» Само сродство вычисляется другим процессом. Поскольку в Примерах Tensorflow нет типа карты, у нас есть 2 функции: одна - упорядоченный список идентификаторов элементов, другая - упорядоченный список сходств. Они синхронны. Таким образом, моя «карта сродства предметов» фактически представлена ​​функциями item_affinities_ids и item affinities. Да, я использую информацию о сходстве предметов и пытаюсь предсказать сходство других предметов. Но они отличаются, входные данные рассчитываются для другого варианта использования продукта, чем тот, который я пытаюсь предсказать.

У меня также есть третья функция, которая является item_id элемента, для которого я пытаюсь вычислить новое сходство.

В наивном NumPy я мог бы сделать это так:

item_name = np.array(["item-a"])
item_affinities_ids = np.array(["item-0", "item-a", "item-b"])
item_affinities = np.array([0.2, 0.3, 0.4])
indices = np.where(item_affinities_ids == item_name)
return item_affinities[indices]

Теперь, где все может быть сложнее, в реальной жизни:

  • Я хочу реализацию тензорного потока (TFT или собственный TF).
  • Мы используем TF v.13
  • «Карта сходства предметов» может отсутствовать. Таким образом, два результирующих item_affinities_ids и item affinities представлены как SparseTensor с. Однако, если есть один, другой тоже, и они гарантированно будут синхронными (того же размера, того же порядка).
  • Мы делаем прогнозирование и обучение на примерах примеров, поэтому первое измерение каждого из моих (разреженных) тензоров - batch_size> 1.
  • item_id может не существовать в «карте сродства предметов». В этом случае я хочу значение по умолчанию (0.0).

Я ищу реализацию тензорного потока, которая бы отвечала всем этим требованиям. Пока что у меня есть:

# using constants for the demonstration. In real life it would be tensors.
item_name = tf.constant([["item-a"], ["item-3"]])
item_affinities_ids = tf.constant([["item-0", "item-a", "item-b"], ["item-2", "item-1", "item-3"]])
item_affinities = tf.constant([[0.2, 0.3, 0.4], [0.2, -0.9, 0.4]])
return tf.boolean_mask(item_affinities, tf.equal(item_affinities_ids, item_name))

Но он не обрабатывает SparseTensor и случай, когда item_id отсутствует в списке item_affinities. Я ищу кого-нибудь, кто поможет мне с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...