1. Tensor是一个高维数组,可以通过GPU加速运算

import torch as t

x = t.Tensor(5, 3) # 构建Tensor
x = t.Tensor([[1,2],[3,4]]) # 初始化Tendor
x = t.rand(5, 3) # 使用[0,1]均匀分布随机初始化二维数组
print(x.size()) # 查看x的形状
x.size()[1], x.size(1) # 查看列的个数, 两种写法等价

torch.Size 是tuple对象的子类,因此它支持tuple的所有操作,如x.size()[0]

2. 加法的三种表示

x + y # 运算符式
t.add(x, y) #对象方法式

#函数式
result = t.Tensor(5, 3) # 预先分配空间
t.add(x, y, out=result) # 输入到result

注意,函数名后面带下划线_ 的函数会修改Tensor本身。返回新对象和原地运算。

3. Tensor与Numpy

import numpy as np
b = a.numpy() # Tensor -> Numpy
a = np.ones(5)
b = t.from_numpy(a) # Numpy->Tensor

Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个变了,另外一个也会随之改变。

4. 标量和向量

scalar = b[0] # 标量
scalar.size() #0-dim
scalar.item() # 使用scalar.item()能从中取出python对象的数值

tensor = t.tensor([2]) # 注意和scalar的区别
tensor,scalar #(tensor([ 2]), tensor(2., dtype=torch.float64))
tensor.size(),scalar.size()  #(torch.Size([1]), torch.Size([]))

old_tensor = tensor
new_tensor = t.tensor(old_tensor)
new_tensor[0] = 1111
old_tensor, new_tensor

需要注意的是,t.tensor()总是会进行数据拷贝,新tensor和原来的数据不再共享内存。所以如果你想共享内存的话,建议使用torch.from_numpy()或者tensor.detach()来新建一个tensor, 二者共享内存。

5. GPU加速

Tensor可通过.cuda 方法转为GPU的Tensor,从而享受GPU带来的加速运算。

device = t.device("cuda:0" if t.cuda.is_available() else "cpu")
x = x.to(device)
y = y.to(device)
z = x+y

此外,还可以使用tensor.cuda() 的方式将tensor拷贝到gpu上,但是这种方式不太推荐。