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

Python Pytorch深度學(xué)習(xí)之核心小結(jié)

 更新時(shí)間:2021年10月28日 10:42:53   作者:柚子味的羊  
今天小編就為大家分享一篇關(guān)于Pytorch核心小結(jié)的文章,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

Pytorch的核心是兩個(gè)主要特征:

1.一個(gè)n維tensor,類似于numpy,但是tensor可以在GPU上運(yùn)行

2.搭建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)的自動(dòng)微分/求導(dǎo)機(jī)制

一、Numpy實(shí)現(xiàn)網(wǎng)絡(luò)

在總結(jié)Tensor之前,先使用numpy實(shí)現(xiàn)網(wǎng)絡(luò)。numpy提供了一個(gè)n維數(shù)組對(duì)象,以及許多用于操作這些數(shù)組的函數(shù)。

import numpy as np
# n是批量大小,d_in是輸入維度
# h是隱藏的維度,d_out是輸出維度
n,d_in,h,d_out=64,1000,100,10
# 創(chuàng)建隨機(jī)輸入和輸出數(shù)據(jù)
x=np.random.randn(n,d_in)
y=np.random.randn(n,d_out)
# 隨機(jī)初始化權(quán)重
w1=np.random.randn(d_in,h)
w2=np.random.randn(h,d_out)
learning_rate=1e-6
for i in range(500):
    #前向傳播,計(jì)算預(yù)測(cè)值y
    h=x.dot(w1)
    h_relu=np.maximum(h,0)
    y_pred=h_relu.dot(w2)
    #計(jì)算損失值
    loss=np.square(y_pred-y).sum()
    print(i,loss)
    #反向傳播,計(jì)算w1和w2對(duì)loss的梯度
    grad_y_pred=2.0*(y_pred-y)
    grad_w2=h_relu.T.dot(grad_y_pred)
    grad_h_relu=grad_y_pred.dot(w2.T)
    grad_h=grad_h_relu.copy()
    grad_h[h<0]=0
    grad_w1=x.T.dot(grad_h)
    # 更新權(quán)重
    w1-=learning_rate*grad_w1
    w2-=learning_rate*grad_w2

運(yùn)行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

可以明顯看到loss逐漸減小。

此處解釋一下上次發(fā)的一篇中,有猿友對(duì)其中的loss有疑問,其實(shí)我認(rèn)為:損失值loss只是為了檢測(cè)網(wǎng)絡(luò)的學(xué)習(xí)情況(至少我在這幾篇中的loss就只有這個(gè)功能),在前面那一篇中迭代沒有清零,所以損失值是一直增加的,如果每次迭代以后置零,效果和現(xiàn)在是一樣的。至于其中的除以2000只是為了便于顯示,可以一目了然大小的變化所以那么寫的,所以可以自己定義合理的寫法。(僅個(gè)人的理解和看法)

二、Pytorch:Tensor

Tensor 在概念上和numpy中的array相同,tensor也是一個(gè)n維數(shù)組,pytorch提供了許多函數(shù)用于操作這些張量。所有使用numpy執(zhí)行的計(jì)算都可以使用pytorch的tensor完成。與numpy不同的是pytorch可以利用GPU加速數(shù)據(jù)的計(jì)算。實(shí)現(xiàn)和numpy相同的過程

#%%tensor實(shí)現(xiàn)網(wǎng)絡(luò)
import torch
dtype=torch.float
device=torch.device('cpu')
# device=torch.device('cuda:0')#由GPU的可愛們享受吧,我不配,實(shí)驗(yàn)室沒有給我高配置的電腦
# n是批量大小,d_in是輸入維度
# h是隱藏的維度,d_out是輸出維度
n,d_in,h,d_out=64,1000,100,10
# 創(chuàng)建隨機(jī)輸入和輸出數(shù)據(jù)
x=torch.randn(n,d_in,device=device,dtype=dtype)
y=torch.randn(n,d_out,device=device,dtype=dtype)
# 隨機(jī)初始化權(quán)重
w1=torch.randn(d_in,h,device=device,dtype=dtype)
w2=torch.randn(h,d_out,device=device,dtype=dtype)
learning_rate=1e-6
for i in range(500):
    #前向傳播,計(jì)算預(yù)測(cè)值y
    h=x.mm(w1)
    h_relu=h.clamp(min=0)
    y_pred=h_relu.mm(w2)
    #計(jì)算損失值
    loss=(y_pred-y).pow(2).sum().item()
    print(i,loss)
    #反向傳播,計(jì)算w1和w2對(duì)loss的梯度
    grad_y_pred=2.0*(y_pred-y)
    grad_w2=h_relu.t().mm(grad_y_pred)
    grad_h_relu=grad_y_pred.mm(w2.T)
    grad_h=grad_h_relu.clone()
    grad_h[h<0]=0
    grad_w1=x.t().mm(grad_h)
    # 更新權(quán)重
    w1-=learning_rate*grad_w1
    w2-=learning_rate*grad_w2

