如何在Keras中实现神经元数量递增的循环训练并正确保存结果?
问题分析与修正方案
核心问题拆解
train_model函数内部的循环完全错误:你本意是用传入的neurons参数定义三层网络的神经元数,但函数里写了for i in range(1,66),每次调用都会构建一堆从1到65神经元的层,完全忽略了外部传入的neurons值,这直接导致外层循环失去意义,最终只得到最大神经元数的模型。- 变量名错误:原代码里用
dataset.add(),但应该是model.add(),否则会抛出未定义dataset的错误。 - 任务指标与损失函数不匹配:你需要记录MSE指标,但原代码用了分类任务的
categorical_crossentropy损失和accuracy指标,不符合回归任务的需求。 - 外层循环范围偏差:
range(1,65)只会迭代1到64,若要包含65需改为range(1,66)。
修正后的完整代码
from keras.models import Sequential from keras.layers import Dense import pandas as pd def train_model(neurons): # 每次训练都重新构建新模型 model = Sequential() # 第一层隐藏层:neurons个神经元,tanh激活 model.add(Dense(units=neurons, activation="tanh")) # 第二层隐藏层:neurons个神经元,tanh激活 model.add(Dense(units=neurons, activation="tanh")) # 输出层:1个神经元(回归任务) model.add(Dense(units=1)) # 回归任务用mse损失,同时监控mse指标 model.compile(loss='mse', optimizer='adam', metrics=['mse']) model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=0) # verbose=0关闭训练日志输出,可选 return model results = [] # 迭代1到65的神经元数量(包含65) for neurons in range(1, 66): model = train_model(neurons) # 获取测试集的MSE指标(evaluate返回[loss, mse]) test_mse = model.evaluate(X_test, y_test, verbose=0)[1] results.append((neurons, test_mse)) # 保存结果到Excel df = pd.DataFrame(results, columns=['Neurons', 'MSE']) df.to_excel('neurons_mse_results.xlsx', index=False) print("结果已保存到 neurons_mse_results.xlsx")
关键修正说明
- 移除
train_model内部的无效循环,直接用传入的neurons参数定义两层隐藏层的神经元数量,严格对应三层网络结构。 - 修正
model.add()的变量名错误,确保模型构建正常。 - 将损失函数改为
mse,指标也设置为mse,匹配你需要记录MSE的需求。 - 添加
verbose=0关闭训练和评估时的日志输出,避免控制台信息冗余(可根据需要改为1或2)。 - 调整外层循环范围到
range(1,66),确保包含65个神经元的情况。 - 结果DataFrame的列名改为
MSE,与实际保存的指标对应。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

