调用model.fit时Keras模型出现ValueError,求解决方法
解决Keras中
model.fit触发的ValueError问题 问题复现
运行以下代码时调用model.fit()触发ValueError:
import numpy as np import tensorflow as tf X=np.array([-7.0,-4.0,-1.0,2.0,5.0,8.0,11.0,14.0]) y=np.array([3.0,6.0,9.0,12.0,15.0,18.0,21.0,24.0]) X=tf.cast(tf.constant(X), dtype=tf.float32) y=tf.cast(tf.constant(y), dtype=tf.float32) tf.random.set_seed(42) model = tf.keras.Sequential([ tf.keras.layers.Dense(1) ]) model.compile(loss=tf.keras.losses.mae, optimizer=tf.keras.optimizers.SGD(), metrics=["mae"]) model.fit(X, y, epochs=5)
报错片段:
ValueError Traceback (most recent call last) in 10 metrics=["mae"]) 11 # 3. Fit the model ---> 12 model.fit(X, y, epochs=5) 1 frames /usr/local/lib/python3.8/dist-packages/keras/engine/training.py in tf__train_function(iterator) 13 try: 14 do_return = True
问题原因
Keras的Dense层默认期望输入是二维张量,格式为(样本数量, 特征数量)。你的X是一维张量(形状为(8,)),无法满足Dense层的输入维度要求,导致训练时维度不匹配报错。
解决方法
给X增加一个维度,将其从一维转为二维,两种常用实现方式:
方式1:使用
tf.expand_dims
修改X的定义部分,在最后一个维度添加新轴:X = tf.expand_dims(tf.cast(tf.constant(X), dtype=tf.float32), axis=-1)或单独执行维度扩展:
X = tf.expand_dims(X, axis=-1)方式2:使用
numpy.reshape
通过reshape指定特征数为1,自动计算样本数量:X = tf.cast(tf.constant(X.reshape(-1, 1)), dtype=tf.float32)
修改后的完整可运行代码:
import numpy as np import tensorflow as tf X=np.array([-7.0,-4.0,-1.0,2.0,5.0,8.0,11.0,14.0]) y=np.array([3.0,6.0,9.0,12.0,15.0,18.0,21.0,24.0]) # 给X增加维度,转为(8,1)的二维张量 X=tf.expand_dims(tf.cast(tf.constant(X), dtype=tf.float32), axis=-1) y=tf.cast(tf.constant(y), dtype=tf.float32) tf.random.set_seed(42) model = tf.keras.Sequential([ tf.keras.layers.Dense(1) ]) model.compile(loss=tf.keras.losses.mae, optimizer=tf.keras.optimizers.SGD(), metrics=["mae"]) model.fit(X, y, epochs=5)
修改后X的形状变为(8,1),符合Dense层的输入要求,即可正常启动训练。
内容的提问来源于stack exchange,提问作者Victor Ebere
相关产品推荐
相关产品推荐

