为了账号安全,请及时绑定邮箱和手机立即绑定

Keras 神经网络为所有输入预测相同的数字

Keras 神经网络为所有输入预测相同的数字

一只甜甜圈 2022-07-19 20:31:57
我正在尝试创建一个 keras 神经网络来预测城市两点之间的道路距离。我正在使用谷歌地图来获取旅行距离,然后训练神经网络来做到这一点。import pandas as pdarr=[]for i in range(0,100):    arr.append(generateTwoPoints(55.901819,37.344735,55.589537,37.832254))    df=pd.DataFrame(arr,columns=['p1Lat','p1Lon','p2Lat','p2Lon', 'distnaceInMeters', 'timeInSeconds'])print(df)神经网络架构:from keras.optimizers import SGDsgd = SGD(lr=0.00000001)from keras.models import Sequentialfrom keras.layers import Dense, Activationmodel = Sequential()model.add(Dense(100, input_dim=4 , activation='relu'))model.add(Dense(100, activation='relu'))model.add(Dense(1,activation='sigmoid'))model.compile(loss='mse', optimizer='sgd', metrics=['mse'])然后我分集进行测试/训练Xtrain=train[['p1Lat','p1Lon','p2Lat','p2Lon']]/100Ytrain=train[['distnaceInMeters']]/100000Xtest=test[['p1Lat','p1Lon','p2Lat','p2Lon']]/100Ytest=test[['distnaceInMeters']]/100000然后我将数据拟合到模型中,但损失保持不变:history = model.fit(Xtrain, Ytrain,                    batch_size=1,                    epochs=1000,                    # We pass some validation for                    # monitoring validation loss and metrics                    # at the end of each epoch                    validation_data=(Xtest, Ytest))我稍后打印数据:prediction = model.predict(Xtest)print(prediction)print (Ytest)但是所有输入的结果都是相同的:[[0.26150784] [0.26171574] [0.2617755 ] [0.2615582 ] [0.26173398] [0.26166356] [0.26185763] [0.26188275] [0.2614446 ] [0.2616575 ] [0.26175532] [0.2615183 ] [0.2618127 ]]    distnaceInMeters2            0.135956            0.279987            0.4884916           0.3655321           0.3791022           0.4017633           0.0917339           0.2454253           0.0421655           0.3821262           0.3997264           0.2915387           0.08788我找不到问题。它是什么?我是机器学习的新手。
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

您犯了一个非常基本的错误:由于您处于回归设置中,因此您不应最后一层使用sigmoid激活(这用于二元分类情况);将最后一层更改为

model.add(Dense(1,activation='linear'))

甚至

model.add(Dense(1))

因为,根据文档,如果您不指定activation参数,则默认为linear.

其他答案中已经提供了各种其他建议,并且评论可能很有用(较低的 LR、更多层、其他优化器,例如Adam),您当然需要增加批量大小;但是sigmoid您当前用于最后一层的激活功能将无法使用。

与问题无关,但在回归设置中,您不需要将损失函数作为指标重复;这个

model.compile(loss='mse', optimizer='sgd')


查看完整回答
反对 回复 2022-07-19
?
jeck猫

TA贡献1909条经验 获得超7个赞

如果您可以在整个训练过程中发布损失和 MSE(训练和验证/测试集)的进展,那将非常有用。更好的是,如果您可以按照https://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/将其可视化并在此处发布可视化,那将是最好的。

同时,根据事实:1)您说损失没有减少(我假设在训练集上,在训练期间,根据您的编译参数)。2)您说您的测试集上的预测“准确性”很差。3)我的经验/直觉(不是经验评估)告诉我,你的两层密集模型太小了,无法捕捉数据中固有的复杂性。AKA 你的模型偏差过高https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229

您可以尝试的最快和最简单的方法是尝试向每一层添加更多层和更多节点。

但是,我应该注意到,除了两个坐标之间的距离之外,还有很多因果信息会影响行驶距离行驶时间,这可能是您的神经网络最容易提取的特征。例如,无论您是在高速公路上行驶还是在小树林、交通信号灯上行驶,无论道路是曲折还是直行……仅从数据中就可以推断出所有这些,您将需要大量数据(示例)在我的观点。如果您可以添加输入列,例如从两个点到最近的高速公路的距离,您也许可以用更少的数据进行训练

我还建议您仔细检查您是否输入了您认为输入的内容(及其形状),并且您应该使用函数sklearn的一些标准化,这可能有助于模型更快地学习并更快地收敛到更高“准确性”。

如果以及当您发布更多代码或培训历史时,我可以为您提供更多帮助(以及多少培训样本)。

编辑1:batch_size=32如果它适合您的记忆, 最好尝试将批量大小更改为更大的数字。当使用像图像这样的“信息丰富”输入时,您可以使用小批量大小(例如 1),但是当使用像 4 个浮点数(2 个坐标)这样非常“信息贫乏”的数据时,渐变将指向每个批次( with batch_size=1) 到一个几乎随机的(伪...)方向,而不一定更接近局部最小值。只有在对较大批次(例如 32 个,甚至更多)的集体损失进行梯度计算时,您才会得到一个至少近似指向局部最小值方向的梯度,并收敛到更好的结果。另外,我建议你不要手动弄乱学习率,也许改用像“adam”或“RMSProp”这样的优化器。

编辑 2:@Desertnaut 提出了一个很好的观点,我完全错过了,没有它的更正,你的代码将无法正常工作。他应得的荣誉,所以我不会在这里包括它。请参考他的回答。另外,不要忘记提高批量大小,不要“手动弄乱”你的学习率,例如“adam”会为你做这件事。


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号