本系列介绍了入门PyTorch所需要了解的内容。本文主要参考文献:《Deep Learning with PyTorch: A 60 Minute Blitz》(PyTorch深度学习60分钟快速入门),更新于2019.06.06。
PyTorch是一个基于Python的科学计算包(scientific computing package),主要实现两个目的:
入门PyTorch首先要将其安装在电脑上。打开官网,在下图中依次点击选择适合电脑环境的配置。
第一个PyTorch Build
选项,如果没有特殊需要,建议选择Stable。第二行为系统,根据电脑系统选择即可。
第三行,如果没有特殊需要,安装包建议通过Conda或者Pip安装,比较稳定。
第四行,选择编程语言(Python或C++)。
第四行,如果有GPU的话,选择GPU上安装的CUDA版本;如果没有安装CUDA,选择None。
都选好以后,复制最下面一行Run this Command
后面显示的安装命令,在终端运行即可。
Tensors与NumPy中的ndarrays很相似,区别在于Tensors可以支持GPU上的加速计算。
本节给出了定义Tensor中的各类命令。首先打开终端,输入Python
进入Python界面
输入命令:
import torch
x = torch.empty(5,3) #定义一个未初始化的tensor
print(x) #查看tensor
输入命令:
x = torch.ran(5,3)
print(x)
输入命令:
x = torch.zeros(5,3,dtype=torch.long)
print(x)
输入命令:
x = torch.tensor([5.5,3])
print(x)
或者也可以基于现存的tensor创建新的tensor。
除非用户提供了新的值,否则这些方法会复用输入tensor的性质,比如dtype
。
输入命令:
x = x.new_ones(5,3,dtype=torch.double # new_*方法获得尺寸
print(x)
x = torch.randn_like(x,dtype=torch.float) #替换dtype
print(x) # 结果具有相同的尺寸
终端结果:
注:这里用到了new_ones
和randn_like
两个函数,torch中还存在两个与它们很相似的函数,分别为torch.ones
和torch.randn
。对应函数之间的功能其实是相同的,只不过前两个可以从已有tensor的基础上快速生成与之属性相同的新tensor;而后两个函数则是直接定义一个新的tensor。
输入命令:
print(x,size())
终端结果:
需要注意的是,这里返回的torch.Size
其实是一个tuple
类型的数据,因此支持所有tuple
操作。
操作语法有很多,这里以求“相加”为例。
输入命令:
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)
输入命令:
y.add_(x) #将x加到y上
print(y)
注: 原位改变tensor的操作都会在词尾加一个_
,比如x.copy_(y)
和x.t_()
,都会改变x
的值。其中,.t()
操作的作用是,将tensor重新排布,使其行数最小。
也可以用类似NumPy的标准下标实现所有附加功能。输入命令:
print(x[:,1])
终端结果:
可以用torch.view
实现大小和形状的调整(但元素总数需要前后一致)。输入命令:
x = torch.randn(4,4) #与torch.rand的区别是,torch.rand服从均匀分布,torch.randn服从正态分布
y = x.view(16)
z = x.view(-1,8) #尺寸-1代表根据其他维度自动调整
print(x.size(), y.size(), z.size())
如果tensor中只有一个元素,可以用.item()
获取Python格式的数据:
输入命令:
x = torch.randn(1)
print(x)
print(x.item())
终端结果:
注意,这个命令只能对单一元素的tensor使用。
包括转置、下标、切片、数学操作、线性变换、随机数等100多个tensor操作可以看这里。
将Torch张量(tensor)与NymPy的数组(array)相互转换也是很容易的。如果Torch Tensor在CPU上的话,Torch Tensor和NumPy array共享底层存储位置,并且可以互相转换。
输入命令:
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
终端结果:
查看NumPy array如何随tensor变换值。输入命令:
a.add_(1)
print(a)
print(b)
np array可以自动转换成Torch Tensor。输入命令:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)
所有CPU上的Tensor(除了CharTensor)都支持与NumPy之间的相互转换。
Tensors也可以通过.to
命令移动到任何设备上。输入命令:
# 只在CUDA存在时运行这个模块
# 使用 ``torch.device`` 将tensor移入和移出GPU
if torch.cuda.is_available():
device = torch.device("cuda") # 一个目标设备CUDA
y = torch.ones_like(x, device=device) # 直接在GPU上创建一个tensor
x = x.to(device) # or just use strings ``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` 命令也可以同时转换dtype
脚本总运行时间:6.503秒。
更多内容,欢迎加入星球讨论。