您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python怎么利用AutoGrad實(shí)現(xiàn)自動計(jì)算函數(shù)斜率和梯度”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Python怎么利用AutoGrad實(shí)現(xiàn)自動計(jì)算函數(shù)斜率和梯度”文章能幫助大家解決問題。
AutoGrad 是一個老少皆宜的 Python 梯度計(jì)算模塊。
對于初高中生而言,它可以用來輕易計(jì)算一條曲線在任意一個點(diǎn)上的斜率。
對于大學(xué)生、機(jī)器學(xué)習(xí)愛好者而言,你只需要傳遞給它Numpy這樣的標(biāo)準(zhǔn)數(shù)據(jù)庫下編寫的損失函數(shù),它就可以自動計(jì)算損失函數(shù)的導(dǎo)數(shù)(梯度)。
我們將從普通斜率計(jì)算開始,介紹到如何只使用它來實(shí)現(xiàn)一個邏輯回歸模型。
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上
(可選1) 如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda,它內(nèi)置了Python和pip.
(可選2) 此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn)
請選擇以下任一種方式輸入命令安裝依賴:
1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-CMD)。
2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install autograd
對于初高中生同學(xué)而言,它可以用來輕松計(jì)算斜率,比如我編寫一個斜率為0.5的直線函數(shù):
# 公眾號 Python實(shí)用寶典 import autograd.numpy as np from autograd import grad def oneline(x): y = x/2 return y grad_oneline = grad(oneline) print(grad_oneline(3.0))
運(yùn)行代碼,傳入任意X值,你就能得到在該X值下的斜率:
(base) G:\push\20220724>python 1.py
0.5
由于這是一條直線,因此無論你傳什么值,都只會得到0.5的結(jié)果。
那么讓我們再試試一個tanh函數(shù):
# 公眾號 Python實(shí)用寶典 import autograd.numpy as np from autograd import grad def tanh(x): y = np.exp(-2.0 * x) return (1.0 - y) / (1.0 + y) grad_tanh = grad(tanh) print(grad_tanh(1.0))
此時你會獲得 1.0 這個 x 在tanh上的曲線的斜率:
(base) G:\push\20220724>python 1.py
0.419974341614026
我們還可以繪制出tanh的斜率的變化的曲線:
# 公眾號 Python實(shí)用寶典 import autograd.numpy as np from autograd import grad def tanh(x): y = np.exp(-2.0 * x) return (1.0 - y) / (1.0 + y) grad_tanh = grad(tanh) print(grad_tanh(1.0)) import matplotlib.pyplot as plt from autograd import elementwise_grad as egrad x = np.linspace(-7, 7, 200) plt.plot(x, tanh(x), x, egrad(tanh)(x)) plt.show()
圖中藍(lán)色的線是tanh,橙色的線是tanh的斜率,你可以非常清晰明了地看到tanh的斜率的變化。非常便于學(xué)習(xí)和理解斜率概念。
有了Autograd,我們甚至不需要借用scikit-learn就能實(shí)現(xiàn)一個回歸模型:
邏輯回歸的底層分類就是基于一個sigmoid函數(shù):
import autograd.numpy as np from autograd import grad # Build a toy dataset. inputs = np.array([[0.52, 1.12, 0.77], [0.88, -1.08, 0.15], [0.52, 0.06, -1.30], [0.74, -2.49, 1.39]]) targets = np.array([True, True, False, True]) def sigmoid(x): return 0.5 * (np.tanh(x / 2.) + 1) def logistic_predictions(weights, inputs): # Outputs probability of a label being true according to logistic model. return sigmoid(np.dot(inputs, weights))
從下面的損失函數(shù)可以看到,預(yù)測結(jié)果的好壞取決于weights的好壞,因此我們的問題轉(zhuǎn)化為怎么優(yōu)化這個 weights 變量:
def training_loss(weights): # Training loss is the negative log-likelihood of the training labels. preds = logistic_predictions(weights, inputs) label_probabilities = preds * targets + (1 - preds) * (1 - targets) return -np.sum(np.log(label_probabilities))
知道了優(yōu)化目標(biāo)后,又有Autograd這個工具,我們的問題便迎刃而解了,我們只需要讓weights往損失函數(shù)不斷下降的方向移動即可:
# Define a function that returns gradients of training loss using Autograd. training_gradient_fun = grad(training_loss) # Optimize weights using gradient descent. weights = np.array([0.0, 0.0, 0.0]) print("Initial loss:", training_loss(weights)) for i in range(100): weights -= training_gradient_fun(weights) * 0.01 print("Trained loss:", training_loss(weights))
運(yùn)行結(jié)果如下:
(base) G:\push\20220724>python regress.py
Initial loss: 2.772588722239781
Trained loss: 1.067270675787016
由此可見損失函數(shù)以及下降方式的重要性,損失函數(shù)不正確,你可能無法優(yōu)化模型。損失下降幅度太單一或者太快,你可能會錯過損失的最低點(diǎn)。
總而言之,AutoGrad是一個你用來優(yōu)化模型的一個好工具,它可以給你提供更加直觀的損失走勢,進(jìn)而讓你有更多優(yōu)化想象力。
關(guān)于“Python怎么利用AutoGrad實(shí)現(xiàn)自動計(jì)算函數(shù)斜率和梯度”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。