[英]TypeError and ValueError in algorithm for Newton's Method to gradient descent with backtracking
我正在嘗試將牛頓法應用於帶有回溯的梯度下降算法。
import numpy as np
from scipy import optimize as opt
def newton_gd_backtracking(w,itmax,tol):
# You may set bounds of "learnrate"
max_learnrate =0.1
min_learnrate =0.001
for i in range(itmax):
grad = opt.rosen_der(w)
grad2 = (np.linalg.norm(grad))**2
hess = opt.rosen_hess(w)
# you have to decide "learnrate"
learnrate = max_learnrate
while True:
f0 = opt.rosen(w)
f1 = opt.rosen(w - learnrate * grad)
if f1 <= (f0 - (learnrate/2)*grad2):
break
else:
learnrate /=2;
if learnrate< min_learnrate:
learnrate = min_learnrate; break
# now, Newton's method
deltaw = - learnrate * np.linalg.inv(hess) * grad
w = w + deltaw
if np.linalg.norm(deltaw) < tol:
break
return w, i, learnrate
# You can call the above function, by adding main
if __name__=="__main__":
w0 = np.array([0,0])
itmax = 10000; tol = 1.e-5
w, i, learnrate = newton_gd_backtracking(w0,itmax,tol)
print('Weight: ', w)
print('Iterations: ', i)
print('Learning Rate: ', learnrate)
運行程序后,我收到以下錯誤消息:
類型錯誤:只有大小為 1 的數組可以轉換為 Python 標量
上述異常是以下異常的直接原因:
回溯(最近一次調用最后一次):
文件“c:/Users/Desfios 5/Desktop/Python/homework submit/Deyeon/GD_BT_Newton/Main_Newton_GD_Backtracking.py”,第43行,在w, i,learnrate = newton_gd_backtracking(w0,itmax,tol)
文件“c:/Users/Desfios 5/Desktop/Python/homework submit/Deyeon/GD_BT_Newton/Main_Newton_GD_Backtracking.py”,第 12 行,在 newton_gd_backtracking hess = opt.rosen_hess(w)
文件“C:\\Users\\Desfios 5\\AppData\\Roaming\\Python\\Python38\\site-packages\\scipy\\optimize\\optimize.py”,第 373 行,位於 Rosen_hess 對角線 [0] = 1200 * x[0]**2 - 400 * x 1 + 2
ValueError:使用序列設置數組元素。
當我在沒有 Hessian 的情況下運行它時,作為帶有回溯的正常梯度下降,代碼工作正常。 這是我用於帶回溯的正常梯度下降的代碼:
import numpy as np
from scipy import optimize as opt
def gd_backtracking(w,itmax,tol):
# You may set bounds of "learnrate"
max_learnrate =0.1
min_learnrate =0.001
for i in range(itmax):
grad = opt.rosen_der(w)
grad2 = (np.linalg.norm(grad))**2
# you have to decide "learnrate"
learnrate = max_learnrate
while True:
f0 = opt.rosen(w)
f1 = opt.rosen(w - learnrate * grad)
if f1 <= (f0 - (learnrate/2)*grad2):
break
else:
learnrate /=2;
if learnrate< min_learnrate:
learnrate = min_learnrate; break
# now, march
deltaw = - learnrate * grad
w = w + deltaw
if np.linalg.norm(deltaw) < tol:
break
return w, i, learnrate
# You can call the above function, by adding main
if __name__=="__main__":
w0 = np.array([0,0])
itmax = 10000; tol = 1.e-5
w, i, learnrate = gd_backtracking(w0,itmax,tol)
print('Weight: ', w)
print('Iterations: ', i)
print('Learning Rate: ', learnrate)
有什么我不知道的關於 hessian 矩陣的東西嗎? 據我了解,opt.rosen_hess 應該像 opt.rosen_der 一樣為我們生成一個一維數組。 也許我以錯誤的方式使用 opt.rose_hess。 我在這里缺少什么?
在一遍遍地工作之后,我意識到了我的錯誤。 在 newton_gd_backtesting 下,我將逆粗麻布和梯度相乘。 這些不是標量,所以我應該做點積。 一旦我使用點積,我就得到了想要的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.