Keras搭建神经网络sequential层输入形状不兼容报错如何解决?
问题根源
- 特征维度混淆:你打印的x_train形状
(20,)中,20是样本数量,不是特征维度。你取training_data第0列作为特征,每个样本仅含1个特征,所以之前设置input_dim=20完全不符合数据实际情况。 - 输入结构不匹配:numpy数组取单列后会得到一维数组,而Keras Dense层默认要求输入格式为
(样本数, 特征维度),因此你传入的一维数组会被框架自动补全为(None, 1)格式,这就是报错中(None,1)的来源。 - 损失函数不匹配:你当前使用的
categorical_crossentropy要求标签为one-hot编码格式,而你的y_train是一维整数标签,格式不匹配后续也会报错。
解决方案
- 调整输入数据维度,给特征数组增加最后一维:
x_train = x_train.reshape(-1, 1) x_test = x_test.reshape(-1, 1)
- 修改神经网络首层参数,匹配特征维度:
删除重复的input_shape参数,仅保留input_dim=1即可:
model.add(Dense(16, input_dim=1, activation='relu'))
- 调整损失函数适配整数标签:
将compile方法中的loss参数改为sparse_categorical_crossentropy,无需手动转换标签为one-hot格式:
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
完整可运行代码
# 数据处理,training_data和testing_data为原numpy数组 x_train = training_data[:, 0] # 训练集特征,形状为(20,) y_train = training_data[:, 1] # 训练集标签,形状为(20,) x_test = testing_data[:, 0] # 测试集特征 y_test = testing_data[:, 1] # 测试集标签 # 增加特征维度 x_train = x_train.reshape(-1, 1) x_test = x_test.reshape(-1, 1) # 搭建神经网络 from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(16, input_dim=1, activation='relu')) model.add(Dense(12, activation='relu')) model.add(Dense(12, activation='relu')) model.add(Dense(2, activation='softmax')) model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练测试 model.fit(x_train, y_train, epochs=10, batch_size=4, validation_data=(x_test, y_test))
内容的提问来源于stack exchange,提问作者user11518995
相关产品推荐
相关产品推荐

