You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:24:04