Pytorch自動求解梯度

要理解Pytorch求解梯度,首先須要理解Pytorch當中的計算圖的概念,在計算圖當中每個Variable都表明的一個節點,每個節點就能夠表明一個神經元,咱們只有將變量放入節點當中才能夠對節點當中的變量求解梯度,假設咱們有一個矩陣:函數

1., 2., 3.
4., 5., 6.

咱們將這個矩陣(二維張量)首先在Pytorch當中初始化,而且將其放入計算圖當中的節點當中,在Pytorch當中,一個節點用Variable來表示,所以能夠編寫以下代碼:ui

import torch
from torch.autograd import Variable

# 咱們建立的是一個二維張量(即矩陣)而不是標量,所以會報錯
# 在Pytorch當中,僅容許標量對標量或者 標量對向量(或者張量)求解偏導數
x=Variable(torch.Tensor([[1., 2., 3.], [4., 5., 6.]]), requires_grad=True)

在節點當中,擁有requires_grad的參數,系統默認是False,也就是不能對其中的變量求解梯度,可是咱們須要裏面變量的梯度,所以須要將整個參數命名爲True。spa

最後咱們寫出其餘變量有關x的表達式:code

y=2*x*x+2

j=y.mean()

這樣就獲得了j的值,這是一個標量,由於mean表示的求解平均值,在Pytorch當中只可以標量對標量,或者標量對張量求解偏導數,不然就會報錯。blog

如今咱們的計算圖模型就搭建完畢了,整個模型當中只有一個節點,其餘的表示至關於神經元當中的權重,以及J表明loss函數,咱們調用Pytorch當中的反向傳播函數backward(),對x關於j的梯度進行求解,代碼以下:class

 

j.backward()

 

這樣梯度就求解完畢了,咱們打印出x關於j的梯度的值,後面的參數x.grad表示求解出來的x的梯度大小:import

print("x的梯度是:",x.grad)

輸出:require

x的梯度是: 
tensor([[0.6667, 1.3333, 2.0000], [2.6667, 3.3333, 4.0000]]

得解!變量

相關文章
相關標籤/搜索