import torch
建立一个7*2的tensor x;建立一个7*2随机初始化的tensor y
x = torch.Tensor(7,2)
y = torch.rand(7,2)
两个tensor求和(其中第三种是将x加给y,即y = y+x):
x+y
torch.add(x,y)
y.add_(x)
得到tensor的size:
print (tensor.size())
reshape/resize tensor:
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())
out_put: torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
tensor 与 numpy array 互转(注意改变a的值时,b也会相应改变):
a = torch.ones(5,5)
b = a.numpy()
tensor 可以在GPU上进行加速:
if torch.cuda.is_available():
x = x.cuda()
y = y.cuda()
print (x + y)
***自动求导***
*autograd.Variable
是autograd
包的核心类.它包装了张量(Tensor
),支持几乎所有的张量上的操作.一旦你完成你的前向计算,可以通过.backward()
方法来自动计算所有的梯度.
你可以通过.data
属性来访问变量中的原始张量,关于这个变量的梯度被计算放入.grad
属性中
*对自动求导的实现还有一个非常重要的类,即函数(Function
).
变量(Variable
)和函数(Function
)是相互联系的,并形成一个非循环图来构建一个完整的计算过程.每个变量有一个.grad_fn
属性,它指向创建该变量的一个Function
,用户自己创建的变量除外,它的grad_fn
属性为None.
import torch
from torch.autograd import Variable
创建一个变量,并对其做运算:
x = Variable(torch.ones(2, 2), requires_grad=True)
y = x + 2
由于y是由一个运算创建的,则y有
grad_fn
*现在我们看一下自动求导的流程:
x = Variable(torch.ones(3, 5), requires_grad=True)
print(x)
y = (3*(x+2)*(x+2)+10).mean()
print(y)
y.backward()
print (x.grad) #y对x的梯度
Output:
Variable containing:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
[torch.FloatTensor of size 3x5]
Variable containing:
37
[torch.FloatTensor of size 1]
Variable containing:
1.2000 1.2000 1.2000 1.2000 1.2000
1.2000 1.2000 1.2000 1.2000 1.2000
1.2000 1.2000 1.2000 1.2000 1.2000
[torch.FloatTensor of size 3x5]
由output和x的关系得:
当变量x为3*5的全1tensor时,x.grad为一个3*5的,值为1.2的tensor