使用from_tensor_slices喂数据报错:Dense层输入维度不匹配
问题原因与解决方法
原因
直接把train_set和labels传给model.fit时,TensorFlow会自动将形状为(60,3)的train_set视为批量数据,每个批量的输入维度是(batch_size, 3),刚好匹配Dense层要求的至少2维输入(批量维度+特征维度)。
而用tf.data.Dataset.from_tensor_slices构建的数据集,每个元素是单个样本:特征是形状(3,)的一维数组,标签是单个数值。当model.fit处理这个数据集时,会直接把单个样本的特征输入模型,此时输入维度是(3,),不符合Dense层min_ndim=2的要求,因此报错。
解决方法
有两种简单的修改方式:
方式1:给数据集添加批量维度
在构建数据集后调用batch()方法,让每个批次包含多个样本,这样输入到模型的就是带批量维度的数组:
dataset = tf.data.Dataset.from_tensor_slices((train_set, labels)).batch(32) # 32为批量大小,可按需调整 model.fit(dataset)
方式2:明确模型输入层的形状
如果需要处理单个样本(比如后续单样本预测场景),可以在模型的第一层指定input_shape=(3,),让模型接受一维特征输入:
model = tf.keras.Sequential([ tf.keras.layers.Dense(10, activation='relu', input_shape=(3,)), # 其他网络层... ]) model.fit(dataset)
两种方法都能解决输入维度不匹配的问题,推荐第一种,因为批量训练是更常见的场景,训练效率也更高。
内容的提问来源于stack exchange,提问作者user3486991
相关产品推荐
相关产品推荐

