2 回答

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')

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”会为你做这件事。
添加回答
举报