Update STYLE_GUIDE

This commit is contained in:
Eric_lai
2022-01-24 17:08:12 +08:00
parent 807a7cd803
commit 809809b568
31 changed files with 12975 additions and 173 deletions

View File

@@ -1,6 +1,6 @@
## 机器学习系统编程模型的演进
![机器学习编程库发展历程](../img/ch02/framework_development_history.png)
![机器学习编程库发展历程](../img/ch02/framework_development_history.svg)
:width:`800px`
:label:`img_framedh`

View File

@@ -19,7 +19,7 @@
- **测试和调优:**
训练过程中用户需要测试API来对当前模型的精度进行评估。当精度达到目标后训练结束。这一过程中用户往往需要调试API来完成对模型的性能和正确性进行验证。
![机器学习系统工作流](../img/ch02/workflow.png)
![机器学习系统工作流](../img/ch02/workflow.svg)
:width:`800px`
:label:`img_workflow`

View File

@@ -9,14 +9,14 @@
**全连接**是将当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换;可以将数据从高维映射到低维,也能从低维映射到高维度。
图2.3.1展示了全连接的过程对输入的n个数据变换到另一个大小为m的特征空间再从大小为m的特征空间变换到大小为p的特征空间可见全连接层的参数量巨大两次变换所需的参数大小为$n \times m$和$m \times p$。
![全连接层](../img/ch02/fc_layer_1.png)
![全连接层](../img/ch02/fc_layer_1.svg)
:width:`800px`
:label:`fc_layer`
**卷积**操作是卷积神经网络中常用的操作之一卷积相当于对输入进行滑动滤波。根据卷积核Kernel、卷积步长Stride、填充Padding对输入数据从左到右从上到下进行滑动每一次滑动操作是矩阵的乘加运算得到的加权值。
如图2.3.2卷积操作主要由输入、卷积核、输出组成输出又被称为特征图Feature Map
![卷积操作的组成](../img/ch02/conv_component.png)
![卷积操作的组成](../img/ch02/conv_component.svg)
:width:`800px`
:label:`conv_comp`
@@ -24,7 +24,7 @@
计算过程为将$3 \times 3$的卷积核作用到左上角$3 \times 3$大小的输入图上;输出为$1 \times 1 + 2 \times 0 + 2 \times 1 + 3 \times 0 + 2 \times 1 + 3 \times 0 + 4 \times 1 + 1 \times 0 + 3 \times 1 = 12$,
同理对卷积核移动1个步长再次执行相同的计算步骤得到第二个输出为11当再次移动将出界时结束从左往右执行从上往下移动1步再进行从左往右移动依次操作直到从上往下再移动也出界时结束整个卷积过程得到输出结果。我们不难发现相比于全连接卷积的优势是参数共享同一个卷积核遍历整个输入图和参数量小卷积核大小即是参数量
![卷积的具体运算过程](../img/ch02/single_channel_conv.png)
![卷积的具体运算过程](../img/ch02/single_channel_conv.svg)
:width:`800px`
:label:`single_conv`
@@ -33,14 +33,14 @@
在上述例子中我们介绍了一个输入一个卷积核的卷积操作。通常情况下我们输入的是彩色图片有三个输入这三个输入称为通道Channel分别代表红、绿、蓝RGB。此时我们执行卷积则为多通道卷积需要三个卷积核分别对RGB三个通道进行上述卷积过程之后将结果加起来。
具体如图2.3.4描述了一个输入通道为3输出通道为1卷积核大小为$3 \times 3$卷积步长为1的多通道卷积过程需要注意的是每个通道都有各自的卷积核同一个通道的卷积核参数共享。如果输出通道为$out_c$,输入通道为$in_c$,那么需要$out_c$$\times$$in_c$个卷积核。
![多通道卷积](../img/ch02/channels_conv.png)
![多通道卷积](../img/ch02/channels_conv.svg)
:width:`800px`
:label:`channels_conv`
**池化**是常见的降维操作有最大池化和平均池化。池化操作和卷积的执行类似通过池化核、步长、填充决定输出最大池化是在池化核区域范围内取最大值平均池化则是在池化核范围内做平均。与卷积不同的是池化核没有训练参数池化层的填充方式也有所不同平均池化填充的是0最大池化填充的是$-inf$。
图2.3.5是对$4 \times 4$的输入进行$2 \times 2$区域池化步长为2不填充图左边是最大池化的结果右边是平均池化的结果。
![池化操作](../img/ch02/pooling.png)
![池化操作](../img/ch02/pooling.svg)
:width:`800px`
:label:`pooling`
@@ -52,7 +52,7 @@
之后做一次全连接对大小为768特征变换到大小为128的特征再依次做两次全连接分别得到6410。
这里最后的输出结果是依据自己的实际问题而定,假设我们的输入是包含$0 \sim 9$的数字图片做分类那输出对应是10个概率值分别对应$0 \sim 9$的概率大小。
![卷积神经网络模型](../img/ch02/nn_network.png)
![卷积神经网络模型](../img/ch02/nn_network.svg)
:width:`800px`
:label:`nn_network`
@@ -109,13 +109,13 @@ Cell和Module是模型抽象方法也是所有网络的基类。
一种是抽象出两个方法分别为Layer负责单个神经网络层的参数构建和前向计算Model负责对神经网络层进行连接组合和神经网络层参数管理
另一种是将Layer和Modle抽象成一个方法该方法既能表示单层神经网络层也能表示包含多个神经网络层堆叠的模型Cell和Module就是这样实现的。
![神经网络模型构建细节](../img/ch02/model_build.png)
![神经网络模型构建细节](../img/ch02/model_build.svg)
:width:`800px`
:label:`model_build`
图2.3.8展示了设计神经网络层抽象方法的通用表示。通常在构造器会选择使用Python中collections模块的OrderedDict来初始化神经网络层和神经网络层参数的存储它的输出是一个有序的相比与Dict更适合深度学习这种模型堆叠的模式。参数和神经网络层的管理是在\_\_setattr\_\_中实现的当检测到属性是属于神经网络层及神经网络层参数时就记录起来。神经网络模型比较重要的是计算连接过程可以在\_\_call\_\_里重载实现神经网络层时在这里定义计算过程。训练参数的返回接口是为了给优化器传所有训练参数。神经网络层返回为了遍历各层神经网络得到各个神经网络层的参数。这里只列出了一些重要的方法在自定义方法中通常需要实现参数插入删除方法、神经网络层插入删除、神经网络模型信息等。
![神经网络基类抽象方法](../img/ch02/cell_abstract.png)
![神经网络基类抽象方法](../img/ch02/cell_abstract.svg)
:width:`800px`
:label:`cell_abs`