最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch: 梯度下降及反向傳播的實(shí)例詳解

 更新時(shí)間:2019年08月20日 11:29:47   作者:yuquanle  
今天小編就為大家分享一篇PyTorch: 梯度下降及反向傳播的實(shí)例詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

線性模型

線性模型介紹

線性模型是很常見的機(jī)器學(xué)習(xí)模型,通常通過線性的公式來擬合訓(xùn)練數(shù)據(jù)集。訓(xùn)練集包括(x,y),x為特征,y為目標(biāo)。如下圖:

將真實(shí)值和預(yù)測值用于構(gòu)建損失函數(shù),訓(xùn)練的目標(biāo)是最小化這個(gè)函數(shù),從而更新w。當(dāng)損失函數(shù)達(dá)到最小時(shí)(理想上,實(shí)際情況可能會(huì)陷入局部最優(yōu)),此時(shí)的模型為最優(yōu)模型,線性模型常見的的損失函數(shù):

線性模型例子

下面通過一個(gè)例子可以觀察不同權(quán)重(w)對模型損失函數(shù)的影響。

#author:yuquanle
#data:2018.2.5
#Study of Linear Model
import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

def forward(x):
  return x * w

def loss(x, y):
  y_pred = forward(x)
  return (y_pred - y)*(y_pred - y)

w_list = []
mse_list = []

for w in np.arange(0.0, 4.1, 0.1):
  print("w=", w)
  l_sum = 0
  for x_val, y_val in zip(x_data, y_data):
    # error
    l = loss(x_val, y_val)
    l_sum += l
  print("MSE=", l_sum/3)
  w_list.append(w)
  mse_list.append(l_sum/3)

plt.plot(w_list, mse_list)
plt.ylabel("Loss")
plt.xlabel("w")
plt.show()

輸出結(jié)果:
w= 0.0
MSE= 18.6666666667
w= 0.1
MSE= 16.8466666667
w= 0.2
MSE= 15.12
w= 0.3
MSE= 13.4866666667
w= 0.4
MSE= 11.9466666667
w= 0.5
MSE= 10.5
w= 0.6
MSE= 9.14666666667

調(diào)整w,loss變化圖:

可以發(fā)現(xiàn)當(dāng)w=2時(shí),loss最小。但是現(xiàn)實(shí)中最常見的情況是,我們知道數(shù)據(jù)集,定義好損失函數(shù)之后(loss),我們并不會(huì)從0到n去設(shè)置w的值,然后求loss,最后選取使得loss最小的w作為最佳模型的參數(shù)。更常見的做法是,首先隨機(jī)初始化w的值,然后根據(jù)loss函數(shù)定義對w求梯度,然后通過w的梯度來更新w的值,這就是經(jīng)典的梯度下降法思想。

梯度下降法

梯度的本意是一個(gè)向量,表示某一函數(shù)在該點(diǎn)處的方向?qū)?shù)沿著該方向取得最大值,即函數(shù)在該點(diǎn)處沿著該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。

梯度下降是迭代法的一種,可以用于求解最小二乘問題(線性和非線性都可以)。在求解機(jī)器學(xué)習(xí)算法的模型參數(shù),即無約束優(yōu)化問題時(shí),梯度下降(Gradient Descent)是最常采用的方法之一,另一種常用的方法是最小二乘法。在求解損失函數(shù)的最小值時(shí),可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數(shù)和模型參數(shù)值。即每次更新參數(shù)w減去其梯度(通常會(huì)乘以學(xué)習(xí)率)。

#author:yuquanle
#data:2018.2.5
#Study of SGD


x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# any random value
w = 1.0

# forward pass
def forward(x):
  return x * w

def loss(x, y):
  y_pred = forward(x)
  return (y_pred - y)*(y_pred - y)

# compute gradient (loss對w求導(dǎo))
def gradient(x, y):
  return 2*x*(x*w - y)

# Before training
print("predict (before training)", 4, forward(4))

# Training loop
for epoch in range(20):
  for x, y in zip(x_data, y_data):
    grad = gradient(x, y)
    w = w - 0.01 * grad
    print("\t grad: ",x, y, grad)
    l = loss(x, y)
  print("progress:", epoch, l)

# After training
print("predict (after training)", 4, forward(4))

輸出結(jié)果:
predict (before training) 4 4.0
   grad: 1.0 2.0 -2.0
   grad: 2.0 4.0 -7.84
   grad: 3.0 6.0 -16.2288
progress: 0 4.919240100095999
   grad: 1.0 2.0 -1.478624
   grad: 2.0 4.0 -5.796206079999999
   grad: 3.0 6.0 -11.998146585599997
