python中list函数中variables变量_如何在Python中使用变量,浅谈,Pytorch,的,Variable,方法...
Variable的基本概念
autograd.Variable 是包的核心類。它包裝了張量,并且支持幾乎所有的操作。一旦你完成了你的計算, 就可以調用
.backward() 方法
來
自動計算所有的梯度
。你還可以通過
.data 屬性
來
訪問原始的張量
,而關于
該 variable(變量)的梯度
會被累計到
.grad
上去。
通俗來講:
Variable實質上也就是可以變化的變量,在Pytorch中的Variable就是一個存放會變化值的地理位置,里面的值會不停發生變化,就像一個裝雞蛋的籃子,里邊的雞蛋數會不斷發生變化,而Pytorch中的Tensor就好比是里面的雞蛋。
也就是說,
Pytorch都是由Tensor(Tensor 是一個多維矩陣)計算的,而Tensor里面的參數都是Variable的形式。
如果用Variable計算的話,那返回的也是一個同類型的Variable。這正好就符合了反向傳播,參數更新的屬性。
備注:Tensor不能反向傳播,Variable可以反向傳播。
Variable的自動求導
Variable還有一個針對自動求導實現來說非常重要的類 - Function。
Variable 和 Function 是相互聯系的, 并且它們構建了一個非循環的圖,編碼了一個完整的計算歷史信息。 每一個 variable(變量)都有一個
.grad_fn 屬性
, 它引用了一個已經創建了 Variable 的 Function。
調用
.backward()
方法——實現Variable 的自動求導
計算變量variable的導數,可以在 Variable 上調用
.backward() 方法
。
如果變量variable是
標量的形式
(例如, 它包含一個元素數據), 則再調用
.backward() 方法
時,不必指定任何參數;
但是,
如果變量variable是
非標量的形式
例如, 它包含更多的元素數據),則再調用
.backward() 方法
時,必須去指定一個
grad_output 參數
,該參數是一個匹配
shape(形狀)
的張量。
PyTorch中Variable的使用方法
Variable一般的初始化方法,默認是不求梯度的。
import torch
from torch.autograd import Variable # 導入torch中Variable模塊
x_tensor = torch.randn(2,3) # 創建2*3的張量矩陣
#將tensor轉換成Variable
x = Variable(x_tensor)
print(x.requires_grad)
>>>
False
x = Variable(x_tensor,requires_grad=True) #Varibale 默認時不要求梯度的,如果要求梯度,需要說明
print(x)
>>>
tensor([[0.1163, 0.7213, 0.5636],
[1.1431, 0.8590, 0.7056]], requires_grad=True)
典型范例:
import torch
from torch.autograd import Variable # torch 中 Variable 模塊
tensor = torch.FloatTensor([[1,2], [3,4]]) # 創建2*2的張量矩陣
print(tensor)
>>>
tensor([[1., 2.],
[3., 4.]])
variable = Variable(tensor, requires_grad=True) # 張量轉為變量——自變量x
print(variable)
>>>
tensor([[1., 2.],
[3., 4.]], requires_grad=True)
# 定義變量y關于自變量x的函數關系
## Tensor情形
t_out = torch.mean(tensor*tensor) # 求解x^2項的均值,函數表達式:y = 1/n*sum(x1^2+...+xn^2)
print(t_out)
>>>
tensor(7.5000)
## Variable情形
v_out = torch.mean(variable*variable)
print(v_out)
>>>
tensor(7.5000, grad_fn=)
# 求解梯度
# 模擬 v_out 的誤差反向傳遞
v_out.backward() # t_out.backward()報錯,由于Tensor不能反向傳播,Variable可以反向傳播
print(variable.grad) # 初始 Variable 的梯度
>>>
tensor([[0.5000, 1.0000],
[1.5000, 2.0000]])
#### 梯度的計算原理:
# v_out = 1/4 * sum(variable*variable) 這是計算圖中的 v_out 計算步驟
# 針對于 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2
備注:
利用Variable計算時, 它在幕后一步步默默地搭建著一個龐大的系統,叫做
計算圖(computational graph)
。
計算圖的作用
:是將所有的計算步驟 (節點) 都連接起來,最后進行誤差反向傳遞的時候,一次性將所有 Variable 里面的修改幅度 (梯度) 都計算出來, 而 Tensor 就沒有這個能力。
獲取Variable里面的數據
直接
print(variable)
只會輸出
Variable
形式的數據,在很多時候是用不了的(比如想要用 plt 畫圖), 所以我們要轉換一下,將它轉變成
Tensor
形式。
Variable轉變為其他形式的方法:
variable
.data
——將Variable 形式轉變為Tensor 形式
variable
.data.numpy()
——將Variable 形式轉變為Numpy 形式
備注:variable為存放Variable 形式的變量名
典型范例:
import torch
from torch.autograd import Variable # torch 中 Variable 模塊
tensor = torch.FloatTensor([[1,2], [3,4]]) # 創建2*2的張量矩陣
variable = Variable(tensor, requires_grad=True) # 張量轉為變量——自變量x
print(variable) # Variable 形式
>>>
tensor([[1., 2.],
[3., 4.]], requires_grad=True)
print(variable.data) # tensor 形式
>>>
tensor([[1., 2.],
[3., 4.]])
print(variable.data.numpy()) # numpy 形式
>>>
[[1. 2.]
[3. 4.]]
完整教學實例
(1) 變量variable是
標量的形式
(例如, 它包含一個元素數據),調用
.backward() 方法
求梯度。
import torch
from torch.autograd import Variable
# 創建 variable(變量)
x = Variable(torch.ones(2,2), requires_grad=True)
print(x)
>>>
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
# variable(變量)的操作
y = x+2
print(y)
>>>
tensor([[3., 3.],
[3., 3.]], grad_fn=)
print(y.grad_fn) # y 由操作創建,所以它有 grad_fn 屬性
>>>
# y 的更多操作
z = y * y * 4
out = z.mean()
print("z:{}\nout:{}\n".format(z, out))
>>>
z:tensor([[36., 36.],
[36., 36.]], grad_fn=)
out:36.0
# 求梯度
out.backward()
print(x.grad) # d(out)/dx 的梯度
>>>
tensor([[10.5000, 10.5000],
[10.5000, 10.5000]])
(2) 變量variable是
非標量的形式
(例如, 它包含更多的元素數據),調用
.backward() 方法
求梯度,必須去指定一個
grad_output 參數
,該參數是一個匹配
shape(形狀)
的張量。
import torch
from torch.autograd import Variable
# 創建 variable(變量)
x = Variable(torch.rand(3), requires_grad=True)
print(x)
>>>
tensor([0.4635, 0.4550, 0.5725], requires_grad=True)
# variable(變量)的操作
y = x*2
print(y)
>>>
tensor([0.9271, 0.9100, 1.1449], grad_fn=)
while y.data.norm() < 1000:
y = y*2
print(y)
>>>
tensor([ 949.3414, 931.8120, 1172.4226], grad_fn=)
# 求梯度
gradients = torch.FloatTensor([0.1, 1.0, 0.0001]) # 設置參數gradient
y.backward( gradient=gradients )
print(x.grad)
>>>
tensor([2.0480e+02, 2.0480e+03, 2.0480e-01])
總結
以上是生活随笔為你收集整理的python中list函数中variables变量_如何在Python中使用变量,浅谈,Pytorch,的,Variable,方法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100条常用写作谚语(5)(6)(7)(
- 下一篇: jsp项目开发案例_Laravel 中使