没有numpy基础的同学可以先花10分钟看numpy 快速入门,然后只需要再花5分钟就能入门PyTorch
============================================================================================================================================================================================================================
PyTorch是一个贴近人类用户习惯的深度学习框架。与Tensorflow相比,PyTorch屏蔽了很多不必要的、特别是与计算设备相关的细节。与Tensorflow一样,PyTorch的风格也与numpy保持高度一致,因此熟悉numpy的同学上手PyTorch非常迅速。
本文适用的PyTorch版本为0.4。
- 安装
PyTorch不能通过PyPI安装,需要参考官方网站,根据你Python的平台进行选取。PyTorch支持三大主流操作系统,支持GPU加速。
2. 基本使用
刚才已经提到了,PyTorch与numpy的风格是一致的,甚至把import numpy as np改为import torch as np,你原先使用numpy的代码可以无改动的运行(当然不建议这样做)
下面是numpy 快速入门提到的一些例子,原样用PyTorch实现一遍,原来的numpy实现以注释的方式也放在一起,供对比参考
#import numpy as np
import torch
#a = np.array(1)
#b = np.array([1,2])
#c = np.array([[1.0,2.0,3.0],[3.0,4.0,5.0]])
a = torch.tensor(1)
b = torch.tensor([1,2])
c = torch.tensor([[1.0,2.0,3.0],[3.0,4.0,5.0]])
#print(a.ndim,a.shape) #0 ()
#print(b.ndim,b.shape) #1 (2,)
#print(c.ndim,c.shape) #2 (2,3)
print(a.dim(),a.shape) #0 ()
print(b.dim(),b.shape) #1 (2,)
print(c.dim(),c.shape) #2 (2,3)
#print(np.ones((2,2))) # [[1,1],[1,1]]
print(torch.ones((2,2))) # [[1,1],[1,1]]
#d = c[0]
#print(d,d.ndim,d.shape) # [1.0,2.0,3.0] 1 (3,)
#e = c[1][2]
#print(e,type(e)) # 5.0 numpy.float64
d = c[0]
print(d,d.dim(),d.shape) # [1.0,2.0,3.0] 1 (3,)
e = c[1][2]
print(e,type(e)) # 5.0 torch.Tensor
#f = np.array([[10.0,20.0,30.0],[30.0,40.0,50.0]])
#g = f + c
#print(g) #[[11.0,22.0,33.0],[33.0,44.0,55.0]]
f = torch.tensor([[10.0,20.0,30.0],[30.0,40.0,50.0]])
g = f + c
print(g) #[[11.0,22.0,33.0],[33.0,44.0,55.0]]
#h = c * 3
#print(h) #[[3.0,6.0,9.0],[9.0,12.0,15.0]]
h = c * 3
print(h) #[[3.0,6.0,9.0],[9.0,12.0,15.0]]
#i = np.abs(c-3)
#print(i) # [[2., 1., 0.],[0., 1., 2.]]
i = torch.abs(c-3)
print(i) # [[2., 1., 0.],[0., 1., 2.]]
#j = np.sin(i)
#print(j) # [[0.90929743, 0.84147098, 0. ],[0. , 0.84147098, 0.90929743]])
j = torch.sin(i)
print(j) # [[0.90929743, 0.84147098, 0. ],[0. , 0.84147098, 0.90929743]])
#k = np.array([[1],[2]])
#l = k.T
#print(k.shape) # (2, 1)
#print(l.shape) # (1, 2)
#m = np.dot(k,l)
#print(m) # [[1, 2],[2, 4]]
k = torch.tensor([[1],[2]])
l = k.t()
print(k.shape) # (2, 1)
print(l.shape) # (1, 2)
m = torch.matmul(k,l)
print(m) # [[1, 2],[2, 4]]
3. GPU加速
在GPU加速之前应该检查Cuda正常安装,并且能够被PyTorch识别
torch.cuda.is_available() #True
torch.cuda.get_device_name(0) # 'GeForce ****' 此处用来炫富
与TensorFlow不同,PyTorch的每一个tensor都绑定了它对应的计算设备,这也是PyTorch『动态特性』的体现。可以在构造tensor的时候指定其绑定的设备,也可以通过设备切换的方法得到不同设备的tensor。例如
a_cpu = torch.tensor([1,2]) # tensor([1, 2])
a_gpu = a_cpu.cuda() # tensor([1, 2], device='cuda:0')
b_gpu = torch.tensor([1,2],device='cuda:0')
b_cpu = b_gpu.cpu() #tensor([1, 2])
绑定了同一个设备的tensor可以进行计算,计算的过程就使用这些tensor所绑定的设备。不同设备的tensor不能进行计算。
c_cpu = a_cpu * b_cpu #tensor([1, 4])
c_gpu = a_gpu * b_gpu #tensor([1, 4], device='cuda:0')
c = a_cpu * b_gpu #RuntimeError
4. 与numpy的交互
Numpy的数据类型可以以复制的方式转换为PyTorch的Tensor,同时会复制其数据类型。
a_np = np.array([1,2])
a_torch = torch.tensor(a_np)
a_np[1] = 3
print(a_torch) #tensor([1, 2], dtype=torch.int32)
也可以以共享的方式使一个PyTorch.tensor和Numpy.ndarray使用同一个存储空间
a_np = np.array([1,2])
a_torch_shared = torch.from_numpy(a_np)
a_np[1] = 3
print(a_torch_shared) #tensor([1, 3], dtype=torch.int32)
b_np_shared = a_torch_shared.numpy()
a_torch_shared[1] = 5
print(a_np) #5
print(b_np_shared) #5
需要说明的是,PyTorch.tensor和Numpy.ndarray不能够直接计算。希望后续的版本PyTorch能够进行支持。