使用tf.data.Dataset训练线性回归模型的方法及报错解决
解答
完全可以使用tf.data.Dataset训练线性回归模型,你遇到的报错是Dataset格式不符合Keras输入要求导致的。
报错根因
当你向model.fit()传入tf.data.Dataset用于监督学习训练时,Dataset的每个输出元素必须是**(输入特征, 对应标签)**的二元元组结构。
你原代码中使用list(zip(x, y))将特征和标签合并为了单个数值序列,生成的Dataset每个元素是一个包含两个数值的一阶张量,而非拆分的特征+标签结构,Keras无法从中识别出目标标签,因此抛出缺失目标数据的错误。
正确实现步骤
- 创建Dataset时直接向
from_tensor_slices传入(特征数组, 标签数组)的元组,框架会自动按第一维度切分样本,生成符合要求的(特征,标签)对 - 为Dataset添加
.batch()方法指定批大小,默认配置下Dataset每次仅返回1个样本,训练效率极低,可按需搭配.shuffle()打乱样本顺序提升训练效果 - 简单线性回归任务无需使用带激活函数的隐藏层,单个无激活的全连接层即可完成线性关系拟合,当然保留原网络结构也可正常训练,仅会增加不必要的计算量。
修正后可运行代码
import tensorflow as tf import numpy as np x = np.linspace(1, 10, num=10**2) y = 54 * x + 33 # 正确构建适配训练的Dataset ds = tf.data.Dataset.from_tensor_slices((x, y)).shuffle(100).batch(16) # 线性回归最简模型结构 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(1, input_shape=[1,]) ]) model.compile(loss="mean_absolute_error", optimizer="adam") model.fit(ds, epochs=50)
训练完成后你可以通过model.weights查看参数,会收敛到权重约54、偏置约33,和你预设的线性公式一致。
如果需要保留你原有的多层网络结构,仅替换Dataset创建部分的代码即可解决报错,无需修改网络结构。
内容的提问来源于stack exchange,提问作者Hash Nuke
相关产品推荐
相关产品推荐

