大家好,今天我们学习【马上学tensorflow 2.0】之 神经网络中数据如何表示。
我们 马上学三点 :
- 什么是张量,几种类型和属性
- 常见张量举例:向量,序列,图像,视频
- 张量操作,切片和批量
大家可以点击下面的“ 了解更多 ”,或搜索“ 马上学123 ”,在线观看PPT讲义。
什么是张量?
上一节例子使用的数据存储在多维 Numpy 数组中, 也叫张量(tensor)。 一般来说, 当前所有机器学习系统都使用张量作为基本数据结构。 张量对这个领域非常重要, 重要到 Google 的TensorFlow 都以它来命名。
那么什么是张量? 张量是一个数字容器, 包含数值数据。
我们熟悉的矩阵,它是二维张量。 张量是矩阵向任意维度(dimension)的推广, 我们接下来介绍几种常用的张量。
标量(0D 张量)
只包含一个数字的张量叫作标量, 在 Numpy中, 一个float64的数字就是一个标量张量, 它有 0 个维度。
>>> import numpy as np>>> x = np.array(12)>>> xarray(12)>>> x.ndim0
向量(1D 张量)
数字组成的数组叫作向量(vector) 或一维张量(1D 张量)。
下面是一个 Numpy 向量:
>>> x = np.array([12, 3, 6, 14, 7])>>> xarray([12, 3, 6, 14, 7])>>> x.ndim1
矩阵(2D 张量)
向量组成的数组叫作矩阵(matrix) 或二维张量(2D 张量), 可理解为数字组成的矩形网格。
张量的维度(dimension)通常叫作轴, 矩阵有 2 个轴(通常叫作行和列)。
下面是一个 Numpy 矩阵:
>>> x = np.array([ [5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]])>>> x.ndim2
第一个轴上的元素叫作行(row), 第二个轴上的元素叫作列(column)。
3D 张量与更高维张量
将多个矩阵组合成一个新的数组, 可以得到一个** 3D 张量**, 可理解为数字组成的立方体。
下面是一个 Numpy 的 3D 张量:
>>> 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
将多个 3D 张量组合成一个数组, 可以创建一个 4D 张量, 以此类推。
常用的数据张量举例: 向量数据
我们需要处理的数据主要是下面几种:
- 向量数据:2D张量,形状为 (samples, features)。 其中第一个轴是样本轴,第二个轴是特征轴。
例如: 人口统计数据集, 其中包括每个人的年龄、邮编和收入。 每个人可以表示为包含 3 个值的向量, 而整个数据集包含 100 000 个人, 因此可以存储在形状为 (100000, 3) 的 2D张量中。
常用的数据张量举例: 序列数据
- 时间序列数据或序列数据:3D 张量,形状为 (samples, timesteps, features)。根据惯例,时间轴始终是第 2 个轴。

时间序列数据
例如: 股票价格数据集, 每一分钟,我们将股票的当前价格、 前一分钟的最高价格和 前一分钟的最低价格保存下来。 因此每分钟被编码为一个 3D 向量, 整个交易日被编码为一个形状为 (390, 3) 的 2D 张量 (一个交易日有 390 分钟), 而 250 天的数据则可以保存在 一个形状为 (250, 390, 3) 的 3D 张量中。 这里每个样本是一天的股票数据。
常用的数据张量举例: 图像
- 图像:4D 张量,形状为 (samples, height, width, channels)。

图像通常具有三个维度:高度、宽度和颜色深度
图像通常具有三个维度:高度、宽度和颜色深度, 如果图像大小为 256×256, 128 张彩色图像组成的批量 可以保存在一个形状为 (128, 256, 256, 3) 的张量中。 灰度图像的彩色通道只有一维,形状为 (128, 256, 256, 1)。
常用的数据张量举例: 视频
- 视频:5D 张量,形状为 (samples, frames, height, width, channels)。
视频数据是现实生活中 需要用到 5D 张量的少数数据类型之一。
视频可以看作一系列帧, 每一帧都是一张彩色图像。 一系列帧可以保存在一个形状为 (frames, height, width, color_depth) 的 4D 张量中, 而不同视频组成的批量则可以保存在一个 5D 张量中, 其形状为(samples, frames, height, width, color_depth)。
例如, 一个以每秒 4 帧采样的 60 秒视频片段, 这个视频共有 240 帧, 视频尺寸为 144×256, 4 个这样的视频组成的批量将保存在 形状为 (4, 240, 144, 256, 3)的张量中。
张量属性
张量是由以下三个关键属性来定义的:
- 轴的个数(阶): 例如,3D张量有3个轴,矩阵有2个轴, Python 库中也叫ndim。
- 形状: 这是一个整数元组, 表示张量沿每个轴的维度大小(元素个数)。 例如,矩阵形状为 (3, 5),3D张量为 (3, 3, 5), 向量为 (5,),而标量的形状为空,即 ()。
- 数据类型: 在 Python 库中通常叫作dtype, 例如,张量的类型可以是 float32、uint8、float64 等。
代码演示:
import tensorflow as tfmnist = tf.keras.datasets.mnist(train_images , train_labels), (test_images, test_labels) = mnist.load_data()# 张量 train_images 的轴的个数3,即 ndim 属性print(train_images.ndim)# 形状 (60000, 28, 28)print(train_images.shape)# 数据类型 uint8,即 dtype 属性。print(train_images.dtype)
张量切片
在前面的例子中, 我们使用语法 train_images[i] 来选择沿着第一个轴的特定数字。
选择张量的特定元素叫作张量切片, 我们来看一下 Numpy 数组上的张量切片运算。
下面这个例子选择 第 10~100 个数字(不包括第 100 个), 并将其放在形状为 (90, 28, 28) 的数组中。
>>> my_slice = train_images[10:100]>>> print(my_slice.shape)(90, 28, 28)
它等同于下面这个更复杂的写法:
my_slice1 = train_images[10:100, :, :] my_slice2 = train_images[10:100, 0:28, 0:28]
给出了切片沿着每个张量轴的起始索引和结束索引。
数据批量的概念
通常来说, 深度学习中数据张量的第一个轴都是样本轴。 在 MNIST 的例子中,样本就是数字图像, 此外,深度学习模型不会同时处理整个数据集, 而是将数据拆分成小批量。
下面我们用张量切片拆分第一个128的批量大小:
batch = train_images[:128]
总结:
- 张量是一个数字容器,包含数值数据。
- 常见张量举例:2D向量,3D序列,4D图像,5D视频
- 选择张量的特定元素叫作张量切片
- 深度学习模型不会同时处理整个数据集, 而是将数据拆分成小批量。
这里讲了三点,关键词有哪几个?
问题:维度和轴有什么区别呢?
欢迎回复评论!
马上学,很简单!