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
相关产品推荐
相关产品推荐

