深度学习中最基本的操作单元——张量

今天我们来谈一下,深度学习中最基本的数据操作单元——张量
张量是一个数字容器,同时也是定义张量转换来生成新张量的一组规则,如果对这个概念还是感觉到比较难理解的同学,我们可以将张量想象成多维数组。每个张量有一个秩或者阶(rank),这对应它的维度空间。一个简单标量(如1)可以表示为秩为0的张量,向量秩为1,一个nxn的矩阵秩为2,以此类推。
张量操作
如果查看PyTorch文档(https://oreil.ly/1Ev0-),会看到大量可以在张量上应用的函数,从查找最大元素到应用傅里叶变换一应俱全。一般来说,我们在运行深度学习算法时,我们要将图像、文本和音频转换为张量,并通过处理这些张量来完成我们最终要实现的目的。
同时,我们在运行深度学习算法时,会经常用到一些函数,这里我们对常用的一些函数进行简单介绍。
最大索引
首先,我们往往需要找出一个张量中的最大元素,以及包含这个最大值的索引(因为这通常对应神经网络在最后的预测中确定的类)。这些可以用max()和argmax()函数来得到。还可以使用item()从一个1维张量提取一个标准Python值。

torch.rand(2,2).max
>tensor(0.4726)
torch.rand(2,2).max.item()
>0.86499

数据类型转换
有时,我们可能想要改变一个张量的类型,例如,从一个LongTensor改为FloatTensor。这可以用to()做到:

float_tensor=torch.to(LongTensor)

张量维度变换
另一个常见的操作是张量变形(reshaping)。通常来说,由于神经网络层需要输入形状与你目前提供输入的形状稍有不同,可能就会出现张量变形。对于此,我们可以用view()或reshape()来完成变形。

flat_tensor=torch.rand(784)
view_tensor=flat_tensor.view(1,28,28)

需要注意的是,变形后张量总的元素个数必须与原张量元素个数相同。
现在来讲一讲view()和reshape()函数的区别
view()会处理为原张量的一个视图,所以如果底层数据发生变化,视图也会改变(反之亦然)。不过如果所需的视图不是连续的,view()会抛出错误。也就是说,如果从头开始创建所需形状的一个新张量,不会共享占用的同一个内存块。如果发生这种情况,使用view()之前必须调用tensor.contiguous()。不过reshape()后会在后台完成所有的这些工作,所以,一般来讲,我们用的最多的是reshape()而不是view().
张量重排
最后我们需要重排一个张量的维度。可能对图像会有这个需求,图像通常存储为[height,width,channel]张量,不过PyTorch更喜欢按照[channel,height,width]来处理。我们可以使用permute()用一种相当简单的方式来完成重排。
张量中的广播机制
广播(broadcasting)是从NumPy借鉴来的,允许在一个张量和一个较小张量之间完成操作。如果反向从其后缘维度(trailing dimensions,即末尾的维度)开始,若满足以下条件,就可以在这两个张量上广播:
1.两个维度大小相等
2.其中一个维度大小为1

此外,再分享一下几个常用的链接
Jupyter项目文档:https://jupyter.org/documentation
PyTorch文档:https://pytorch.org/docs/stable
AWS深度学习AMI:https://oreil.ly/G9Ldx
:文章摘选自《基于PyTorch的深度学习》Ian Pointer著

你可能感兴趣的:(pytorch深度学习,深度学习,pytorch,python)