При работе с пакетами через API набора данных в Tensorflow, каков рекомендуемый способ поиска индекса в словаре? - PullRequest
0 голосов
/ 03 мая 2018

В настоящее время я собираюсь реорганизовать существующий код в более новый API TF Dataset. В нашем текущем процессе мы заполняем стандартный словарь Python идентификаторами продуктов для идентификаторов классификации.

Теперь я переместил наши изображения / пути к набору данных TF, а затем, используя tf.string_split, извлекаю различную информацию из самого имени файла. Одним из них является product_id. На данный момент product_id является тензором tf, который я не могу выполнить поиск, используя наши предыдущие средства через " if product_id в products_to_class ", потому что у меня теперь есть тензор, и я не могу выполнить поиск через стандартный словарь.

Так что я использую этот проект как способ узнать, как повысить производительность. Поэтому я хотел знать, какой подход «лучший / рекомендуемый» используется здесь при работе с пакетами API tf Dataset. Преобразовать ли я product_id в строку и просто выполнить поиск по текущей проверке, если выше, или мне теперь нужно преобразовать словарь products_to_class в другую структуру данных, такую ​​как другой набор данных, и выполнить поиск с использованием тензоров? Любой совет будет принята с благодарностью.

Небольшой пример того, что у меня сейчас есть:

prod_to_class = {'12345': 0, '67890': 1}

#Below logic is in a mapped function used on a TF.Dataset
def _parse_fn(filename, label)
  core_file = tf.string_split([filename], '\\').values[-1]
  product_id = tf.string_split([core_file], ".").values[0]

  #unable to perform below because product_id is now a tensor and
  #products_to_class is a python dictionary
  if product_id in products_to_class:
    label = products_to_class[product_id]

1 Ответ

0 голосов
/ 03 мая 2018

Встроенный механизм TensorFlow для этого заключается в использовании таблицы tf.contrib.lookup. Например, если у вас есть список строковых ключей, которые вы хотите отобразить на плотные целые числа, вы можете определить следующее вне вашего _parse_fn():

# This constructor creates a lookup table that implicitly maps each string in the
# argument to its index in the list (e.g. '67890' -> 1).
products_to_class = tf.contrib.lookup.index_table_from_tensor(['12345', '67890'])

... и затем используйте products_to_class.lookup() в вашем _parse_fn().

def _parse_fn(filename, label):
  core_file = tf.string_split([filename], '\\').values[-1]
  product_id = tf.string_split([core_file], ".").values[0]

  # Returns a `tf.Tensor` that corresponds to the value associated with 
  # `product_id` in the `products_to_class` table.
  label = products_to_class.lookup(product_id)

  # ...

Обратите внимание, что это накладывает на вашу программу два дополнительных ограничения:

  1. Вы должны использовать Dataset.make_initializable_iterator() вместо Dataset.make_one_shot_iterator().
  2. Вы должны вызвать sess.run(tf.tables_initializer()) перед началом использования элементов из входного конвейера.

Оба из них будут обработаны для вас, если вы используете высокоуровневый tf.estimator API и вернете tf.data.Dataset из вашего input_fn.

...