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

TensorFlow中tf.data加载CSV数据集后model.fit报错问题求助

问题原因

你的数据集返回的是以列名为键的特征字典(如{'Age': ..., 'Number': ..., 'Start': ...}),但模型的输入层是一个接收3维张量的匿名输入(自动命名为input_xx),两者的输入格式不匹配,导致TensorFlow无法找到对应输入层的数据。


解决方法

思路1:将数据集的字典特征转换为张量

把字典里的多个特征合并成一个二维张量,让模型的输入层能直接接收。

针对make_csv_dataset的代码修改

在创建数据集后添加map操作,将字典特征拼接成张量:

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

input_file='kyphosis.csv'

all_dataset = tf.data.experimental.make_csv_dataset(
    input_file, 
    batch_size=1,
    label_name="Kyphosis",
    num_epochs=1
)
# 新增:把字典特征转为张量
all_dataset = all_dataset.map(lambda features, labels: (tf.stack(list(features.values()), axis=1), labels))

model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Input(3))
model.add(tf.keras.layers.Dense(10))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))

model.compile(optimizer='adam',loss='binary_crossentropy',run_eagerly=True)
model.fit(all_dataset,epochs=10)

针对from_tensor_slices的代码修改

不要把X转成字典,直接用DataFrame的数值数组作为输入:

df=pd.read_csv('kyphosis.csv')
X=df.drop('Kyphosis',axis=1)
y=df['Kyphosis']

# 直接传入X的数值数组,而非字典
all_dataset=tf.data.Dataset.from_tensor_slices((X.values, y))
all_dataset = all_dataset.batch(1)

model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Input(3))
model.add(tf.keras.layers.Dense(10))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))

model.compile(optimizer='adam',loss='binary_crossentropy')
model.fit(all_dataset,epochs=3)

思路2:修改模型以匹配字典输入(进阶)

如果想保留字典形式的特征输入,可以用Functional API定义模型,让输入层对应每个特征的键名:

import tensorflow as tf
import pandas as pd

df=pd.read_csv('kyphosis.csv')
X=df.drop('Kyphosis',axis=1)
y=df['Kyphosis']

all_dataset=tf.data.Dataset.from_tensor_slices((X.to_dict(orient='list'), y))
all_dataset = all_dataset.batch(1)

# 为每个特征创建输入层
age_input = tf.keras.layers.Input(shape=(1,), name='Age')
num_input = tf.keras.layers.Input(shape=(1,), name='Number')
start_input = tf.keras.layers.Input(shape=(1,), name='Start')

# 合并特征
concatenated = tf.keras.layers.concatenate([age_input, num_input, start_input])
dense1 = tf.keras.layers.Dense(10)(concatenated)
output = tf.keras.layers.Dense(1, activation='sigmoid')(dense1)

model = tf.keras.Model(inputs=[age_input, num_input, start_input], outputs=output)
model.compile(optimizer='adam',loss='binary_crossentropy')
model.fit(all_dataset,epochs=3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:57:36