Keras搭建一元线性回归模型训练遇维度不匹配报错如何解决
报错根因
Keras的Dense层要求输入特征张量最低为2维,标准形状格式为(样本总数, 单个样本的特征数)。你当前传入的特征X是1维张量,形状为(8,),缺少显式的特征维度,因此触发expected min_ndim=2, found ndim=1. Full shape received: (None,)报错。
你之前尝试expand_dims未解决问题,通常是两个错误操作导致:
- 维度添加位置错误:将
axis参数设为0,把X转为形状(1,8)的张量,等价于1个样本含8个特征,和单特征线性回归的场景完全不匹配 - 未接收操作返回值:TensorFlow的张量操作不是原地修改,若执行
tf.expand_dims()后没有将结果重新赋值给X,X仍保持原来的1维结构
可直接运行的修正代码
数据部分修正
核心是给特征张量在最后一维添加特征轴,调整后X形状为(8,1),对应8个样本、每个样本1个特征,符合Dense层输入要求:
import numpy as np import tensorflow as tf X = np.array([-6,-3,0,3,6,9,12,15]) y = X+10 X = tf.constant(X) y = tf.constant(y) X = tf.cast(X,"float32") y = tf.cast(y,"float32") # 核心维度修正 X = tf.expand_dims(X, axis=-1) y = tf.expand_dims(y, axis=-1)
模型部分修正
建议在第一层Dense显式指定输入形状,提前做维度校验,同时将metrics参数用列表包裹避免版本兼容问题:
model = tf.keras.models.Sequential([ # 显式声明单个样本的特征数为1 tf.keras.layers.Dense(1, input_shape=(1,)) ]) model.compile(loss = tf.keras.losses.mae, optimizer = tf.keras.optimizers.SGD(learning_rate=0.01), metrics = [tf.keras.metrics.mse] ) # 启动训练,可自行设置epoch数观察收敛效果 model.fit(X, y, epochs=200)
补充说明
训练收敛后你可以通过model.weights查看训练得到的参数,正常会接近a=1、b=10,和你预设的y = x +10线性关系一致。
内容的提问来源于stack exchange,提问作者tzahi geller
相关产品推荐
相关产品推荐

