Tensor是Pytorch的一個完美組件(可以生成高維數組),但是要構建神經網絡還是遠遠不夠的,我們需要能夠計算圖的Tensor,那就是Variable。Variable是對Tensor的一個封裝,操作和Tensor是一樣的,但是每個Variable都有三個屬性,Varibale的Tensor本身的.data,對應Tensor的梯度.grad,以及這個Variable是通過什么方式得到的.grad_fn。
# 通過一下方式導入Variable
from torch.autograd import Variable
import torch
x_tensor = torch.randn(10,5)
y_tensor = torch.randn(10,5)#將tensor轉換成Variable
x = Variable(x_tensor,requires_grad=True) #Varibale 默認時不要求梯度的,如果要求梯度,需要說明
y = Variable(y_tensor,requires_grad=True)
z = torch.sum(x + y)
print(z.data)
print(z.grad_fn)z.backward()
print(x.grad)
print(y.grad)
tensor(7.0406) <SumBackward0 object at 0x000002A557C47908>tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])上面打印出了z的Tensor數值,以及通過.grad_fn得到其是通過sum這種方式得到的,通過.grad得到了x和y的梯度
#構建一個y = x^2 函數 求x = 2 的導數
import numpy as np
import torch
from torch.autograd import Variable
# 1、畫出函數圖像
import matplotlib.pyplot as plt
x = np.arange(-3,3.01,0.1)
y = x**2
plt.plot(x,y)
plt.plot(2,4,'ro')
plt.show()#定義點variable類型的x = 2
x = Variable(torch.FloatTensor([2]),requires_grad=True)
y = x ** 2
y.backward()
print(x.grad)
