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

Keras加载Excel多工作表训练数据报错非矩形序列转张量失败如何解决

错误产生原因

tf.data.Dataset.from_tensor_slices要求输入的是可直接转换为Tensor的规整数组结构,你传入的data_list是1000个pandas DataFrame对象组成的列表,TensorFlow无法直接将DataFrame类型的序列转换为Tensor,因此触发该报错。同时你后续调用tf.py_function的逻辑也存在类型适配问题:传入py_function的参数需要是Tensor类型,但你上游传入的是未经转换的DataFrame,根本无法完成后续解析逻辑。

适配方案

建议先在pandas层完成所有数据清洗、提取的操作,将特征和标签都转换为规整的numpy数组后,再对接TensorFlow的数据集接口,调整后的代码如下:

import pandas as pd
import tensorflow as tf
import multiprocessing
import numpy as np

# 读取所有工作表
df_dict = pd.read_excel('File.xlsx', sheet_name=None)
all_X = []
all_Y = []

# 遍历每个工作表提取特征和标签
for sheet_df in df_dict.values():
    # 提取特征A/B/C,形状为(5,3)
    X = sheet_df[['A','B','C']].values
    # 提取标签E,形状为(5,)
    Y = sheet_df['E'].values
    all_X.append(X)
    all_Y.append(Y)

# 转为numpy数组,特征形状为(1000,5,3),标签形状为(1000,5),匹配你的数据集维度
all_X = np.array(all_X, dtype=np.float32)
all_Y = np.array(all_Y, dtype=np.int64)

# 构建数据集,此时输入是规整数组,不会触发转换错误
dataset = tf.data.Dataset.from_tensor_slices((all_X, all_Y))

# 后续可按需添加shuffle、batch、prefetch等操作适配训练
dataset = dataset.shuffle(100).batch(32).prefetch(tf.data.AUTOTUNE)

如果你的内存不足以一次性加载全部1000个工作表的数据,也可以用生成器方式构建数据集,避免OOM问题:

def data_generator():
    df_dict = pd.read_excel('File.xlsx', sheet_name=None)
    for sheet_df in df_dict.values():
        X = sheet_df[['A','B','C']].values.astype(np.float32)
        Y = sheet_df['E'].values.astype(np.int64)
        yield X, Y

# 从生成器构建数据集
dataset = tf.data.Dataset.from_generator(
    generator=data_generator,
    output_signature=(
        tf.TensorSpec(shape=(5,3), dtype=tf.float32),
        tf.TensorSpec(shape=(5,), dtype=tf.int64)
    )
)
dataset = dataset.shuffle(100).batch(32).prefetch(tf.data.AUTOTUNE)

调整完成后即可直接将dataset传入Keras模型的fit方法完成训练。

内容的提问来源于stack exchange,提问作者Cheung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:06:03