progress: 1 2.688769240265834
   grad: 1.0 2.0 -1.093164466688
   grad: 2.0 4.0 -4.285204709416961
   grad: 3.0 6.0 -8.87037374849311
progress: 2 1.4696334962911515
   grad: 1.0 2.0 -0.8081896081960389
   grad: 2.0 4.0 -3.1681032641284723
   grad: 3.0 6.0 -6.557973756745939
progress: 3 0.8032755585999681
   grad: 1.0 2.0 -0.59750427561463
   grad: 2.0 4.0 -2.3422167604093502
   grad: 3.0 6.0 -4.848388694047353
progress: 4 0.43905614881022015
   grad: 1.0 2.0 -0.44174208101320334
   grad: 2.0 4.0 -1.7316289575717576
   grad: 3.0 6.0 -3.584471942173538
progress: 5 0.2399802903801062
   grad: 1.0 2.0 -0.3265852213980338
   grad: 2.0 4.0 -1.2802140678802925
   grad: 3.0 6.0 -2.650043120512205
progress: 6 0.1311689630744999
   grad: 1.0 2.0 -0.241448373202223
   grad: 2.0 4.0 -0.946477622952715
   grad: 3.0 6.0 -1.9592086795121197
progress: 7 0.07169462478267678
   grad: 1.0 2.0 -0.17850567968888198
   grad: 2.0 4.0 -0.6997422643804168
   grad: 3.0 6.0 -1.4484664872674653
progress: 8 0.03918700813247573
   grad: 1.0 2.0 -0.13197139106214673
   grad: 2.0 4.0 -0.5173278529636143
   grad: 3.0 6.0 -1.0708686556346834
progress: 9 0.021418922423117836
predict (after training) 4 7.804863933862125

反向傳播

但是在定義好模型之后,使用pytorch框架不需要我們手動(dòng)的求導(dǎo),我們可以通過反向傳播將梯度往回傳播。通常有二個(gè)過程,forward和backward:

#author:yuquanle
#data:2018.2.6
#Study of BackPagation

import torch
from torch import nn
from torch.autograd import Variable

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# Any random value
w = Variable(torch.Tensor([1.0]), requires_grad=True)

# forward pass
def forward(x):
  return x*w

# Before training
print("predict (before training)", 4, forward(4))

def loss(x, y):
  y_pred = forward(x)
  return (y_pred-y)*(y_pred-y)

# Training: forward, backward and update weight
# Training loop
for epoch in range(10):
  for x, y in zip(x_data, y_data):
    l = loss(x, y)
    l.backward()
    print("\t grad:", x, y, w.grad.data[0])
    w.data = w.data - 0.01 * w.grad.data
    # Manually zero the gradients after running the backward pass and update w
    w.grad.data.zero_()
  print("progress:", epoch, l.data[0])

# After training
print("predict (after training)", 4, forward(4))

輸出結(jié)果:
predict (before training) 4 Variable containing:
 4
[torch.FloatTensor of size 1]
   grad: 1.0 2.0 -2.0
   grad: 2.0 4.0 -7.840000152587891
   grad: 3.0 6.0 -16.228801727294922
progress: 0 7.315943717956543
   grad: 1.0 2.0 -1.478623867034912
   grad: 2.0 4.0 -5.796205520629883
   grad: 3.0 6.0 -11.998146057128906
progress: 1 3.9987640380859375
   grad: 1.0 2.0 -1.0931644439697266
   grad: 2.0 4.0 -4.285204887390137
   grad: 3.0 6.0 -8.870372772216797
progress: 2 2.1856532096862793
   grad: 1.0 2.0 -0.8081896305084229
   grad: 2.0 4.0 -3.1681032180786133
   grad: 3.0 6.0 -6.557973861694336
progress: 3 1.1946394443511963
   grad: 1.0 2.0 -0.5975041389465332
   grad: 2.0 4.0 -2.3422164916992188
   grad: 3.0 6.0 -4.848389625549316
progress: 4 0.6529689431190491
   grad: 1.0 2.0 -0.4417421817779541
   grad: 2.0 4.0 -1.7316293716430664
   grad: 3.0 6.0 -3.58447265625
progress: 5 0.35690122842788696
   grad: 1.0 2.0 -0.3265852928161621
   grad: 2.0 4.0 -1.2802143096923828
   grad: 3.0 6.0 -2.650045394897461
progress: 6 0.195076122879982
   grad: 1.0 2.0 -0.24144840240478516
   grad: 2.0 4.0 -0.9464778900146484
   grad: 3.0 6.0 -1.9592113494873047
