亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PyTorch使用自動(dòng)微分模塊的方法和理解

 更新時(shí)間:2024年09月23日 15:15:54   作者:小言從不摸魚(yú)  
自動(dòng)微分模塊Autograd為張量增加了自動(dòng)求導(dǎo)功能,是神經(jīng)網(wǎng)絡(luò)訓(xùn)練不可或缺的組成部分,通過(guò)backward方法和grad屬性,實(shí)現(xiàn)梯度的計(jì)算和訪(fǎng)問(wèn),本小節(jié)主要講解了 PyTorch 中非常重要的自動(dòng)微分模塊的使用和理解,感興趣的朋友一起看看吧

自動(dòng)微分(Autograd)模塊對(duì)張量做了進(jìn)一步的封裝,具有自動(dòng)求導(dǎo)功能。自動(dòng)微分模塊是構(gòu)成神經(jīng)網(wǎng)絡(luò)訓(xùn)練的必要模塊,在神經(jīng)網(wǎng)絡(luò)的反向傳播過(guò)程中,Autograd 模塊基于正向計(jì)算的結(jié)果對(duì)當(dāng)前的參數(shù)進(jìn)行微分計(jì)算,從而實(shí)現(xiàn)網(wǎng)絡(luò)權(quán)重參數(shù)的更新。

?? 梯度基本計(jì)算

我們使用 backward 方法、grad 屬性來(lái)實(shí)現(xiàn)梯度的計(jì)算和訪(fǎng)問(wèn).

import torch

1.1 單標(biāo)量梯度的計(jì)算

   
 # y = x**2 + 20
    def test01():
    # 定義需要求導(dǎo)的張量
    # 張量的值類(lèi)型必須是浮點(diǎn)類(lèi)型
    x = torch.tensor(10, requires_grad=True, dtype=torch.float64)
    # 變量經(jīng)過(guò)中間運(yùn)算
    f = x ** 2 + 20
    # 自動(dòng)微分
    f.backward()
    # 打印 x 變量的梯度
    # backward 函數(shù)計(jì)算的梯度值會(huì)存儲(chǔ)在張量的 grad 變量中
    print(x.grad)

1.2 單向量梯度的計(jì)算

# y = x**2 + 20
def test02():
    # 定義需要求導(dǎo)張量
    x = torch.tensor([10, 20, 30, 40], requires_grad=True, dtype=torch.float64)
    # 變量經(jīng)過(guò)中間計(jì)算
    f1 = x ** 2 + 20
    # 注意:
    # 由于求導(dǎo)的結(jié)果必須是標(biāo)量
    # 而 f 的結(jié)果是: tensor([120., 420.])
    # 所以, 不能直接自動(dòng)微分
    # 需要將結(jié)果計(jì)算為標(biāo)量才能進(jìn)行計(jì)算
    f2 = f1.mean()  # f2 = 1/2 * x
    # 自動(dòng)微分
    f2.backward()
    # 打印 x 變量的梯度
    print(x.grad)

1.3 多標(biāo)量梯度計(jì)算

# y = x1 ** 2 + x2 ** 2 + x1*x2
def test03():
    # 定義需要計(jì)算梯度的張量
    x1 = torch.tensor(10, requires_grad=True, dtype=torch.float64)
    x2 = torch.tensor(20, requires_grad=True, dtype=torch.float64)
    # 經(jīng)過(guò)中間的計(jì)算
    y = x1**2 + x2**2 + x1*x2
    # 將輸出結(jié)果變?yōu)闃?biāo)量
    y = y.sum()
    # 自動(dòng)微分
    y.backward()
    # 打印兩個(gè)變量的梯度
    print(x1.grad, x2.grad)

1.4 多向量梯度計(jì)算

def test04():
    # 定義需要計(jì)算梯度的張量
    x1 = torch.tensor([10, 20], requires_grad=True, dtype=torch.float64)
    x2 = torch.tensor([30, 40], requires_grad=True, dtype=torch.float64)
    # 經(jīng)過(guò)中間的計(jì)算
    y = x1 ** 2 + x2 ** 2 + x1 * x2
    print(y)
    # 將輸出結(jié)果變?yōu)闃?biāo)量
    y = y.sum()
    # 自動(dòng)微分
    y.backward()
    # 打印兩個(gè)變量的梯度
    print(x1.grad, x2.grad)
