使用tfio.IODataset读取Parquet时如何将OrderedDict转为密集特征元组
解决方案
核心错误原因
你之前的写法问题出在list(features)操作取的是OrderedDict的键名(['a','b']字符串),而非对应的张量值,类型不匹配导致stack报错。
正确实现代码
方案1:转换为堆叠的密集特征张量
如果你需要最终输出是形状为(样本数, 特征数)的二维张量,用以下写法:
import tensorflow as tf import tensorflow_io as tfio import pandas as pd # 生成测试文件 pd.DataFrame({'a':[.1,.2,.3,.4], 'b':[.01,.02,.03,.04]}).to_parquet('file.parquet') # 加载parquet ds = tfio.IODataset.from_parquet('file.parquet', columns = ['a','b']) # 转换逻辑:先取OrderedDict的values,再按特征维度堆叠 def make_dense(features): # 取所有特征张量,按最后一维堆叠 return tf.stack(list(features.values()), axis=-1) # 支持两种执行顺序,按需选择 # 方式1:先转换单样本,再分批 ds = ds.map(make_dense).batch(2) # 方式2:先分批,再转换批次数据 # ds = ds.batch(2).map(make_dense) # 验证输出 for batch in ds: print(batch)
输出示例:
tf.Tensor( [[0.1 0.01] [0.2 0.02]], shape=(2, 2), dtype=float64) tf.Tensor( [[0.3 0.03] [0.4 0.04]], shape=(2, 2), dtype=float64)
方案2:转换为密集元组
如果你需要的是元组格式而非堆叠张量,修改转换函数即可:
def make_tuple(features): return tuple(features.values()) ds = ds.map(make_tuple).batch(2)
输出的每个批次为两个张量组成的元组,可直接传入模型的多输入接口。
其他尝试方案的问题说明
- 你之前测试的
lambda *items: tf.stack(items)写法不生效,是因为tf.data.Dataset.map每次传入的参数是1个OrderedDict对象,*items只会把这1个对象拆成长度为1的列表,无法拿到单独的特征张量。 - axis参数选择:如果是单样本转换,每个特征是标量,选
axis=0/axis=-1都可以;如果是批次转换,每个特征是形状为(batch_size,)的一维张量,选axis=1/axis=-1可以得到(batch_size, 特征数)的二维特征矩阵。
内容的提问来源于stack exchange,提问作者Ottpocket
相关产品推荐
相关产品推荐

