Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras神经网络预测所有输入的相同数量_Python_Machine Learning_Keras_Neural Network_Non Linear Regression - Fatal编程技术网

Python Keras神经网络预测所有输入的相同数量

Python Keras神经网络预测所有输入的相同数量,python,machine-learning,keras,neural-network,non-linear-regression,Python,Machine Learning,Keras,Neural Network,Non Linear Regression,我试图创建一个keras神经网络来预测城市中两点之间的道路距离。我正在使用谷歌地图获取旅行距离,然后训练神经网络来实现这一点 import pandas as pd arr=[] 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','p2Lo

我试图创建一个keras神经网络来预测城市中两点之间的道路距离。我正在使用谷歌地图获取旅行距离,然后训练神经网络来实现这一点

import pandas as pd
arr=[]
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 SGD
sgd = SGD(lr=0.00000001)
from keras.models import Sequential
from keras.layers import Dense, Activation
model = 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']]/100
Ytrain=train[['distnaceInMeters']]/100000
Xtest=test[['p1Lat','p1Lon','p2Lat','p2Lon']]/100
Ytest=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 ]]
    distnaceInMeters
2            0.13595
6            0.27998
7            0.48849
16           0.36553
21           0.37910
22           0.40176
33           0.09173
39           0.24542
53           0.04216
55           0.38212
62           0.39972
64           0.29153
87           0.08788

我找不到问题。这是怎么一回事?我是机器学习新手。

如果您可以在整个培训过程中发布损失和MSE(培训和验证/测试集)的进度,这将非常有用。更好的是,如果你能将其可视化,并在这里发布可视化,那将是最好的

同时,根据事实: 1) 您说损失没有减少(我假设在训练集上,在训练期间,基于编译参数)。 2) 您说测试集上的预测“准确性”很差。 3) 我的经验/直觉(不是经验评估)告诉我,您的两层密集模型太小,无法捕获数据中固有的复杂性。也就是说,你的模型有太高的偏见

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

但是,我应该注意到,除了两个坐标之间的距离之外,还有很多因果信息可能会影响驾驶距离和驾驶时间,这可能是神经网络最容易提取的特征。例如,无论你是在高速公路上行驶还是在路边、树丛、红绿灯上行驶,无论道路是转弯还是笔直。。。在我看来,要从这些数据中推断出所有这些,你需要大量的数据(示例)。如果您可以添加输入列,例如距离两个点最近的高速公路的距离,您可能能够使用较少的数据进行训练

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

如果您发布更多代码或培训历史记录,我可以为您提供更多帮助(以及培训样本数量)

编辑1:尝试将批次大小更改为更大的数字,如果适合内存,最好是
batch\u size=32
。在处理“信息丰富”的输入(如图像)时,可以使用较小的批大小(如1),但当使用“信息贫乏”的基准(如4个浮点(2个坐标)时,梯度会将每个批(批大小=1)指向几乎随机(伪…)的方向,而不必再接近局部最小值。只有在对更大批次的集体损失(比如32个,甚至更多)进行梯度计算时,才能得到至少大致指向局部最小值方向的梯度,并收敛到更好的结果。此外,我建议您不要手动改变学习速率,或者改为“adam”或“RMSProp”之类的优化器


编辑2:@Desertnaut提出了一个我完全没有注意到的要点,一个更正,如果没有它,您的代码将无法正常工作。他值得表扬,所以我不在此赘述。请参考他的答案。此外,别忘了提高批量大小,不要“手动”搅乱你的学习速度,例如,“adam”将为你做这件事。

你犯了一个非常基本的错误:因为你处于回归设置中,你应该不要在最后一层中使用
sigmoid
激活(用于二进制分类情况);将最后一层更改为

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

model.add(Dense(1))
因为,根据,如果不指定
激活
参数,它默认为
线性

其他答案中已经提供的各种其他建议和注释可能有用(较低的LR、更多的层、其他优化器,例如,
Adam
),您当然需要增加批处理大小;但是当前用于上一层的
sigmoid
激活功能无法发挥任何作用

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

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

就足够了。

您应该使用
train\u test\u split
来分割数据集。此外,您正在用什么形状的输入来训练数据?input\u dim=4。这是路线起点和终点的纬度和经度。为什么学习率很低?在训练期间损失减少了吗?不,损失没有减少d、 这就是问题所在。我尝试了从0.1到0.000001的所有学习速率。答案没有帮助?此函数:
model.fit(Xtrain,Ytrain,nb_epoch=1000,batch_size=1,verbose=1)
给出以下输出:
epoch 1/1000 87/87[==============================-0s 975us/step-loss:0.0174-均方误差:0.0174 epoch 2/1000 87/87===============================================================-0s 877us/步长-损耗:0.0174-均方误差:0.0174历元3/1000 1/87[]预计时间:0s-损耗:0.0135-均方误差:0.0135 87/87[=========================================================================================================================================================================================================================================================-0s 1ms/step-损耗:0.0174-均方误差:0.0174
。在这之后,MSE不会改变
历史=模型。拟合(Xtrain,Ytrain,batch_size=1,epochs=1000,validation_data=(Xtest,Ytest))
给出以下输出:
Epoch 1/1000 87/87[========================================================================-0s 2ms/步-损耗:0.0174-均方误差:0.0174-瓦尔损耗:0.0196-瓦尔均方误差:0.0196历元2/1000 87/87[===================================================]-0s 1ms/步-损耗:0.0174-均方误差:0.0174-瓦尔