diff --git "a/A-\345\237\272\347\241\200\346\225\231\347\250\213/A2-\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\346\234\254\345\216\237\347\220\206\347\256\200\346\230\216\346\225\231\347\250\213/Step1 - BasicKnowledge/\347\245\236\347\273\217\347\275\221\347\273\234\347\232\204\346\225\260\346\215\256\350\241\250\347\244\272.md" "b/A-\345\237\272\347\241\200\346\225\231\347\250\213/A2-\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\346\234\254\345\216\237\347\220\206\347\256\200\346\230\216\346\225\231\347\250\213/Step1 - BasicKnowledge/\347\245\236\347\273\217\347\275\221\347\273\234\347\232\204\346\225\260\346\215\256\350\241\250\347\244\272.md" new file mode 100644 index 000000000..325119612 --- /dev/null +++ "b/A-\345\237\272\347\241\200\346\225\231\347\250\213/A2-\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\346\234\254\345\216\237\347\220\206\347\256\200\346\230\216\346\225\231\347\250\213/Step1 - BasicKnowledge/\347\245\236\347\273\217\347\275\221\347\273\234\347\232\204\346\225\260\346\215\256\350\241\250\347\244\272.md" @@ -0,0 +1,108 @@ +一般来说,当前所有机器学习系统都使用张量作为基本数据结构。 + +**张量**(*tensor*)这一概念的核心在于,它是一个数据容器,它是数字的容器。 +**张量可以看作是矩阵向任意维度的推广**,张量的**维度**通常叫作**轴**。 + +张量的维度(轴)我们该怎么理解?我的建议是通过坐标轴来判断: + +- 对于一个数字来说,我们可以直接获取它的值,它没有维度,我们称它为**标量**(0维张量) +- 对于*x*轴来说,我们需要指定*x*轴上的位置来获取值,它有一个维度,我们称它为**向量**(1维张量) +- 对于平面坐标系来说,我们需要同时指定*x*轴和*y*轴的值来获取值,它有两个维度,我们称它为**矩阵**(2维张量) +- 在一个空间坐标系中,我们需要指定*x*轴、*y*轴和*z*轴的值来获取值,它有三个维度,我们称它为3维张量 + +以此类推... + +
+ +下面依次介绍相关概念: + +
+ +### 1. 标量(0D张量) +仅包含一个数字的张量叫作**标量**(*scalar*,也叫标量张量、零维张量、0D张量)。 + +在Numpy中,我们可以用`ndim`属性来查看一个Numpy张量的轴的个数。 + +标量张量有0个轴(`ndim == 0`),张量轴的个数也叫作**阶**(*rank*) + +``` +>>> import numpy as np +>>> x = np.array(8) +>>> x +array(8) +>>> x.ndim +0 +``` + +### 2. 向量(1D张量) +标量(数字)组成的数组叫作**向量**(*vector*)或一维张量(1D张量)。一维张量只有一个轴,阶为1 +``` +>>> x = np.array([1,2,3,4,5]) +>>> x +array([1,2,3,4,5]) +>>> x.ndim +1 +``` + +### 3. 矩阵(2D张量) +向量组成的数组叫作**矩阵**(*matrix*)或二维张量(2D张量)。矩阵有两个轴,阶为2 +``` +>>> x = np.array([[1,21,3,42,5], + [6,12,4,19,8], + [7,28,5,31,9]]) +>>> x.ndim +2 +``` +第一个轴称为**行**(*row*),第二个轴称为**列**(*column*)。 + +在上面的例子中,`[1,21,3,42,5]`是`x`的第一行, `[1,6,7]`是第一列 + + +### 4. 3D张量与更高维张量 +将多个矩阵组合成一个新的数组,可以得到一个3D张量 +``` +>>> x = np.array([ [ [1,21,3,42,5], + [6,12,4,19,8], + [7,28,5,31,9] ], + [ [1,21,3,42,5], + [6,12,4,19,8], + [7,28,5,31,9] ], + [ [1,21,3,42,5], + [6,12,4,19,8], + [7,28,5,31,9] ] ]) +>>> x.ndim +3 +``` +将多个3D张量组合成一个数组,可以创建一个4D张量,以此类推。 + +深度学习处理一般是0D到4D的张量,但处理视频数据时可能会遇到5D张量 + +### 5. 关键属性 +- **轴的个数(阶)**(`ndim`)。张量的维度称为轴, 轴的个数称为阶。例如3D张量有3个轴, 矩阵有2个轴 +- **形状**(`shape`)。这是一个整型数组, 表示张量每个轴的大小(元素个数)。例如示例矩阵的形状为(3, 5), 3D张量示例的形状为(3, 3, 5), 向量的形状只包含一个轴,因此为(5,) +- **数据类型**(`dtype`)。这是张量中所包含数据的类型。例如张量的类型可以是`float32`、`uint8`、`float64` + +### 6. 数据张量 +- **向量数据**: 2D张量,形状为`(samples, features)` + + 第一个轴是**样本轴**, 第二个轴是**特征轴** + + 例如100000个人,每个人有3个特征: (100000, 3) + +- **时间序列数据**或**序列数据**: 3D张量, 形状为`(samples, timesteps, features)` + + 当时间(或序列顺序)对于数据很重要时, 应该将数据存储在带有时间轴的3D张量中 + + 根据惯例,时间轴始终是第2个轴。例如250天,每天390分钟股票价格数据集: (250, 390, 3) + +- **图像**: 4D张量, 形状为`(samples, height, width, channels)`或`(samples, channels, height, width)` + + 图像通常具有三个维度: 高度、宽度和颜色深度 + + 例如128张256x256彩色图像组成的批量: (128, 256, 256, 3) + +- **视频**: 5D张量, 形状为`(samples, frames, height, width, channels)`或`(samples, frames, channels, height, width)` + + 视频可以看作一系列帧, 每一帧都是一张彩色图像 + + 例如4个240帧、尺寸为144x256的视频组成的批量: (4, 240, 144, 256, 3)