運(yùn)行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

三、自動(dòng)求導(dǎo)

1、PyTorch:Tensor和auto_grad

上面兩個(gè)例子中,我們自己手動(dòng)實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)的向前和向后傳遞。手動(dòng)實(shí)現(xiàn)反向傳遞對(duì)小型雙層網(wǎng)絡(luò)來說沒有問題,但是對(duì)于大型復(fù)雜的網(wǎng)絡(luò)來說就會(huì)變得很繁瑣。

但是Pytorch中的autograd包提供了自動(dòng)微分可以用來計(jì)算神經(jīng)網(wǎng)絡(luò)中的后向傳遞。當(dāng)使用autograd時(shí)候,網(wǎng)絡(luò)前后想傳播將定義一個(gè)計(jì)算圖,圖中的節(jié)點(diǎn)是tensor,邊是函數(shù),這些函數(shù)是輸出tensor到輸入tensor的映射。這張計(jì)算圖使得在網(wǎng)絡(luò)中反向傳播時(shí)梯度的計(jì)算十分簡(jiǎn)單。

如果我們想要計(jì)算某些tensor的梯度,我們只需要在建立這個(gè)tensor時(shí)加上一句:requires_grad=True。這個(gè)tensor上的任何Pytorch的操作都將構(gòu)造一個(gè)計(jì)算圖,從而允許我們?cè)趫D中執(zhí)行反向傳播。如果這個(gè)tensor的requires_grad=True,那么反向傳播之后x.grad將會(huì)是另外一個(gè)張量,其為關(guān)于某個(gè)標(biāo)量值得梯度。

有時(shí)不需要構(gòu)建這樣的計(jì)算圖,例如:在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程中,通常不希望通過權(quán)重更新步驟進(jìn)行反向傳播。在這種情況下,可以使用torch.no_grad()上下文管理器來防止構(gòu)造計(jì)算圖——————(其實(shí)這些在之前的文章中都有詳細(xì)的寫過[我在這里],就不再贅述了)

下面例子中,使用Pytorch的Tensor和autograd來實(shí)現(xiàn)兩層的神經(jīng)網(wǎng)絡(luò),不需要再手動(dòng)執(zhí)行網(wǎng)絡(luò)的反向傳播:

