pytorch是什么?
pytorch是基于Python的科学计算包,服务于以下两种场景:
- 作为NumPy的替代品,可以使用GPU的强大计算能力
- 提供强大的灵活性和高速的深度学习研究平台
Terson(张量)
Tersons与Numpy中的ndarrays类似,但是再Pytorch中Tensors可以使用GPU进行计算
import torch
# 创建一个未初始化的5*3的矩阵
x = torch.empty(5, 3)
# 创建一个随机矩阵
x = torch.rand(5, 3)
# 创建一个全0的矩阵
x = torch.zeros(5, 3, dtype = torch.long)
# 使用现有数据初始化tensor
x = torch.tensor([5.5, 3])
我们在根据现有的张量创建新的张量时,一些方法将重用输入张量的属性。例如,dtype。除非设置新的值进行覆盖。
x = x.new_ones(5, 3, dtype=torch.double)
x
>> tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
x = torch.randn_like(x, dtype=torch.float)
x
>>tensor([[ 0.5691, -2.0126, -0.4064],
[-0.0863, 0.4692, -1.1209],
[-1.1177, -0.5764, -0.5363],
[-0.4390, 0.6688, 0.0889],
[ 1.3334, -1.1600, 1.8457]])
size()方法与Numpy的shape属性返回的值相同,都表示矩阵的大小,张量也支持shape属性。
x.size()
>> torch.Size([5, 3])
注:“torch.Size”返回值tuple类型,因此它支持tuple类型的所有操作。
torch支持多种运算方式
加法
- x+y
- torch.add(x, y)
- torch.add(x, y, out=result)
result为提供输出tensor的参数,需提前定义
注:任何以""结尾的操作都会用结果替换原变量。例如:"x.copy(y)",“x.t_()”,都会改变"x"。
同样的也可以使用与Numpy索引方式相同的操作来进行对张量的操作。
x[:, 1]
torch.view可以改变张量的维度,与Numpy的reshape类似
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # -1表示通过其他维度的值来计算此维度
x.size()
y.size()
z.size()
>> torch.Size([4, 4])
>> torch.Size([16])
>> torch.Size([2, 8])
如果张量中只有一个元素时,可以使用.item()来得到Python数据类型的值。
Numpy转换
torch的张量和Numpy的数组可以相互进行转换,但是他们将共享数据的内存,也就是说在转换后并不会复制出一份新的数据,改变其中的一份数据将改变另一份。
torch转换为numpy
a = torch.ones(5)
b = a.numpy()
a
b
>> tensor([1., 1., 1., 1., 1.])
>> [1., 1., 1., 1., 1.]
a.add_(1)
a
b
>> tensor([2., 2., 2., 2., 2.])
>> [2., 2., 2., 2., 2.]
numpy转换为torch,使用from_numpy自动转化
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
a
b
>> [2., 2., 2., 2., 2.]
>> tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
注:所有的Tensor类型默认都是基于CPU,CharTensor类型不支持NumPy的转换。
CUDA张量
使用.to方法可以将Tensor在GPU和CPU中来回移动
# is_available 函数判断是否有cuda可以使用
# torch.device将张量移动到指定的设备中
if torch.cude.is_available():
device = torch.device("cuda")
y = torch.ones_like(x, device=device)
x = x.to(device)
z = x + y
print(z)
print(z.to("cpu", torch.double))
鸣谢:感谢github作者zergtant整理的开源书籍pytorch handbook github:https://github.com/zergtant/pytorch-handbook