![](/img/trans.png)
[英]Why does keras neural network predicts the same number for all different images?
[英]Keras neural network predicts the same number for all inputs
我正在嘗試創建一個 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
我找不到問題所在。 它是什么? 我是機器學習的新手。
你正在做一個很基本的錯誤:因為你是一個回歸的設置,你不應該使用sigmoid
激活你的最后一層(這是用於二元分類的情況下); 將最后一層更改為
model.add(Dense(1,activation='linear'))
甚至
model.add(Dense(1))
因為,根據docs ,如果您沒有指定activation
參數,它默認為linear
。
其他答案中已經提供的各種其他建議和評論可能有用(低 LR,更多層,其他優化器,例如Adam
),並且您當然需要增加批量大小; 但是對於您當前用於最后一層的sigmoid
激活函數,沒有任何作用。
與問題無關,但在回歸設置中,您不需要將損失函數作為指標重復; 這個
model.compile(loss='mse', optimizer='sgd')
就足夠了。
如果您可以在整個訓練過程中發布損失和 MSE(訓練集和驗證/測試集)的進展,這將非常有用。 更好的是,如果您可以按照https://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/將其可視化並在此處發布可視化,那將是最好的。
同時,基於事實:1)您說損失沒有減少(我假設在訓練集上,在訓練期間,基於您的編譯參數)。 2)您說您的測試集上的預測“准確性”很差。 3)我的經驗/直覺(不是經驗評估)告訴我,您的兩層密集模型有點太小,無法捕捉數據中固有的復雜性。 又名您的模型存在過高的偏差https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229
您可以嘗試的最快和最簡單的方法是嘗試向每一層添加更多層和更多節點。
但是,我應該注意到,除了兩個坐標之間的距離之外,還有很多因果信息會影響行駛距離和行駛時間,這可能是您的神經網絡最容易提取的特征。 例如,無論您是在高速公路上行駛還是在兩側的小樹上行駛,交通燈,道路是曲折還是直行……僅從這些數據中推斷出所有這些,您將需要大量數據(示例)在我的觀點。 如果您可以添加輸入列,例如距離兩個點最近的高速公路的距離,您可能能夠用更少的數據進行訓練
我還建議您仔細檢查您是否將您認為正在喂食的東西(及其形狀)作為輸入喂食,此外,您應該使用函數sklearn 的一些標准化,這可能有助於模型更快地學習並更快地收斂到更高的“准確性”。
如果您發布更多代碼或培訓歷史記錄,我可以為您提供更多幫助(以及多少培訓樣本)。
編輯 1:如果它適合您的記憶,請嘗試將批量大小更改為更大的數字,最好是batch_size=32
。 在處理像圖像這樣的“信息豐富”輸入時,您可以使用小批量(例如 1),但是當使用非常“信息貧乏”的數據(如 4 個浮點數(2 個坐標))時,漸變將指向每個批次(使用batch_size=1
) 到幾乎隨機的(偽...)方向,而不必更接近局部最小值。 只有在對較大批次(例如 32 甚至更多)的集體損失進行梯度計算時,您才會得到至少近似指向局部最小值方向的梯度並收斂到更好的結果。 另外,我建議您不要手動調整學習率,可能會更改為“adam”或“RMSProp”之類的優化器。
編輯 2 :@Desertnaut 提出了我完全錯過的一個很好的觀點,如果沒有更正,您的代碼將無法正常工作。 他值得稱贊,所以我不會在這里包括它。 請參考他的回答。 另外,不要忘記提高您的批量大小,不要“手動弄亂”您的學習率,例如“adam”會為您做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.