1、张量是什么
当前的机器学习模型基本都使用张量(Tensor)作为基本的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量来编码一个模型的输入和输出,以及模型的参数。
张量(Tensor)与NumPy的ndarrays类似,但是张量可以在GPU或其他硬件加速器上运行。事实上,张量和NumPy数组通常可以共享相同的底层内存(属于引用拷贝),不需要复制数据,直接使用 torch.from_numpy()
转换即可。
2、张量的属性
- 轴(阶):向量有1个轴,矩阵有2个轴,3D张量有3个轴。在NumPy里用ndarray的ndim属性表示。
- 形状:这是一个整数元组,在Python中通常用shape属性表示张量沿着每个轴的维度大小(元素个数)。例如,矩阵的形状可表示为(2,6);3D张量的形状可表示为(40,2,6);向量为(6,),而标量的形状为空,即()。
- 数据类型:张量中包含的数据类型,在Python中通常用dtype属性表示(float64、float32…)。
3、常见的几种数据张量
通常来说,深度学习中所有数据张量的第一个轴(0轴)都是样本轴(也称样本维度)。由于深度学习通常不会同时处理整个数据集,而是会将数据拆分成小批量进行输入训练。对于这种批量张量(batch tensor),第一个轴叫作批量轴(batch axis)或批量维度。
序号 | 数据类型 | 张量类型 | 形状 |
---|---|---|---|
1 | 向量数据 | 2D张量 | (samples,feature) |
2 | 时间序列数据或序列数据 | 3D张量 | (samples,timesteps,feature) |
3 | 图像 | 4D张量 | (samples,height,width,channels)or(samples,channels,height,width) |
4 | 视频 | 5D张量 | (samples,frames,height,width,channels)or(samples,frames,channels,height,width) |
注意:向量只有1个轴,是1D张量,但加上样本轴后的向量数据有2个轴,是2D张量。
接下来,一起看一下 python深度学习(第二版) 提供的例子:
3.1 向量数据
- 人口统计数据集
其中包括每个人的年龄、性别、身份证号和住址。每个人可以表示为包含4个值的向量,而整个数据集包含100,000个人,因此可以存储在形状为(100000,4) 的2D张量中。 - 文本文档数据集
我们将每个文档表示为每个单词在其中出现的次数(字典中包含20,000个常见单词)。每个文档可以被编码为包含20000个值的向量(每个值对应于字典中每个单词的出现次数),整个数据集包含500个文档,因此可以存储在形状为
(500,20000) 的张量中。
用Excel可以很容易表示,三个文档中单词A、B、C中各出现的次数:
3.2 时间序列数据或序列数据
- 股票价格数据集
每一分钟, 我们将股票的当前价格、前1分钟的最高价格和前1分钟的最低价格保存下来。因此每分钟被编码为个3D向量(注意,不是3D张量),整个交易日被编码为1个形状为(390,3) 的2D张量(一个交易日有390分钟).而250天的数据则可以保存在个形状为(250,390, 3) 的3D张量中。这里每个样本是1天的股票数据。 - 推文数据集
我们将每条推文编码为280个字符组成的序列,而每个字符又来自于128个字符组成的字母表。在这种情况下,每个字符可以被编码为大小为128的二进制向量(独热编码:只有在该字符对应的索引位置取值为1,其他元素都为0)。那么每条推文可以被编码为一个形状为(280,128)的2D张量,而包含100万条推文的数据集则可以存在一个形状为(1000000, 280, 128) 的张量中。
3.3 图像
图像通常具有三个维度:高度、宽度和颜色深度。虽然灰度图像(比如MNIST 数字图像)只有一个颜色通道,因此可以保存在2D张量中(不考虑样本轴)。但按照惯例,图像张量始终都是3D张量,灰度图像的彩色通道只有一维。因此,如果图像大小为
256
×
256
256\times256
256×256,那么512张灰度图像组成的批量可以保存在一个形状为(512,256,256,1)的张量中,而相同数量的彩色图像可以保存在一个形状为(512,256,256,3)的张量中。
图像张量的形状有两种约定:
- 通道在后(channels-last)的约定:Google的TensorFlow机器学习框架将颜色深度轴放在最后(samples,height,width,color_depth)。
- 通道在前(channels-first)的约定:与1相反,Theano框架将图像深度轴放在批量轴之后(samples,color_depth,height,width)。如果采用Theano约定,前面的两个例子将变成(512,1,256,256)和(512,3,256,256)。
值得注意的是,Keras框架同时支持这两种格式。
3.4 视频
视频的每一帧都是一张图片,所以比图像多了一个维度。
视频数据是现实生活中需要用到5D张量的少数数据类型之一。视额可以看作一系列帧,每一帧都是一张彩色图像。由于每一帧都可以保存在一个形状为(height, width. color_depth)的3D张量中,因此,一系列帧可以保存在一个形状为(frames,height, width,color_depth)的4D张量中,而不同视频组成的批量则可以保存在一个5D张量中,其形状为
(samples,frames,height,width,color_ depth)。
举个例子,一个以每秒4帧采样的60秒YouTube视频片段,视频尺寸为
44
×
256
44\times256
44×256,这个视颊共有240帧。4个这样的视频片段组成的批量将保存在形状为(4,240,144,256,3)的张量中。总共有106,168,320个值!如果张量的数据类型(dtype)是float32,每个值都是32位,那么这个张量共有405MB,很大。但我们在现实生活中遇到的视频要小得多。因为它们不以float32格式存储,而且通常被大大压缩,比如MPEG格式。
解释:float32表示一个float32的值占计算机内存32个比特位。所以这个张量的大小为:
106168320
×
32
÷
1024
÷
1024
÷
8
=
405
M
B
106168320\times32\div1024\div1024\div8=405 MB
106168320×32÷1024÷1024÷8=405MB
侵删!如有错误还请指正,不定期更新,觉得不错的话请给个赞吧~