大家好,今天我们学习【马上学tensorflow 2.0】之 神经网络中资料如何表示。
我们 马上学三点 :
什么是张量,几种型别和属性常见张量举例:向量,序列,影象,视讯张量操作,切片和批量大家可以点选下面的“ 了解更多 ”,或搜寻“ 马上学123 ”,线上观看PPT讲义。
什么是张量?
上一节例子使用的资料储存在多维 Numpy 阵列中, 也叫张量(tensor)。 一般来说, 当前所有机器学习系统都使用张量作为基本资料结构。 张量对这个领域非常重要, 重要到 Google 的TensorFlow 都以它来命名。那么什么是张量? 张量是一个数字容器, 包含数值资料。
我们熟悉的矩阵,它是二维张量。 张量是矩阵向任意维度(dimension)的推广, 我们接下来介绍几种常用的张量。
标量(0D 张量)
只包含一个数字的张量叫作标量, 在 Numpy中, 一个float64的数字就是一个标量张量, 它有 0 个维度。>>> import numpy as np
>>> x = np.array(12)
>>> x
array(12)
>>> x.ndim
0
向量(1D 张量)
数字组成的阵列叫作向量(vector) 或一维张量(1D 张量)。下面是一个 Numpy 向量:
>>> x = np.array([12, 3, 6, 14, 7])
>>> x
array([12, 3, 6, 14, 7])
>>> x.ndim
1
矩阵(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.ndim
2
第一个轴上的元素叫作行(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 tf
mnist = 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视讯选择张量的特定元素叫作张量切片深度学习模型不会同时处理整个资料集, 而是将资料拆分成小批量。这里讲了三点,关键词有哪几个?问题:维度和轴有什么区别呢?
欢迎回复评论!
马上学,很简单!