【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)。一般来说,目前所有机器学习系统都使用张量作为基本数据结构。

本文我们会了解如下概念:

  1. 张量
  2. 标量
  3. 轴、轴的个数:阶
  4. 维度:轴上元素的个数或轴的个数
  5. 向量、矩阵
  6. NumPy中的ndim、shape、dtype
  7. 张量切片
  8. 样本轴:第一个轴:每个元素都表示了一个样本(数据)
  9. 批量轴(批量维度):第一个元素
  10. 颜色通道

一. 张量概念

张量对这个领域非常重要,重要到TensorFlow都以它来命名。

究竟什么是张量呢?张量这一概念的核心在于,它是一个数据容器。

  • 它包含的数据通常是数值数据,因此它是一个数字容器
  • 你可能对矩阵很熟悉,它是2阶张量。张量是矩阵向任意维度的推广
  • [注意,张量的维度通常叫作轴(axis)]。

 

二. 张量的阶数

1. 标量(0阶张量)

仅包含一个数字的张量叫作标量(scalar),也叫标量张量、0阶张量或0维张量。
在NumPy中,一个float32类型或float64类型的数字就是一个标量张量(或标量数组)。
标量张量有0个轴(ndim == 0)。
张量轴的个数也叫作阶(rank)。

## 下面是一个NumPy标量。
>>> import numpy as np 
>>> x = np.array(12)
>>> x
array(12)
## 用ndim属性来查看NumPy张量的轴的个数
>>> x.ndim 
0

 

2. 向量(1阶张量)

数字组成的数组叫作向量(vector),也叫1阶张量或1维张量。
1阶张量只有一个轴。

# 下面是一个NumPy向量。
>>> x = np.array([12, 3, 6, 14, 7])
>>> x 
array([12, 3, 6, 14, 7])
>>> x.ndim
1

这个向量包含5个元素,所以叫作5维向量。不要把5维向量和5维张量混为一谈!5维向量只有一个轴,沿着这个轴有5个维度,而5维张量有5个轴(沿着每个轴可能有任意个维度)。

  • 维度(dimensionality)既可以表示沿着某个轴上的元素个数(比如5维向量),也可以表示张量的轴的个数(比如5维张量),这有时会令人困惑。
  • 对于后一种情况,更准确的术语是5阶张量(张量的阶数即轴的个数),但5维张量这种模糊的说法很常见。

 

2. 矩阵(2阶张量)

向量组成的数组叫作矩阵(matrix),也叫2阶张量或2维张量。
矩阵有2个轴(通常叫作行和列)。你可以将矩阵直观地理解为矩形的数字网格。

# 下面是一个NumPy矩阵。
>>> x = np.array([[5, 78, 2, 34, 0],
                  [6, 79, 3, 35, 1],
                  [7, 80, 4, 36, 2]])
>>> x.ndim
2

第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)。

 

3. 3阶张量与更高阶的张量

将多个矩阵打包成一个新的数组,就可以得到一个3阶张量(或称为3维张量),你可以将其直观地理解为数字组成的立方体。

# 下面是一个3阶NumPy张量。
>>> x = np.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.ndim
3

将多个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例子中处理的数据。

# 导入数据
from tensorflow.keras.datasets import mnist 

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()


# 张量train_images的轴的个数,即ndim属性。
train_images.ndim

3


# 形状:6万个矩阵、每个矩阵中有28个向量,每个向量的元素个数28
train_images.shape

(60000, 28, 28)


# 元素的数据类型
train_images.dtype

uint8

train_images是由60 000个矩阵组成的数组,每个矩阵由28×28个整数组成。每个这样的矩阵都是一张灰度图像,元素取值在0和255之间。

 

数据可视化
我们用Matplotlib库来显示这个3阶张量中的第4个数字。

在这里插入图片描述

import matplotlib.pyplot as plt 

# 显示第4个数字
digit = train_images[4] 
plt.imshow(digit, cmap=plt.cm.binary) 
plt.show()

# 显而易见,对应的标签是整数9。
train_labels[4] 

9

 

2. 在NumPy中操作张量

选择张量的特定元素叫作张量切片(tensor slicing)。 有如下三种方式来操作张量

2.1. 选择某个图片数据

在前面的例子中,我们使用语法train_images[i]来沿着第一个轴选择某张数字图像。

我们来看一下对NumPy数组可以做哪些张量切片运算。

 

