来源|本文经授权转载自深度学习与计算机视觉公众号
下面的教程假设了一些关于Python编程语言和高中数学的基本知识。不需要事先具备深入学习的知识。本文介绍了开始深入学习所需的PyTorch的基本知识和工作。按照教程进行操作,获得实际操作经验。
PyTorch是一个优化的张量库,主要用于使用gpu和cpu的深度学习应用程序。它是一个针对Python的开源机器学习库,主要由Facebook人工智能研究团队开发。它是一个广泛使用的机器学习库,其他的是TensorFlow和Keras。以下是Google的搜索趋势,它表明PyTorch库的受欢迎程度相对高于TensorFlow和Keras。
PyTorch是基于python和torch库构建的,torch库支持在图形处理单元上计算张量。目前是深度学习和人工智能研究界最喜欢使用的库。我们正在使用Jupyter Notebook来运行我们的代码。我们建议你继续学习有关google colaboratory的教程。它是一个Jupyter Notebook环境,不需要设置就可以使用,完全在云中运行。我们也可以免费使用GPU。你可以查看此链接以获得使用Colab的一些指导。
- https://colab.research.google.com/
张量
PyTorch是一个处理张量的库。张量是数据的基本单位。它可以是数字、向量、矩阵或任何n维数组。它类似于Numpy数组。在开始之前,我们应该导入torch模块,如下所示:
创建张量
# Tensor with Single number
t1 = torch.tensor(5.)
print(t1)
5是5.0的简写。它用来表示张量是浮点数。我们可以使用tensor.dtype来验证, 如果你使用的是Jupyter Notebook,那么你可以直接在单元格中输入变量并运行它来查看结果。
# Tensor with 1D vector
t2 = torch.tensor([1, 2, 3., 4])
print(t2)
Output: tensor([1., 2., 3., 4.])
从上面的输出可以看出,即使向量的一个元素是浮点数,张量也会将所有元素的数据类型转换为float。# Matrix
t3 = torch.tensor([[1., 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(t3)
Output: tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
t4 = torch.tensor([
[[10. , 11, 12],
[13, 14, 15]],
[[16, 17, 18],
[19, 20, 21]]
])
print(t4)
Output: tensor([[[10., 11., 12.],
[13., 14., 15.]],
[[16., 17., 18.],
[19., 20., 21.]]])
如果我们观察到这些张量其实类似于NumPy数组,我们可以使用tensor.shape检查张量形状。数组的维数将是返回形状的长度。
Output: torch.Size([3, 3])
Output: torch.Size([2, 2, 3])
由于t4是由两个2×3的张量叠加而成,所以它的维数是3
张量运算与梯度计算
我们可以用常用的算术运算对张量进行运算。而且,张量有一种特殊的能力来计算给定表达式相对于所有自变量的梯度或导数。让我们看一个例子x = torch.tensor(3.)
w = torch.tensor(4. ,requires_grad=True)
z = torch.tensor(5. ,requires_grad=True)
x , w , z
Output: (tensor(3.), tensor(4., requires_grad=True), tensor(5., requires_grad=True))
在上面的代码片段中,我们创建了3个张量x、w和z,对于w和z,另外一个参数需要将require_grad设置为True。
Output: tensor(17., grad_fn=<AddBackward0>)
所以根据基本的乘法和加法,我们得到了预期的结果,即y=3*4+5=17。
自动计算导数
现在让我们来讨论Pytorch的一个独特功能,它可以自动计算任何表达式(在本例中是y)对自变量的导数,自变量的参数需要设置为True这可以通过调用 y上的.backward方法来实现#Compute derivatives
y.backward()我们可以找到y wrt输入张量的导数,这些导数存储在各个输入张量的梯度性质中。
print('dy/dx =', x.grad)
print('dy/dw =', w.grad)
print('dy/dz =', z.grad)
Output : dy/dx = None
dy/dw = tensor(3.)
dy/dz = tensor(1.)
- y wrt x的导数的值为“None”,因为参数requires_grad需要设置为False
- y wrt w的导数的值是3,因为dy/dw=x=3
带NumPy的PyTorch
NumPy是一个流行的开源库,用于python中的科学和数学计算。它还支持对大型多维数组的操作以及基于线性代数、傅立叶变换和矩阵的计算。NumPy拥有一个庞大的支持库生态系统,包括Pandas、Matplotlib和OpenCv。因此PyTorch与NumPy进行互操作,以利用NumPy的工具和库,然后进一步扩展功能。
#First create a numpy array
import numpy as np
x = np.array([1, 2., 3])
print(x)
Output: array([1., 2., 3.])所以我们可以使用 torch.from_numpy( )
#Create a tensor from numpy array
y. = torch.from_numpy(x)
print(y)
Output: tensor([1., 2., 3.], dtype=torch.float64)
print(x.dtype)
print(y.dtype)
Output: float64
torch.float64现在我们可以使用.NumPy() 方法将PyTorch张量转换为NumPy数组
Output: array([1., 2., 3.])与NumPy的互操作性是必需的,因为你将使用的大多数数据集都很可能在NumPy中处理。在这里,你可能想知道为什么我们使用Pytorch而不是NumPy,因为它还提供了处理多维数组和执行大型计算所需的所有库和实用程序。主要有两个原因:
- AutoGrad:为张量运算计算梯度的能力是一种强大的能力,对于训练神经网络和执行反向传播是必不可少的。
- GPU支持:在处理大量数据集和大型模型时,PyTorch张量操作在图形处理单元(GPU)中执行,这将使普通cpu所需的时间减少40倍到50倍。
因此,PyTorch是一个非常强大的深度学习库,它的表现力和python特性在研究和开发社区得到了广泛的应用。