资讯详情

资讯详情

【Python深度学习(第二版)(4)】神经网络的基本数据结构-张量概念、阶数、使用NumPy操作张量、张量种类、样本轴等概念

文章目录一. 张量概念二. 张量的阶数1. 标量0阶张量2. 向量1阶张量2. 矩阵2阶张量3. 3阶张量与更高阶的张量三. 张量属性及操作张量1. 张量的关键属性2. 在NumPy中操作张量2.1. 选择某个图片数据2.2. 截取图像数据2.3. 沿着每个张量轴在任意两个索引之间选择切片。3. 数据批量的概念四. 张量的种类1. 向量数据2. 时间序列数据或序列数据3. 图像数据4. 视频数据在前面的例子中我们的数据存储在多维NumPy数组中也叫作张量tensor。一般来说目前所有机器学习系统都使用张量作为基本数据结构。本文我们会了解如下概念张量标量轴、轴的个数阶维度轴上元素的个数或轴的个数向量、矩阵NumPy中的ndim、shape、dtype张量切片样本轴第一个轴每个元素都表示了一个样本数据批量轴批量维度第一个元素颜色通道一. 张量概念张量这一概念的核心在于它是一个数据容器。它包含的数据通常是数值数据因此它是一个数字容器。你可能对矩阵很熟悉它是2阶张量。张量是矩阵向任意维度的推广注意张量的维度通常叫作轴axis。二. 张量的阶数1. 标量0阶张量仅包含一个数字的张量叫作标量scalar也叫标量张量、0阶张量或0维张量。在NumPy中一个float32类型或float64类型的数字就是一个标量张量或标量数组。标量张量有0个轴ndim 0。张量轴的个数也叫作阶rank。## 下面是一个NumPy标量。importnumpyasnpxnp.array(12)x array(12)## 用ndim属性来查看NumPy张量的轴的个数x.ndim02. 向量1阶张量数字组成的数组叫作向量vector也叫1阶张量或1维张量。1阶张量只有一个轴。# 下面是一个NumPy向量。xnp.array([12,3,6,14,7])x array([12,3,6,14,7])x.ndim1这个向量包含5个元素所以叫作5维向量。不要把5维向量和5维张量混为一谈5维向量只有一个轴沿着这个轴有5个维度而5维张量有5个轴沿着每个轴可能有任意个维度。维度dimensionality既可以表示沿着某个轴上的元素个数比如5维向量也可以表示张量的轴的个数比如5维张量这有时会令人困惑。对于后一种情况更准确的术语是5阶张量张量的阶数即轴的个数但5维张量这种模糊的说法很常见。2. 矩阵2阶张量向量组成的数组叫作矩阵matrix也叫2阶张量或2维张量。矩阵有2个轴通常叫作行和列。你可以将矩阵直观地理解为矩形的数字网格。# 下面是一个NumPy矩阵。xnp.array([[5,78,2,34,0],[6,79,3,35,1],[7,80,4,36,2]])x.ndim2第一个轴上的元素叫作行row第二个轴上的元素叫作列column。3. 3阶张量与更高阶的张量将多个矩阵打包成一个新的数组就可以得到一个3阶张量或称为3维张量你可以将其直观地理解为数字组成的立方体。# 下面是一个3阶NumPy张量。xnp.array([[[5,78,2,34,0],[6,79,3,35,1],[7,80,4,36,2]],[[5,78,2,34,0],[6,79,3,35,1],[7,80,4,36,2]],[[5,78,2,34,0],[6,79,3,35,1],[7,80,4,36,2]]])x.ndim3将多个3阶张量打包成一个数组就可以创建一个4阶张量以此类推。深度学习处理的一般是0到4阶的张量但处理视频数据时可能会遇到5阶张量。三. 张量属性及操作张量1. 张量的关键属性张量是由以下3个关键属性来定义的。轴的个数阶数。举例来说3阶张量有3个轴矩阵有2个轴。这在NumPy或TensorFlow等Python库中也叫张量的ndim。形状。由整数元组来表达元组的各元素表示张量沿每个轴的维度大小元素个数。举例来说前面的矩阵示例的形状为(3, 5)3阶张量示例的形状为(3, 3, 5)。向量的形状只包含一个元素比如(5,)而标量的形状为空即()。数据类型在Python库中通常叫作dtype。这是张量中所包含数据的类型。举例来说张量的类型可以是float16、float32、float64、uint8等。在TensorFlow中你还可能会遇到string类型的张量。为了更具体地说明这一点我们回头看一下在MNIST例子中处理的数据。# 导入数据fromtensorflow.keras.datasetsimportmnist(train_images,train_labels),(test_images,test_labels)mnist.load_data()# 张量train_images的轴的个数即ndim属性。train_images.ndim3# 形状6万个矩阵、每个矩阵中有28个向量每个向量的元素个数28train_images.shape(60000,28,28)# 元素的数据类型train_images.dtype uint8train_images是由60 000个矩阵组成的数组每个矩阵由28×28个整数组成。每个这样的矩阵都是一张灰度图像元素取值在0和255之间。数据可视化我们用Matplotlib库来显示这个3阶张量中的第4个数字。importmatplotlib.pyplotasplt# 显示第4个数字digittrain_images[4]plt.imshow(digit,cmapplt.cm.binary)plt.show()# 显而易见对应的标签是整数9。train_labels[4]92. 在NumPy中操作张量选择张量的特定元素叫作张量切片tensor slicing。有如下三种方式来操作张量2.1. 选择某个图片数据在前面的例子中我们使用语法train_images[i]来沿着第一个轴选择某张数字图像。我们来看一下对NumPy数组可以做哪些张量切片运算。2.2. 截取图像数据# 下面这个例子选择第10100个数字不包括第100个并将它们放在一个形状为(90, 28, 28)的数组中。my_slicetrain_images[10:100]my_slice.shape# (90, 28, 28)# 等同于下面这个更详细的写法——给出切片沿着每个张量轴的起始索引和结束索引。# 注意:等同于选择整个轴。my_slicetrain_images[10:100,:,:]my_slice.shape# (90, 28, 28)my_slicetrain_images[10:100,0:28,0:28]my_slice.shape# (90, 28, 28)2.3. 沿着每个张量轴在任意两个索引之间选择切片。# 举例来说要在所有图像的右下角选出14像素×14像素的区域可以这么做my_slicetrain_images[:,14:,14:]# 也可以使用负数索引。# 与Python列表类似负数索引表示与当前轴终点的相对位置。# 要在图像中心裁剪出14像素×14像素的区域可以这么做。my_slicetrain_images[:,7:-7,7:-7]3. 数据批量的概念样本轴的概念深度学习中所有张量的第一个轴也就是轴0因为索引从0开始都是样本轴(samples axis有时也叫样本维度samples dimension)。 在MNIST例子中样本轴中每个元素都是一张数字图像。分批处理数据集深度学习模型不会一次性处理整个数据集而是将数据拆分成小批量。# 具体来看下面是MNIST数据集的一个批量批量大小为128。batchtrain_images[:128]# 然后是下一个批量。batchtrain_images[128:256]# 再然后是第n个批量。n3batchtrain_images[128*n:128*(n1)]对于这种批量张量第一个轴轴0叫作批量轴batch axis或批量维度batch dimension。四. 张量的种类我们来具体看看你以后会遇到的几个数据张量实例。你要处理的数据几乎总是属于下列类别。[张量种类]向量数据形状为(samples, features)的2阶张量每个样本都是一个数值向量。时间序列数据或序列数据形状为(samples, timesteps, features)的3阶张量每个样本都是特征向量组成的序列序列长度为timesteps。图像数据形状为(samples, height, width, channels)的4阶张量每个样本都是一个二维像素网格每个像素则由一个“通道”channel向量表示。视频数据形状为(samples, frames, height, width, channels)的5阶张量每个样本都是由图像组成的序列序列长度为frames。1. 向量数据每个数据点都被编码为一个向量因此一个数据批量就被编码为一个2阶张量由向量组成的数组其中第1个轴是样本轴第2个轴是特征轴features axis。[如下两个例子]保险精算数据集。我们考虑每个人的年龄、性别和收入。每个人可表示为包含3个值的向量整个数据集包含100 000人因此可存储在形状为(100000, 3)的2阶张量中。文本文档数据集。我们将每个文档表示为每个单词在其中出现的次数。每个文档可被编码为包含20 000个值每个单词都要排好序然后记录每个单词出现的次数总共20000个单词的向量每个值对应字典中每个单词的出现次数整个数据集包含500个文档因此可存储在形状为(500, 20000)的张量中。2. 时间序列数据或序列数据当时间或序列顺序对数据很重要时应该将数据存储在带有时间轴的3阶张量中。每个样本可被编码为一个向量序列2阶张量因此一个数据批量就被编码为一个3阶张量如图所示。按照惯例时间轴始终是第2个轴索引为1的轴。[两个例子]股票价格数据集。每一分钟我们将股票的当前价格、前一分钟最高价格和前一分钟最低价格保存下来。因此每一分钟被编码为一个3维向量一个交易日被编码为一个形状为(390, 3)的矩阵一个交易日有390分钟250天的数据则保存在一个形状为(250, 390, 3)的3阶张量中。在这个例子中每个样本是一天的股票数据。推文数据集。我们将每条推文编码为由280个字符组成的序列每个字符又来自于包含128个字符的字母表。在这种情况下每个字符可以被编码为大小为128的二进制向量只有在该字符对应的索引位置取值为1其他元素都为0。那么每条推文可以被编码为一个形状为(280, 128)的2阶张量包含100万条推文的数据集则被存储在一个形状为(1000000, 280, 128)的张量中。3. 图像数据图像通常具有3个维度高度、宽度和颜色深度。虽然灰度图像比如MNIST数字图像只有一个颜色通道因此可以保存在2阶张量中但按照惯例图像张量都是3阶张量。对于灰度图像其颜色通道只有一维。因此如果图像大小为256×256那么由128张灰度图像组成的批量可以保存在一个形状为(128, 256, 256, 1)的张量中由128张彩色图像组成的批量则可以保存在一个形状为(128, 256, 256, 3)的张量中如图所示。图像张量的形状有两种约定通道在后channels-last的约定这是TensorFlow的标准通道在前channels-first的约定使用这种约定的人越来越少。4. 视频数据视频数据是现实世界中为数不多的需要用到5阶张量的数据类型。视频可以看作帧的序列每一帧都是一张彩色图像。由于每一帧都可以保存在一个形状为(height, width, color_depth)的3阶张量中因此一个视频帧的序列可以保存在一个形状为(frames, height, width,color_depth)的4阶张量中由多个视频组成的批量则可以保存在一个形状为(samples,frames, height, width, color_depth)的5阶张量中。[举个例子]一个尺寸为144×256的60秒YouTube视频片段以每秒4帧采样那么这个视频共有240帧。4个这样的视频片段组成的批量将保存在形状为(4, 240, 144, 256, 3)的张量中。这个张量共包含106 168 320个值如果张量的数据类型dtype是float32每个值都是32位那么这个张量共有405 MB。好大你在现实生活中遇到的视频要小得多因为它们不以float32格式存储而且通常被大大压缩比如MPEG格式。参考《Python深度学习第二版》–弗朗索瓦·肖莱https://www.redhat.com/zh/topics/digital-transformation/what-is-deep-learning
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →