TensorFlow用make_csv_dataset建数据集后调用fit报输入张量错误
报错核心根因
tf.data.experimental.make_csv_dataset 默认生成的数据集批次结构为「特征字典 + 标签张量」:字典的每一个键对应CSV中的一列,值是形状为(batch_size,)的单列张量。
搭建的Sequential回归模型默认仅支持单份形状为(batch_size, 特征维度)的二维张量输入,无法直接接收字典拆解出的多列独立张量。训练时模型将519个特征列对应的独立张量识别为519份独立输入,和“仅接收1份输入”的模型初始化逻辑不匹配,直接触发输入张量数量不符的ValueError。
注:报错提示中提到收到520份输入,是TensorFlow输入校验环节将标签张量也纳入了输入统计范围,本质还是特征输出结构未和Sequential模型的输入要求对齐。
分步修正方案
1. 调整数据集管道的输出结构
在原有get_dataset函数的返回逻辑里,追加map操作把字典格式的特征拼接成统一的二维矩阵,适配Sequential模型的输入要求:
def get_dataset(file_path): ds = tf.data.experimental.make_csv_dataset( file_path, batch_size=4096, na_value="?", label_name=LABEL_COLUMN, num_epochs=1, ignore_errors=False, shuffle=False ) # 拼接字典特征为二维矩阵 def stack_batch_features(features, label): # 按列顺序拼接所有特征,得到形状 (batch_size, 519) 的张量 feature_mat = tf.stack(list(features.values()), axis=1) # 统一转成float32类型,匹配训练精度要求 feature_mat = tf.cast(feature_mat, tf.float32) # 把缺失值NaN替换为0,避免训练被打断 feature_mat = tf.nan_to_num(feature_mat) return feature_mat, label # 应用拼接逻辑,开启多线程加速数据处理 ds = ds.map(stack_batch_features, num_parallel_calls=tf.data.AUTOTUNE) # 预取数据,让数据加载和训练并行 ds = ds.prefetch(tf.data.AUTOTUNE) return ds
2. 修正模型的输入维度声明
在Sequential模型的第一层补充明确的输入形状定义,避免维度歧义:
def build_model(): model = tf.keras.Sequential([ # 明确指定输入维度为519个特征 tf.keras.layers.Dense(520, activation='relu', input_shape=(519,)), tf.keras.layers.Dense(520, activation='relu'), tf.keras.layers.Dense(520, activation='relu'), tf.keras.layers.Dense(1) ]) model.compile( loss='mean_squared_error', optimizer='adam', metrics=['mae'] ) return model
3. 大文件训练的适配优化
针对1700万行的超大CSV数据集,可根据硬件显存情况调整参数:
- 若训练时显存占用超限,可将
batch_size从4096下调至1024或2048 - 若CSV中存在非数值类型的特征列,需在
make_csv_dataset中通过column_defaults参数提前指定每列的存储类型,避免拼接时出现张量类型不匹配的错误 - 若训练过程中希望引入数据打散效果,可将
shuffle参数调整为合理的buffer size(如10000),避免模型收敛偏差
效果验证
修正完成后,可先取1个批次做结构校验:
sample_batch = next(iter(ds_treino)) print(f"特征张量形状:{sample_batch[0].shape}") print(f"标签张量形状:{sample_batch[1].shape}")
确认输出形状为(4096, 519)和(4096,)而非字典结构,即可正常运行nn_model.fit(ds_treino, epochs=10)启动训练,不会再触发输入张量数量不匹配的报错。
内容的提问来源于stack exchange,提问作者Rafael Dourado D
相关产品推荐
相关产品推荐

