Лучший способ добавить «столбцы» в tf.data.dataset - PullRequest
0 голосов
/ 11 февраля 2020

Каков наилучший способ (с точки зрения времени выполнения и передового опыта) добавить столбец в набор данных TensorFlow?

Предположим, что dataset - это PrefetchDataset, сгенерированный из CSV через make_csv_dataset. Я хотел бы добавить столбец функций B на основе ранее существовавшего столбца функций A из dataset.

Я попытался адаптировать код из этого учебника ( см. функцию PackNumericFeatures()) для создания класса

class add_column(object):

    def __call__(self, features, labels):

        features['B'] = tf.map_fn(
            lambda x: len(str(x+"postfix")), features['A'])

        return features, labels

и последующего обновления набора данных с помощью

dataset = dataset.map(add_column())

Предполагая, что существующая функция A является строкой, это успешно добавляет "postfix" к каждой строке, скопированной из A. Однако, если я хочу заполнить B длиной каждого элемента в A, то замена лямбда-функции на lambda x: len(x) дает ошибку

TypeError: len is not well defined for symbolic Tensors. (TensorArrayV2Read/TensorListGetItem:0) Please call `x.shape` rather than `len(x)` for shape information.

Аналогично, базовая c функция например, lambda x: 'a' in x выдает ошибку

OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed: AutoGraph is disabled in this function. Try decorating it directly with @tf.function.

Добавление новых столбцов, обработанных из уже существующих, намного проще с pandas DataFrames. Что я делаю неправильно? Даже лучше всего использовать map_fn() вместе с такими классами, как add_column()?

...