if __name__ == '__main__':
    test04()

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

tensor(20., dtype=torch.float64)
tensor([ 5., 10., 15., 20.], dtype=torch.float64)
tensor(40., dtype=torch.float64) tensor(50., dtype=torch.float64)
tensor([1300., 2800.], dtype=torch.float64, grad_fn=<AddBackward0>)
tensor([50., 80.], dtype=torch.float64) tensor([ 70., 100.], dtype=torch.float64)

?? 控制梯度計(jì)算

我們可以通過(guò)一些方法使得在 requires_grad=True 的張量在某些時(shí)候計(jì)算不進(jìn)行梯度計(jì)算。

import torch

2.1 控制不計(jì)算梯度

def test01():
    x = torch.tensor(10, requires_grad=True, dtype=torch.float64)
    print(x.requires_grad)
    # 第一種方式: 對(duì)代碼進(jìn)行裝飾
    with torch.no_grad():
        y = x ** 2
    print(y.requires_grad)
    # 第二種方式: 對(duì)函數(shù)進(jìn)行裝飾
    @torch.no_grad()
    def my_func(x):
        return x ** 2
    print(my_func(x).requires_grad)
    # 第三種方式
    torch.set_grad_enabled(False)
    y = x ** 2
    print(y.requires_grad)

2.2 注意: 累計(jì)梯度

def test02():
    # 定義需要求導(dǎo)張量
    x = torch.tensor([10, 20, 30, 40], requires_grad=True, dtype=torch.float64)
    for _ in range(3):
        f1 = x ** 2 + 20
        f2 = f1.mean()
        # 默認(rèn)張量的 grad 屬性會(huì)累計(jì)歷史梯度值
        # 所以, 需要我們每次手動(dòng)清理上次的梯度
        # 注意: 一開(kāi)始梯度不存在, 需要做判斷
        if x.grad is not None:
            x.grad.data.zero_()
        f2.backward()
        print(x.grad)

2.3 梯度下降優(yōu)化最優(yōu)解

def test03():
    # y = x**2
    x = torch.tensor(10, requires_grad=True, dtype=torch.float64)
    for _ in range(5000):
        # 正向計(jì)算
        f = x ** 2
        # 梯度清零
        if x.grad is not None:
            x.grad.data.zero_()
        # 反向傳播計(jì)算梯度
        f.backward()
        # 更新參數(shù)
        x.data = x.data - 0.001 * x.grad
        print('%.10f' % x.data)
if __name__ == '__main__':
    test01()
    test02()
    test03()

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

True
False
False
False
tensor([ 5., 10., 15., 20.], dtype=torch.float64)
tensor([ 5., 10., 15., 20.], dtype=torch.float64)
tensor([ 5., 10., 15., 20.], dtype=torch.float64)

?? 梯度計(jì)算注意

當(dāng)對(duì)設(shè)置 requires_grad=True 的張量使用 numpy 函數(shù)進(jìn)行轉(zhuǎn)換時(shí), 會(huì)出現(xiàn)如下報(bào)錯(cuò):

Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

此時(shí), 需要先使用 detach 函數(shù)將張量進(jìn)行分離, 再使用 numpy 函數(shù).

注意: detach 之后會(huì)產(chǎn)生一個(gè)新的張量, 新的張量作為葉子結(jié)點(diǎn),并且該張量和原來(lái)的張量共享數(shù)據(jù), 但是分離后的張量不需要計(jì)算梯度。

import torch

3.1 detach 函數(shù)用法

def test01():
    x = torch.tensor([10, 20], requires_grad=True, dtype=torch.float64)
    # Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
    # print(x.numpy())  # 錯(cuò)誤
    print(x.detach().numpy())  # 正確

3.2 detach 前后張量共享內(nèi)存