2.2. 截取图像数据

# 下面这个例子选择第10~100个数字(不包括第100个),并将它们放在一个形状为(90, 28, 28)的数组中。
my_slice = train_images[10:100]
my_slice.shape
# (90, 28, 28)


# 等同于下面这个更详细的写法——给出切片沿着每个张量轴的起始索引和结束索引。
# 注意,:等同于选择整个轴。
my_slice = train_images[10:100, :, :]
my_slice.shape
# (90, 28, 28)

my_slice = train_images[10:100, 0:28, 0:28]
my_slice.shape
# (90, 28, 28)

 

2.3. 沿着每个张量轴在任意两个索引之间选择切片。


# 举例来说,要在所有图像的右下角选出14像素×14像素的区域,可以这么做:
my_slice = train_images[:, 14:, 14:]


# 也可以使用负数索引。
# 与Python列表类似,负数索引表示与当前轴终点的相对位置。
# 要在图像中心裁剪出14像素×14像素的区域,可以这么做。
my_slice = train_images[:, 7:-7, 7:-7]

 

3. 数据批量的概念

样本轴的概念:

深度学习中所有张量的第一个轴(也就是轴0,因为索引从0开始)都是样本轴(samples axis,有时也叫样本维度(samples dimension))。 在MNIST例子中,样本轴中每个元素都是一张数字图像。

 

分批处理数据集:

深度学习模型不会一次性处理整个数据集,而是将数据拆分成小批量。

# 具体来看,下面是MNIST数据集的一个批量,批量大小为128。
batch = train_images[:128]


# 然后是下一个批量。

batch = train_images[128:256]

# 再然后是第n个批量。

n = 3 
batch = train_images[128 * n:128 * (n + 1)]

对于这种批量张量,第一个轴(轴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)的张量中,如图所示。

![[Pasted image 20240504232713.png]]

