深度学习基础
神经网络的数学基础
神经网络的数据表示
-
数据存储在多维 Numpy 数组中,也叫张量(tensor)。一般来说,当前所有机器学习系统都使用张量作为基本数据结构。
-
张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。矩阵是二维张量,张量是矩阵向任意维度的推广,张量的维度(dimension)通常叫作轴(axis)。
标量(0D 张量)
-
仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、0D 张量)。
-
在 Numpy中,一个 float32 或 float64 的数字就是一个标量张量(或标量数组)。
-
你可以用 ndim 属性来查看一个 Numpy 张量的轴的个数,标量张量有0个轴(ndim == 0),张量轴的个数也叫作阶(rank)。
>>> import numpy as np >>> x = np.array(12) >>> x array(12) >>> x.ndim 0
向量(1D 张量)
-
数字组成的数组叫作向量(vector)或一维张量(1D 张量),一维张量只有一个轴。
>>> x = np.array([12, 3, 6, 14, 7]) >>> x array([12, 3, 6, 14, 7]) >>> x.ndim 1
- 这个向量有 5 个元素,所以被称为 5D 向量;
- 5D 向量只有一个轴,沿着轴有5个维度,而 5D 张量有5个轴(沿着每个轴可能有任意个维度);
- 维度(dimensionality)可以表示沿着某个轴上的元素个数(比如 5D 向量),也可以表示张量中轴的个数(比如 5D 张量)。 对于后一种情况,技术上更准确的说法是 5 阶张量(张量的阶数即轴的个数),但 5D 张量这种模糊的写法更常见。
矩阵(2D 张量)
-
向量组成的数组叫作矩阵(matrix)或二维张量( 2D 张量),矩阵有2个轴(通常叫作行和列)。
>>> x = np.array([[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]]) >>> x.ndim 2
- 第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column);
- [5, 78, 2, 34, 0] 是 x 的第一行, [5, 6, 7] 是第一列。
3D 张量与更高维张量
-
将多个矩阵组合成一个新的数组,可以得到一个 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 张量,以此类推。深度学习处理的一般是 0D 到 4D 的张量,但处理视频数据时可能会遇到 5D 张量。
关键属性
-
张量是由以下三个关键属性来定义的:
- 轴的个数(阶)
- 例如,3D 张量有3个轴,矩阵有2个轴。
- 这在 Numpy 等 Python 库中也叫张量的 ndim。
- 形状
- 这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。
- 例如,矩阵示例的形状为 (3, 5), 3D 张量示例的形状为 (3, 3, 5)。
- 向量的形状只包含一个元素,比如 (5, ),而标量的形状为空,即 ()。
- 数据类型
- 在 Python 库中通常叫作 dtype。
- 这是张量中所包含数据的类型。
- 例如,张量的类型可以是 float32、 uint8、 float64 等。
- 在极少数情况下,你可能会遇到字符(char)张量。
- Numpy(以及大多数其他库)中不存在字符串张量,因为张量存储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。
- 轴的个数(阶)
-
为了具体说明,使用 MNIST 例子中处理的数据。
扫描二维码关注公众号,回复: 5257844 查看本文章-
首先加载 MNIST 数据集:
from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
-
接下来,我们给出张量 train_images 的轴的个数,即 ndim 属性:
>>> print(train_images.ndim) 3
-
下面是它的形状:
>>> print(train_images.shape) (60000, 28, 28)
-
下面是它的数据类型,即 dtype 属性:
>>> print(train_images.dtype) uint8
-
所以,这里 train_images 是一个由8位整数组成的 3D 张量。更确切地说,它是60000个矩阵组成的数组,每个矩阵由28×28个整数组成。每个这样的矩阵都是一张灰度图像,元素取值范围为0~255。
-
我们用 Matplotlib 库来显示这个 3D 张量中的第4个数字(数据集中的第4个样本):
# 显示第 4 个数字 digit = train_images[4] import matplotlib.pyplot as plt plt.imshow(digit, cmap=plt.cm.binary) plt.show()
-