Regression
Keras 中的簡單線性回歸
在查看了這個問題:嘗試使用 Keras 模擬線性回歸之後,我嘗試推出自己的示例,僅用於學習目的並培養我的直覺。
我下載了一個簡單的數據集並使用一列來預測另一列。數據如下所示:
現在我剛剛創建了一個帶有單個單節點線性層的簡單 keras 模型,並繼續在其上運行梯度下降:
from keras.layers import Input, Dense from keras.models import Model inputs = Input(shape=(1,)) preds = Dense(1,activation='linear')(inputs) model = Model(inputs=inputs,outputs=preds) sgd=keras.optimizers.SGD() model.compile(optimizer=sgd ,loss='mse',metrics=['mse']) model.fit(x,y, batch_size=1, epochs=30, shuffle=False)
像這樣運行模型會讓我
nan
在每個時期都有損失。所以我決定開始嘗試一些東西,如果我使用一個非常小的學習率
sgd=keras.optimizers.SGD(lr=0.0000001)
,我只會得到一個像樣的模型:現在為什麼會這樣?對於我面臨的每個問題,我是否必須像這樣手動調整學習率?我在這裡做錯了嗎?這應該是最簡單的問題,對吧?
謝謝!
這可能是因為沒有進行標準化。神經網絡對非標準化數據非常敏感。
一些直覺:當我們試圖找到我們的多維全局最小值時(如在隨機梯度下降模型中),在每次迭代中,每個特徵都會以某種力(向量的長度)“拉”到它的維度(向量方向)中)。當數據未標準化時,A 列值的一小步可能會導致 B 列發生巨大變化。
您的代碼使用您非常低的學習率來解決這個問題,這“標準化”了每一列的效果,儘管導致學習過程延遲,需要更多的時期才能完成。
添加此規範化代碼:
from sklearn.preprocessing import StandardScaler sc = StandardScaler() x = sc.fit_transform(x) y = sc.fit_transform(y)
並且只需刪除學習率參數 (lr) - 讓它為您明智地選擇一個自動值。我現在得到了和你一樣想要的圖表:)