图像张量的形状有两种约定:

  • 通道在后(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/606521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

班级综合测评|基于Springboot+vue的班级综合测评管理系统(源码+数据库+文档)

目录 基于Springbootvue的“智慧食堂”系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

Python应用:让生活更智能

随着科技的进步,Python已成为一种非常受欢迎的编程语言,它在数据分析、人工智能、Web开发等领域有着广泛的应用。今天,我们将探讨一个Python应用的例子,这个应用将帮助我们更智能地管理日常生活。 应用名称:智能生活助…

Kubernetes最小单元Pod的生命周期

1.1 Pod生命周期 1.1.1 过程及状态 Pod 的生命周期管理是 Kubernetes 集群中非常重要的一部分,它涉及到 Pod 从创建到销毁的整个过程。下面是 Pod 生命周期中各个阶段的简要说明: Pod 创建过程:当一个 Pod 被创建时,Kubernetes 会…

三层架构实验

交换部分 第一个步骤配 Eth-Trunk,目的是:将两条线绑在一起 sw和1sw2上配置 [sw1]interface Eth-Trunk 0 //创建隧道 [sw1-Eth-Trunk0]q [sw1]int g 0/0/2 [sw1-GigabitEthernet0/0/2]eth-trunk 0 //进入接口划分隧道 [sw1-GigabitEthernet0/0/2]…

JavaScript算法描述【排序与搜索】六大经典排序|搜索旋转排序数组|在排序数组中查找元素的第一个和最后一个位置、数组中的第K个|

🐧主页详情:Choice~的个人主页 文章目录 搜索旋转排序数组方法一 二分查询最大最小值思路详解代码方法二 二分查询中间数 在排序数组中查找元素的第一个和最后一个位置、数组中的第K个最大元素和颜色分类在排序数组中查找元素的第一个和最后一个位置方法…

【LeetCode刷题】153. 寻找旋转排序数组中的最小值

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 153. 寻找旋转排序数组中的最小值 2. 题目描述 3. 解题方法 根据题目分析,可以明确一点,无论该数组如何旋转,都会有这样的一个性质,就是nums[0] > nums[n-1]&#xf…

CST软件的界面快捷键汇总与操作窗口【入门基础】

CST界面操作快捷键 利用鼠标和键盘快捷键的GUI操作 View > Mouse Control 本章节介绍,使用鼠标和键盘快捷键,操作CST软件的2D/3D GUI (Graphical User Interface图形用户界面)的方法。为了快速方便地操作2D/3D Model,建议熟悉本章节的内…

springcloud报错:Failed to start bean‘webServerStartStop‘

如果你正在使用nacos进行服务注册,然后报一下错误: 那就说明的nacos没有打开,所以找到你的下载nacos的文件夹 好了,错误完美解决~

eNSP Pro 最新版安装实践

目录 写在前面什么是eNSP Pro版本配置需求 安装流程宿主机环境安装步骤 写在前面 最近听到说,华为的eNSP Pro不再限制账号使用了,马上尝试了一下。 官网下载链接: https://support.huawei.com/enterprise/zh/enterprise-professional-servic…

鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单

很香的 Docker 如果只是为了编译鸿蒙,初级的接触鸿蒙,docker是很香的,从第一次接触docker就对它爱不释手, 脏活累活它干了,少了太多的麻烦. docker 编译鸿蒙看编译环境篇就行了, L1 和 L2 都编译通过了.如果要深入的了解鸿蒙,比如调试鸿蒙的代码或编译工具,就需要另辟蹊径了. …

区块链的可扩展性三难问题

这个词是由以太坊的联合创始人Vitalik Buterin创造的,并提出了理想的区块链需要具备的三个特征:去中心化、可扩展性和安全性。 Vitalik还提出,区块链几乎不可能很好地实现所有这三个特征,所以会出现权衡。 因此,今天…

linux 使用intel oneapi报错报错

使用intel oneapi 2024.1.0 时经常报这个错误 因为当前 intel2024.1.0没有在使用 需要改回2024.0.0并安装适配的torch的包来运行

XN297 2.4GHz 单片高速无线收发芯片

概述 XN297是一款工作在2.400~2.483GHz世界通用ISM频段的单片无线收发芯片。该芯片集成 射频收发器、频率发生器、晶体振荡器、调制解调器等功能模块,并且支持一对多组网和带 ACK的通信模式。发射输出功率、工作频道以及通信数据率均可配置。 主要特性 1、低功…

三星硬盘好还是西数硬盘好?硬盘数据丢失怎么找回

在数字化时代,硬盘作为数据存储的核心组件,其品质与性能直接关系到用户的数据安全与使用体验。在众多硬盘品牌中,三星与西数无疑是两个备受关注的名字。那么,究竟是三星硬盘更胜一筹,还是西数硬盘更受用户青睐&#xf…

【项目】使用Yolov8 + tesseract 实现“营业执照”信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于毕业设计参考、实验等,营业执照分为横版和竖版,整体检测+识别效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录

DRF 目录总结+思维导图

【0】思维导图链接 链接: https://gitmind.cn/app/docs/mcd0bc41 密码: 4350 【一】DRF 基础知识 DRF 基础知识-CSDN博客 【二】CBV 源码解析 Django CBV源码分析-CSDN博客 【三】APIView源码解析 DRF APIView源码分析-CSDN博客 【四】request源码分析 DRF APIView源码分…

# 从浅入深 学习 SpringCloud 微服务架构(十三)SCG 网关中使用 sentinel 限流

从浅入深 学习 SpringCloud 微服务架构(十三)SCG 网关中使用 sentinel 限流 一、SCG 网关中使用 sentinel 限流:入门案例 1、基于 Sentinel 的限流: 1) Sentinel 支持对 Spring Cloud Gateway, Zuul 等主流的 API G…

【全开源】Java洗衣清洁服务同城清洗服务小程序源码

特色功能: 在线预约与支付:用户可以通过洗衣小程序在线预约洗衣服务,并选择支付方式进行支付,如微信支付、支付宝等。这种在线预约和支付的方式极大地方便了用户,提高了服务的便捷性。智能推荐与选择:根据…

探索C++的string:从基础到深入

文章目录 string类string类的接口string的常见构造string类对象的容量操作string类的遍历及访问操作string类对象的修改操作string类的非成员函数 总结 string类 C中的string类是一个非常重要的字符串处理工具,它提供了一种方便且灵活的方式来处理字符串。它位于标…

Vue3专栏项目 -- 一、第一个页面(下)

一、Dropdown 组件(下拉菜单组件)编码 1、基本功能:展示出下拉按钮和下拉菜单栏的样式 我们可以通过bootstrap来实现这个下拉框,需要注意它这个只是有样式,是没有行为的 然后这个下拉按钮的文字展示是根据用户名称展…