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

