日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第二篇:自动微分

發布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第二篇:自动微分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

🔥本文 GitHub https://github.com/kzbkzb/Python-AI已收錄

Autograd: 自動微分

這里理解起來會比較費勁,如果一遍不能理解,建議多讀幾遍反復推敲一下。

autograd 包是 PyTorch 中所有神經網絡的核心。首先讓我們簡要地介紹它,然后我們將會去訓練我們的第一個神經網絡。該 autograd 軟件包為 Tensors 上的所有操作提供自動微分。它是一個由運行定義的框架,這意味著以代碼運行方式定義你的后向傳播,并且每次迭代都可以不同。我們從 tensor 和 gradients 來舉一些例子。

Tensor(張量)

torch.Tensor 是包的核心類。如果將其屬性 .requires_grad 設置為 True,則會開始跟蹤針對 tensor 的所有操作。完成計算后,您可以調用 .backward() 來自動計算所有梯度。該張量的梯度將累積到 .grad 屬性中。

要停止 tensor 歷史記錄的跟蹤,您可以調用 .detach(),它將其與計算歷史記錄分離,并防止將來的計算被跟蹤。

要停止跟蹤歷史記錄(和使用內存),您還可以將代碼塊使用 with torch.no_grad(): 包裝起來。在評估模型時,這是特別有用,因為模型在訓練階段具有 requires_grad = True 的可訓練參數有利于調參,但在評估階段我們不需要梯度。

還有一個類對于 autograd 實現非常重要那就是 Function。Tensor 和 Function 互相連接并構建一個非循環圖,它保存整個完整的計算過程的歷史信息。每個張量都有一個 .grad_fn 屬性保存著創建了張量的 Function 的引用,(如果用戶自己創建張量,則g rad_fn 是 None )。

如果你想計算導數,你可以調用 Tensor.backward()。如果 Tensor 是標量(即它包含一個元素數據),則不需要指定任何參數 backward(),但是如果它有更多元素,則需要指定一個 gradient 參數來指定張量的形狀。

import torch

創建一個張量,設置 requires_grad=True 來跟蹤與它相關的計算

x = torch.ones(2, 2, requires_grad=True) print(x) tensor([[1., 1.],[1., 1.]], requires_grad=True)

針對張量做一個操作

y = x + 2 print(y) tensor([[3., 3.],[3., 3.]], grad_fn=<AddBackward0>)

y 作為操作的結果被創建,所以它有 grad_fn 。

print(y.grad_fn) <AddBackward0 object at 0x000001787ADEDE80>

針對 y 做更多的操作:

z = y * y * 3 out = z.mean()print(z, out) tensor([[27., 27.],[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

.requires_grad_( … ) 會改變張量的 requires_grad 標記。輸入的標記默認為 False 。

a = torch.randn(2, 2) a = ((a * 3) / (a - 1)) print(a.requires_grad)a.requires_grad_(True) print(a.requires_grad)b = (a * a).sum() print(b.grad_fn) False True <SumBackward0 object at 0x00000178757355B0>

Gradients(梯度)

我們現在后向傳播,因為out包含了一個標量,out.backward() 等同于 out.backward(torch.tensor(1.)) 。

out.backward()

打印梯度 d(out)/dx

print(x.grad) tensor([[4.5000, 4.5000],[4.5000, 4.5000]])

You should have got a matrix of 4.5. 我們把 out
Tensor 的值定為:“ooo”.
將會得到這樣的計算公式 o=14∑izio = \frac{1}{4}\sum_i z_io=41?i?zi?,
zi=3(xi+2)2z_i = 3(x_i+2)^2zi?=3(xi?+2)2 and zi∣xi=1=27z_i\bigr\rvert_{x_i=1} = 27zi??xi?=1?=27.
Therefore,
?o?xi=32(xi+2)\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)?xi??o?=23?(xi?+2), hence
?o?xi∣xi=1=92=4.5\frac{\partial o}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 4.5?xi??o??xi?=1?=29?=4.5.

還可以用 autograd 做很事情

x = torch.randn(3, requires_grad=True)y = x * 2 while y.data.norm() < 1000:y = y * 2print(y) tensor([ 786.6164, 1688.7915, 530.0458], grad_fn=<MulBackward0>) gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float) y.backward(gradients)print(x.grad) tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])

你可以通過將代碼放在 with torch.no_grad(),來停止對從跟蹤歷史中的 .requires_grad=True 的張量自動求導。

print(x.requires_grad) print((x ** 2).requires_grad)with torch.no_grad():print((x ** 2).requires_grad) True True False

總結

以上是生活随笔為你收集整理的第二篇:自动微分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。