def test02():
    x1 = torch.tensor([10, 20], requires_grad=True, dtype=torch.float64)
    # x2 作為葉子結(jié)點(diǎn)
    x2 = x1.detach()
    # 兩個(gè)張量的值一樣: 140421811165776 140421811165776
    print(id(x1.data), id(x2.data))
    x2.data = torch.tensor([100, 200])
    print(x1)
    print(x2)
    # x2 不會(huì)自動(dòng)計(jì)算梯度: False
    print(x2.requires_grad)
if __name__ == '__main__':
    test01()
    test02()

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

10. 20.]
140495634222288 140495634222288
tensor([10., 20.], dtype=torch.float64, requires_grad=True)
tensor([100, 200])
False

?? 小節(jié)

本小節(jié)主要講解了 PyTorch 中非常重要的自動(dòng)微分模塊的使用和理解。我們對(duì)需要計(jì)算梯度的張量需要設(shè)置 requires_grad=True 屬性,并且需要注意的是梯度是累計(jì)的,在每次計(jì)算梯度前需要先進(jìn)行梯度清零。

到此這篇關(guān)于PyTorch使用自動(dòng)微分模塊的文章就介紹到這了,更多相關(guān)PyTorch自動(dòng)微分模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python打造爬蟲(chóng)代理池過(guò)程解析

    python打造爬蟲(chóng)代理池過(guò)程解析

    這篇文章主要介紹了python打造爬蟲(chóng)代理池過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 解決Python 中JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯(cuò)誤

    解決Python 中JSONDecodeError: Expecting value:&n

    這篇文章主要介紹了解決Python 中JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯(cuò)誤問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 注意import和from import 的區(qū)別及說(shuō)明

    注意import和from import 的區(qū)別及說(shuō)明

    這篇文章主要介紹了注意import和from import 的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • python超簡(jiǎn)單解決約瑟夫環(huán)問(wèn)題

    python超簡(jiǎn)單解決約瑟夫環(huán)問(wèn)題

    這篇文章主要介紹了python超簡(jiǎn)單解決約瑟夫環(huán)問(wèn)題的方法,詳細(xì)描述的約瑟夫環(huán)問(wèn)題的描述與Python解決方法,需要的朋友可以參考下
    2015-05-05
  • Python編寫(xiě)車(chē)票訂購(gòu)系統(tǒng)?Python實(shí)現(xiàn)快遞收費(fèi)系統(tǒng)

    Python編寫(xiě)車(chē)票訂購(gòu)系統(tǒng)?Python實(shí)現(xiàn)快遞收費(fèi)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python編寫(xiě)車(chē)票訂購(gòu)系統(tǒng),Python實(shí)現(xiàn)快遞收費(fèi)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Python學(xué)習(xí)小技巧之利用字典的默認(rèn)行為

    Python學(xué)習(xí)小技巧之利用字典的默認(rèn)行為

    這篇文章主要給大家介紹了Python學(xué)習(xí)小技巧之利用字典的默認(rèn)行為的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • Python圖像濾波處理操作示例【基于ImageFilter類(lèi)】

    Python圖像濾波處理操作示例【基于ImageFilter類(lèi)】

    這篇文章主要介紹了Python圖像濾波處理操作,結(jié)合實(shí)例形式分析了Python基于ImageFilter類(lèi)實(shí)現(xiàn)的濾波處理相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • 為Python的Tornado框架配置使用Jinja2模板引擎的方法

    為Python的Tornado框架配置使用Jinja2模板引擎的方法

    Jinja2是人氣Web框架Flask中的內(nèi)置模板引擎,而且與Django的模板引擎比較類(lèi)似,這里我們就來(lái)看一下為Python的Tornado框架配置使用Jinja2模板引擎的方法
    2016-06-06
  • Python實(shí)現(xiàn)PING命令的示例代碼

    Python實(shí)現(xiàn)PING命令的示例代碼

    本文主要介紹了Python實(shí)現(xiàn)PING命令的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • pycharm 配置svn的圖文教程(手把手教你)

    pycharm 配置svn的圖文教程(手把手教你)

    這篇文章主要介紹了pycharm 配置svn的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01

最新評(píng)論