progress: 7 0.10662525147199631
   grad: 1.0 2.0 -0.17850565910339355
   grad: 2.0 4.0 -0.699742317199707
   grad: 3.0 6.0 -1.4484672546386719
progress: 8 0.0582793727517128
   grad: 1.0 2.0 -0.1319713592529297
   grad: 2.0 4.0 -0.5173273086547852
   grad: 3.0 6.0 -1.070866584777832
progress: 9 0.03185431286692619
predict (after training) 4 Variable containing:
 7.8049
[torch.FloatTensor of size 1]
Process finished with exit code 0

以上這篇PyTorch: 梯度下降及反向傳播的實(shí)例詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例

    pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例

    今天小編就為大家分享一篇pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Django REST framework 限流功能的使用

    Django REST framework 限流功能的使用

    DRF常用功能的案例基本用法都有講解,關(guān)于限流(Throttling)這個(gè)功能其實(shí)在真實(shí)的業(yè)務(wù)場景中能真正用到的其實(shí)不算多。今天說這個(gè)話題其實(shí)一方面是討論功能,另一方面也是希望換個(gè)角度去審視我們的開發(fā)過程,希望大家可以在使用DRF功能的同時(shí),也了解一下功能背后的實(shí)現(xiàn)
    2021-06-06
  • 對于Python異常處理慎用“except:pass”建議

    對于Python異常處理慎用“except:pass”建議

    這篇文章主要介紹了對于Python異常處理方法的建議,摘選自StackOverflow上的熱門問題的回答,闡述了except:pass的使用時(shí)需要注意的地方,需要的朋友可以參考下
    2015-04-04
  • Django如何使用第三方服務(wù)發(fā)送電子郵件

    Django如何使用第三方服務(wù)發(fā)送電子郵件

    這篇文章主要介紹了Django如何使用第三方服務(wù)發(fā)送電子郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python爬取京東商品信息評論存并進(jìn)MySQL

    Python爬取京東商品信息評論存并進(jìn)MySQL

    這篇文章主要介紹了Python爬取京東商品信息評論存并進(jìn)MySQL,文章通過構(gòu)建mysql數(shù)據(jù)表展開Python爬取信息存進(jìn)MySQL的內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • Python實(shí)現(xiàn)將橫表和縱表任意轉(zhuǎn)換的兩種方法

    Python實(shí)現(xiàn)將橫表和縱表任意轉(zhuǎn)換的兩種方法

    在日常做數(shù)據(jù)分析,接收到最多的表格是縱表,每個(gè)字段變量都有很長數(shù)據(jù)的長表,我們稱之為縱向數(shù)據(jù),但是,有時(shí)候,我們也會(huì)遇到橫表,對于橫向數(shù)據(jù),我們會(huì)數(shù)據(jù)轉(zhuǎn)化,將其轉(zhuǎn)化為縱向數(shù)據(jù),感興趣的同學(xué)跟著小編一起來學(xué)習(xí)吧
    2023-12-12
  • pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對照表一覽

    pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對照表一覽

    這篇文章主要介紹了pytorch常用數(shù)據(jù)類型所占字節(jié)數(shù)對照表一覽,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python讀取yaml文件后修改寫入本地實(shí)例

    python讀取yaml文件后修改寫入本地實(shí)例

    這篇文章主要介紹了python讀取yaml文件后修改寫入本地實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Django框架ORM數(shù)據(jù)庫操作實(shí)例詳解

    Django框架ORM數(shù)據(jù)庫操作實(shí)例詳解

    這篇文章主要介紹了Django框架ORM數(shù)據(jù)庫操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架ORM數(shù)據(jù)庫基本增刪改查與相關(guān)函數(shù)使用技巧,需要的朋友可以參考下
    2019-11-11
  • Gradio構(gòu)建交互式Python應(yīng)用使用示例詳解

    Gradio構(gòu)建交互式Python應(yīng)用使用示例詳解

    這篇文章主要為大家介紹了Gradio構(gòu)建交互式Python應(yīng)用使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論

衢州市| 抚远县| 明溪县| 米泉市| 简阳市| 云龙县| 昂仁县| 喀喇沁旗| 民和| 清远市| 龙山县| 沙洋县| 大城县| 昌江| 两当县| 昌江| 连平县| 双牌县| 石楼县| 丰顺县| 鲜城| 通渭县| 泾源县| 奉节县| 阜平县| 许昌市| 武隆县| 上思县| 简阳市| 桑日县| 疏附县| 耒阳市| 四会市| 遂宁市| 陆丰市| 吉林市| 鸡西市| 嘉义市| 米林县| 沂南县| 杭锦旗|