1.1 数据操作
1.1.1 创建tensor
import torch
x = torch.empty(5,3) # 未初始化的tensor
# x = torch.rand(5,3) # 随机初始化的tensor
# x = torch.zeros(5,3,dtype=torch.long) # 5x3的long型全0tensor
# x = torch.tensor([5.5,3]) # 根据已有数据去创造tensor
print(x)
- 还可以通过现有的tensor来创建,这样会默认重用输入tensor的一些属性,例如数据类型,除非自定义数据类型
x = x.new_ones(5,3,dtype=torch.float64)
# 返回的tensor默认具有相同的torch.dtype和torch.device
# x = torch.rand_like(x,dtype=torch.float)
print(x)
- 想要知道tensor的大小,形状,存储设备可以通过以下代码
print(x.size())
print(x.shape)
print(f"Device tensor is stored on: {tensor.device}")
1.1.2 tensor操作
- 算术操作
x = torch.rand(5.3)
y = torch.rand(5.3)
print(x+y) # 加法形式一
# print(torch.add(x,y)) # 加法形式二
# 指定输出
result = torch.empty(5,3)
torch.add(x,y,out=result)
print(result)
# 把x加到y上面
y.add_(x)
print(y)
- 索引操作,索引结果与原数据共享内容,更改索引结果也会同时更改原数据
x = torch.rand(5.3)
y = x[0,:]
y += 1
print(x)
print(y)
- 更改形状,view函数也共享内存
x = torch.rand(5.3)
y = x.view(15) # view仅仅改变观察角度
z = x.view(-1,5)
print(x.size(),y.size(),z.size())
如果想返回一个新的变量,最好进行clone;item()函数可以将一个tensor转变为一个python number
x = torch.rand(5,3)
x_new = x.clone().view(15)
print(x)
print(x_new)
y = torch.rand(1)
print(y)
print(y.item())
官方文档还提供了其他功能,例如线性函数,转置,切片等操作,都在此处有介绍
1.1.3 广播机制
- 可以观察到代码运行出的结果是很有趣的,x向下复制两行,y向右复制一行,都变成了三行两列,然后对应位置相加得到计算结果
x = torch.arange(1, 3).view(1, 2) # 从1-2,一行两列
print(x)
y = torch.arange(1, 4).view(3, 1) # 从1-3,三行一列
print(y)
print(x + y)
1.1.4 tensor和numpy转换
- 通过numpy函数将tensor转换numpy,这样会共享内存
a = torch.ones(5)
b = a.numpy()
print(a,b)
a += 1
print(a,b)
b += 1
print(a,b)
- 使用from_numpy将numpy转换为tensor,这样会共享内存;使用tensor()函数则不会共享内存
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)
c = torch.tensor(a)
a += 1
print(a, c)
- tensor设备转换:gpu和cpu转换(安装gpu版本的pytorch此处有介绍)
import torch
x = torch.rand(5, 3)
if torch.cuda.is_available():
device = torch.device("cuda") # gpu设备
y = torch.ones_like(x, device=device) # 初始化时就在gpu上
x = x.to(device) # 把x放在gpu上
z = x + y
print(z)
print(z.to("cpu", torch.double))