向TensorFlow数据集添加列的最佳方法是什么(就运行时和最佳实践而言(?
假设dataset
是通过make_csv_dataset
从 CSV 生成的PrefetchDataset
。我想添加一个基于dataset
的预先存在的功能列A
B
功能列。
我尝试调整本教程中的代码(参见函数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
复制的每个字符串。但是,如果我想用A
中每个元素的长度填充B
,那么用lambda x: len(x)
替换 lambda 函数会给出错误
TypeError: len is not well defined for symbolic Tensors. (TensorArrayV2Read/TensorListGetItem:0) Please call `x.shape` rather than `len(x)` for shape information.
同样,诸如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 数据帧添加从预先存在的列处理的新列要容易得多。我做错了什么?将map_fn()
与add_column()
等类一起使用甚至是最佳实践吗?
y_dataset = x_dataset.map(fn1(
您可以根据需要定义 fn1
@tf.function
def fn1(x):
##use x to derive additional columns u want. Set the shape as well
y = {}
y.update(x)
y['new1'] = new1
y['new2'] = new2
return y