Тензор потока: при использовании slim.dataset.Dataset, есть ли способ сопоставить значения идентификатора метки с другими значениями? - PullRequest
0 голосов
/ 27 апреля 2018
dataset = slim.dataset.Dataset(...)
provider = slim.dataset_data_provider.DatasetDataProvider(dataset, ..._
image, labels = provider.get(['image', 'label')

Скажем, для примера в наборе данных A labels может быть [1, 2, 1, 3]. Однако по какой-то причине (например, из-за набора данных B) я хотел бы сопоставить идентификаторы меток с другими значениями. Отображение может быть как ниже.

# {old_label: target_label}
mapping = {0: 0, 1: 2, 2: 2, 3: 2, 4: 2, 5: 3, 6: 1}

Пока я предполагаю два пути:

- tf.data.Dataset, кажется, имеет функцию map(map_func), которую должны пройти все примеры, что может быть решением. Тем не менее, я более знаком с slim.dataset.Dataset. Есть ли похожий трюк для slim.dataset.Dataset?

- Мне было интересно, могу ли я просто применить некоторую функцию отображения к тензору label, например:

new_labels = tf.map_fn(lambda x: x+1, labels, dtype=tf.int32)
# labels = [1 2 1 3] --> new_labels = [2 3 2 4]. This works.

new_labels = tf.map_fn(lambda x: mapping[x], labels, dtype=tf.int32)
# I wished but this does not work!

Однако нижеприведенное не сработало, и это то, что мне нужно. Кто-нибудь может посоветовать, пожалуйста?

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, вы можете попробовать tf.contrib.lookup :

keys = list(mapping.keys())
values = [mapping[k] for k in keys]
table = tf.contrib.lookup.HashTable(
  tf.contrib.lookup.KeyValueTensorInitializer(keys, values, key_dtype=tf.int64, value_dtype=tf.int64), -1
)
new_labels = table.lookup(labels)
sess=tf.Session()
sess.run(table.init)
print(sess.run(new_labels))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...