Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

神经网络的数据表示 #555

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
一般来说,当前所有机器学习系统都使用张量作为基本数据结构。

**张量**(*tensor*)这一概念的核心在于,它是一个数据容器,它是数字的容器。
**张量可以看作是矩阵向任意维度的推广**,张量的**维度**通常叫作**轴**。

张量的维度(轴)我们该怎么理解?我的建议是通过坐标轴来判断:

- 对于一个数字来说,我们可以直接获取它的值,它没有维度,我们称它为**标量**(0维张量)
- 对于*x*轴来说,我们需要指定*x*轴上的位置来获取值,它有一个维度,我们称它为**向量**(1维张量)
- 对于平面坐标系来说,我们需要同时指定*x*轴和*y*轴的值来获取值,它有两个维度,我们称它为**矩阵**(2维张量)
- 在一个空间坐标系中,我们需要指定*x*轴、*y*轴和*z*轴的值来获取值,它有三个维度,我们称它为3维张量

以此类推...

</br>

下面依次介绍相关概念:

</br>

### 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)