1. Tensor
from __future__ import print_function
import torch as t
x = t.Tensor(5,3) #构建5*3矩阵,只是分配了空间,未初始化
x = rand(5,3) #使用[0,1]均匀分布随机初始化二维数组
print(x.size()) #查看x的形状
# Print: torch.Size([5,3])
print(x.size()[0]) #查看x的行数
# torch.Size是tuple对象的子类,因此它支持tuple的所有操作,如x.size()[0]
print(x.size(1)) #查看x的列数
# 加法计算
y = t.rand(5,3)
#第一种加法
x + y
#第二种加法
t.add(x,y)
#第三种加法 指定加法结果的输出目标为result
result = t.Tensor(5,3) #预先分配空间
t.add(x,y,out=result) #输入到result
# 加法计算
# 第一种加法,不改变y的内容
y.add(x) #普通加法
#第二种加法
y.add_(x) #inplace加法,y改变了
Tensor和numpy的数组间的互操作非常容易且快速。Tensor不支持的操作,可以先转为numpy数组处理,之后再转回Tensor。
a = t.ones(5)
# Out: tensor([1., 1., 1., 1., 1.])
b = a.numpy() # Tensor -> Numpy
# Out: array([1., 1., 1., 1., 1.], dtype=float32)
import numpy as np
a = np.ones(5)
b = t.from_numpy(a) # Numpy -> Tensor
Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗资源。这就意味着,如果其中一个变了,另外一个也会随之改变。
b.add_(1) #以_结束的函数会修改自身的值
print(a)
print(b) # Tensor和Numpy共享内存
# Out: [2. 2. 2. 2. 2.]
# Out: tensor([2., 2., 2., 2., 2.])
Tensor可通过.cuda方法转为GPU的Tensor,从而享受GPU带来的加速运算。
2.Autograd:自动微分
autograd.Variable是Autograd中的核心类,它简单封装了Tensor,并支持几乎所有Tensor操作。Tensor在被封装为Variable之后,可以调用它的.backward实现反向传播,自动计算所有梯度。Variable的数据结构如图所示。
Variable主要包含三个属性:
- data:保存variable所包含的tensor
- grad:保存data对应的梯度,grad也是variable,而不是tensor,它与data形状一致。
- grad_fn: 指向一个Function,记录tensor的操作历史,即它是什么操作的输出,用来构建计算图。如果某一个变量是由用户创建,则它为叶子节点,对应的grad_fn等于None。
Variable的构造函数需要传入tensor,同时有两个可选参数:
- requires_grad (bool)&