Keras Dense层输入维度不兼容报错:期望min_ndim=2,实际ndim=1
问题:Dense层输入维度不兼容错误
编译程序时触发如下错误:
ValueError: Input 0 of layer "dense_9" is incompatible with the layer: expected min_ndim=2, found ndim=1. Full shape received: (None,)
程序代码如下:
data_array = np.array([2.5, 3, 3.5, 4, 4.5]) target_array = np.array([2, 2.5, 3, 3.5, 4]) array1 = {'data': data_array, 'target': target_array} class array1: data = array1["data"] target = array1["target"] obiect = array1() X_train, X_vaild, y_train, y_vaild = train_test_split( obiect.data, obiect.target) model = keras.models.Sequential([ keras.layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), ]) model.compile(loss=tf.keras.losses.MeanSquaredError(), optimizer="sgd") history = model.fit(X_train, y_train, epochs=190, validation_data=(X_vaild, y_vaild))
注:当data_array为多值列表时程序可正常运行,但传入单个值时会触发上述错误。
解决方案
核心原因
Keras的Dense层要求输入必须是至少2维的张量,格式为(样本数量, 特征数量)。当传入单个值时,拆分后的X_train会变成1维数组(形状为(None,)),不符合层的输入维度要求,因此报错。
具体修复方法
方法1:给输入数据增加维度
在拆分数据集后,通过np.expand_dims或索引语法给输入数组新增一个维度,将1维数组转为2维列向量:
# 拆分数据集后添加这两行 X_train = np.expand_dims(X_train, axis=1) X_vaild = np.expand_dims(X_vaild, axis=1) # 或者用更简洁的写法 X_train = X_train[..., np.newaxis] X_vaild = X_vaild[..., np.newaxis]
方法2:直接指定Dense层的输入形状
如果不想修改数据结构,可以直接在Dense层中明确指定input_shape=(1,),告诉模型输入是单特征的2维数据:
model = keras.models.Sequential([ keras.layers.Dense(30, activation='relu', input_shape=(1,)), ])
额外建议:避免命名冲突
原代码中字典和类都使用array1作为名称,容易引发变量混淆,建议修改命名:
data_dict = {'data': data_array, 'target': target_array} class Dataset: data = data_dict["data"] target = data_dict["target"] obiect = Dataset()
内容的提问来源于stack exchange,提问作者karoloso
相关产品推荐
相关产品推荐

