TF.data.dataset.map(map_func) с нетерпеливым режимом

Я использую TF 1.8 с активным режимом ожидания.

Я не могу распечатать пример внутри mapfunc. Когда я запускаю tf.executing_eagerly() из mapfunc, я получаю «False»

import os
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)

tfe = tf.contrib.eager
tf.enable_eager_execution()
x = tf.random_uniform([16,10], -10, 0, tf.int64)
print(x)
DS = tf.data.Dataset.from_tensor_slices((x))


def mapfunc(ex, con):
    import pdb; pdb.set_trace()
    new_ex = ex + con
    print(new_ex) 
    return new_ex

DS = DS.map(lambda x: mapfunc(x, [7]))
DS = DS.make_one_shot_iterator()

print(DS.next())

print(new_ex) выводит:

Tensor("add:0", shape=(10,), dtype=int64)

Вне mapfunc работает нормально. Но внутри переданный пример не имеет ни значения, ни атрибута .numpy().


person MAltakrori    schedule 25.05.2018    source источник


Ответы (1)


Преобразования tf.data на самом деле выполняются в виде графа, поэтому тело самой функции карты не выполняется с энтузиазмом. Подробнее об этом читайте в #14732.

Если вам действительно нужно активное выполнение функции карты, вы можете использовать tf.contrib.eager.py_func, что-то вроде:

DS = DS.map(lambda x: tf.contrib.eager.py_func(
  mapfunc,
  [x, tf.constant(7, dtype=tf.int64)], tf.int64)
# In TF 1.9+, the next line can be print(next(DS))
print(DS.make_one_shot_iterator().next())

Надеюсь, это поможет.

Обратите внимание, что при добавлении py_func к набору данных однопоточный интерпретатор Python будет в цикле для каждого созданного элемента.

person ash    schedule 26.05.2018
comment
Спасибо вам за помощь. Я собираюсь использовать методы оптимизации производительности, которые рекламировались на Dev Summit '18. Я использую это для текста, а также использую его для более элегантной передачи различных функций предварительной обработки. - person MAltakrori; 28.05.2018
comment
Еще одна вещь, которую я только что заметил: в списке аргументов вы можете передавать только тензоры, но не общие объекты, такие как другая функция. В моем случае я хотел бы передать токенизатор, так как я работаю с текстом, но в любом случае это все еще выполнимо в теле функции mapfunc. - person MAltakrori; 28.05.2018