#%%使用tensor和auto_grad實(shí)現(xiàn)兩層神經(jīng)網(wǎng)絡(luò)
import torch
dtype=torch.float
device=torch.device('cpu')
# device=torch.device('cuda:0')#由GPU的可愛們享受吧,我不配,實(shí)驗(yàn)室沒有給我高配置的電腦
# n是批量大小,d_in是輸入維度
# h是隱藏的維度,d_out是輸出維度
n,d_in,h,d_out=64,1000,100,10
# 創(chuàng)建隨機(jī)輸入和輸出數(shù)據(jù),requires_grad默認(rèn)設(shè)置為False,表示不需要后期微分操作
x=torch.randn(n,d_in,device=device,dtype=dtype)
y=torch.randn(n,d_out,device=device,dtype=dtype)
# 隨機(jī)初始化權(quán)重,requires_grad默認(rèn)設(shè)置為True,表示想要計(jì)算其微分
w1=torch.randn(d_in,h,device=device,dtype=dtype,requires_grad=True)
w2=torch.randn(h,d_out,device=device,dtype=dtype,requires_grad=True)
learning_rate=1e-6
for i in range(500):
    #前向傳播,使用tensor上的操作計(jì)算預(yù)測(cè)值y
    # 由于w1和w2的requirea_grad=True,涉及這兩個(gè)張量的操作可以使pytorch構(gòu)建計(jì)算圖
    #即允許自動(dòng)計(jì)算梯度,由于不需要手動(dòng)實(shí)現(xiàn)反向傳播,所以不需要保存中間值
    y_pred=x.mm(w1).clamp(min=0).mm(w2)
    
    #使用tensor中的操作計(jì)算損失值,loss.item()得到loss這個(gè)張量對(duì)應(yīng)的數(shù)值
    loss=(y_pred-y).pow(2).sum()
    print(i,loss.item())
    #使用autograd計(jì)算反向傳播,這個(gè)調(diào)用將計(jì)算loss對(duì)所有的requires_grad=True的tensor梯度,
    #調(diào)用之后,w1.grad和w2.grad將分別是loss對(duì)w1和w2的梯度張量
    loss.backward()
    #使用梯度下降更新權(quán)重,只想對(duì)w1和w2的值進(jìn)行原地改變:不想更新構(gòu)建計(jì)算圖
    #所以使用torch.no_grad()阻止pytorch更新構(gòu)建計(jì)算圖
    with torch.no_grad():
        w1-=learning_rate*w1.grad
        w2-=learning_rate*w2.grad
    #反向傳播后手動(dòng)將梯度置零
    w1.grad.zero_()
    w2.grad.zero_()

運(yùn)行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解Python中where()函數(shù)的用法

    詳解Python中where()函數(shù)的用法

    本篇文章主要介紹了詳解Python中where()函數(shù)的用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • tf.nn.conv2d與tf.layers.conv2d的區(qū)別及說明

    tf.nn.conv2d與tf.layers.conv2d的區(qū)別及說明

    這篇文章主要介紹了tf.nn.conv2d與tf.layers.conv2d的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Django中日期時(shí)間型字段進(jìn)行年月日時(shí)分秒分組統(tǒng)計(jì)

    Django中日期時(shí)間型字段進(jìn)行年月日時(shí)分秒分組統(tǒng)計(jì)

    這篇文章主要介紹了Django中日期時(shí)間型字段進(jìn)行年月日時(shí)分秒分組統(tǒng)計(jì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python numpy.interp的實(shí)例詳解

    Python numpy.interp的實(shí)例詳解

    本文主要介紹了Python numpy.interp的實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 在Django的模型中執(zhí)行原始SQL查詢的方法

    在Django的模型中執(zhí)行原始SQL查詢的方法

    這篇文章主要介紹了在Django的模型中執(zhí)行原始SQL查詢的方法,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • python創(chuàng)建exe文件的實(shí)現(xiàn)步驟

    python創(chuàng)建exe文件的實(shí)現(xiàn)步驟

    本文主要介紹了python創(chuàng)建exe文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • python繪圖庫Matplotlib的安裝

    python繪圖庫Matplotlib的安裝

    這篇文章主要介紹了python庫繪圖Matplotlib的安裝,需要的朋友可以參考下
    2014-07-07
  • PyCharm最新激活碼PyCharm2020.2.3有效

    PyCharm最新激活碼PyCharm2020.2.3有效

    這篇文章為大家提供了PyCharm最新激活碼PyCharm2020.2.3有效,需要的朋友可以參考下
    2020-11-11
  • Python中的類對(duì)象示例詳解

    Python中的類對(duì)象示例詳解

    這篇文章主要介紹了Python中類對(duì)象示例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python Tkinter GUI編程實(shí)現(xiàn)Frame切換

    Python Tkinter GUI編程實(shí)現(xiàn)Frame切換

    本文主要介紹了Python Tkinter GUI編程實(shí)現(xiàn)Frame切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論

松原市| 抚州市| 汪清县| 芷江| 阿瓦提县| 精河县| 噶尔县| 湘潭县| 藁城市| 马鞍山市| 游戏| 大安市| 新绛县| 章丘市| 体育| 韩城市| 东兰县| 芜湖市| 巫溪县| 黄陵县| 隆德县| 武安市| 永清县| 阳山县| 城固县| 格尔木市| 酒泉市| 济源市| 托里县| 隆回县| 丹阳市| 西盟| 平定县| 南雄市| 永和县| 格尔木市| 孟州市| 东莞市| 禄劝| 尉犁县| 玛多县|