Каков наилучший способ (с точки зрения времени выполнения и передового опыта) добавить столбец в набор данных 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()
?