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

PyTorch使用自動微分模塊的方法和理解

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

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

?? 梯度基本計算

我們使用 backward 方法、grad 屬性來實現(xiàn)梯度的計算和訪問.

import torch

1.1 單標量梯度的計算

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

1.2 單向量梯度的計算

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

1.3 多標量梯度計算

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

1.4 多向量梯度計算

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

1.5 運行結(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)

?? 控制梯度計算

我們可以通過一些方法使得在 requires_grad=True 的張量在某些時候計算不進行梯度計算。

import torch

2.1 控制不計算梯度

def test01():
    x = torch.tensor(10, requires_grad=True, dtype=torch.float64)
    print(x.requires_grad)
    # 第一種方式: 對代碼進行裝飾
    with torch.no_grad():
        y = x ** 2
    print(y.requires_grad)
    # 第二種方式: 對函數(shù)進行裝飾
    @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 注意: 累計梯度

def test02():
    # 定義需要求導張量
    x = torch.tensor([10, 20, 30, 40], requires_grad=True, dtype=torch.float64)
    for _ in range(3):
        f1 = x ** 2 + 20
        f2 = f1.mean()
        # 默認張量的 grad 屬性會累計歷史梯度值
        # 所以, 需要我們每次手動清理上次的梯度
        # 注意: 一開始梯度不存在, 需要做判斷
        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):
        # 正向計算
        f = x ** 2
        # 梯度清零
        if x.grad is not None:
            x.grad.data.zero_()
        # 反向傳播計算梯度
        f.backward()
        # 更新參數(shù)
        x.data = x.data - 0.001 * x.grad
        print('%.10f' % x.data)
if __name__ == '__main__':
    test01()
    test02()
    test03()

2.4 運行結(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)

?? 梯度計算注意

當對設置 requires_grad=True 的張量使用 numpy 函數(shù)進行轉(zhuǎn)換時, 會出現(xiàn)如下報錯:

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

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

注意: detach 之后會產(chǎn)生一個新的張量, 新的張量作為葉子結(jié)點,并且該張量和原來的張量共享數(shù)據(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())  # 錯誤
    print(x.detach().numpy())  # 正確

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

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

3.3 運行結(jié)果??

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

?? 小節(jié)

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

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

相關(guān)文章

  • 從入門到實戰(zhàn)詳解Python實現(xiàn)辦公自動化的最全指南

    從入門到實戰(zhàn)詳解Python實現(xiàn)辦公自動化的最全指南

    Python?辦公自動化核心是用代碼替代重復的手動操作,處理?Excel/Word/PPT、郵件、文件、網(wǎng)頁、PDF?等辦公場景,下面小編就和大家詳細介紹一下吧
    2026-06-06
  • python概率計算器實例分析

    python概率計算器實例分析

    這篇文章主要介紹了python概率計算器實現(xiàn)方法,實例分析了Python實現(xiàn)概率計算的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Python numpy 提取矩陣的某一行或某一列的實例

    Python numpy 提取矩陣的某一行或某一列的實例

    下面小編就為大家分享一篇Python numpy 提取矩陣的某一行或某一列的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 解決Django一個表單對應多個按鈕的問題

    解決Django一個表單對應多個按鈕的問題

    今天小編就為大家分享一篇解決Django一個表單對應多個按鈕的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 使用OpenCV為圖像加水印的教程

    使用OpenCV為圖像加水印的教程

    通過本文學習將學會如何使用 OpenCV 為多個圖像添加水印,在 OpenCV 中調(diào)整圖像大小也很方便,對OpenCV圖像加水印相關(guān)知識感興趣的朋友一起看看吧
    2021-09-09
  • Python3中對range()逆序的解釋

    Python3中對range()逆序的解釋

    這篇文章主要介紹了Python3中對range()逆序的解釋,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python pandas dataframe如何獲取除了指定列以外的所有列

    python pandas dataframe如何獲取除了指定列以外的所有列

    這篇文章主要介紹了python pandas dataframe如何獲取除了指定列以外的所有列問題,具有很好的參考價值,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python默認參數(shù)的使用機制

    Python默認參數(shù)的使用機制

    Python中函數(shù)的默認參數(shù)是一種簡化函數(shù)調(diào)用并增強靈活性的機制,默認參數(shù)允許我們在函數(shù)定義時為某些參數(shù)指定默認值,這樣在調(diào)用函數(shù)時,如果不為這些參數(shù)傳值,它們將使用默認值,從而使得函數(shù)調(diào)用變得更加簡潔和靈活,感興趣的可以的了解一下
    2024-11-11
  • freeswitch開源通信 python模塊介紹

    freeswitch開源通信 python模塊介紹

    freeswitch支持多種語言的業(yè)務開發(fā),包括C/C++,java,python,js,lua,Golang等等。freeswitch在使用python做業(yè)務開發(fā)時,有倆種接入方式,一種是ESL接口,另一種是mod_python模塊。本文主要介紹的是fs內(nèi)部的mod_python語言支持模塊,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • Python編譯過程和執(zhí)行原理解析

    Python編譯過程和執(zhí)行原理解析

    這篇文章主要介紹了Python編譯過程和執(zhí)行原理解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07

最新評論

台南市| 富源县| 海南省| 奇台县| 正镶白旗| 枣庄市| 雷州市| 长阳| 西城区| 河曲县| 迁安市| 武功县| 德庆县| 东至县| 兴国县| 武夷山市| 武汉市| 城口县| 平阳县| 钟祥市| 潜山县| 奎屯市| 江西省| 庆元县| 加查县| 永修县| 西青区| 余庆县| 乌审旗| 神农架林区| 安徽省| 得荣县| 通州区| 开封市| 台南县| 鸡西市| 云阳县| 左贡县| 高碑店市| 阆中市| 沙雅县|