mirror of
https://github.com/openmlsys/openmlsys-zh.git
synced 2026-04-05 11:47:55 +08:00
Update STYLE_GUIDE
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
## 机器学习系统编程模型的演进
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`img_framedh`
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
- **测试和调优:**
|
||||
训练过程中,用户需要测试API来对当前模型的精度进行评估。当精度达到目标后,训练结束。这一过程中,用户往往需要调试API来完成对模型的性能和正确性进行验证。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`img_workflow`
|
||||
|
||||
|
||||
@@ -9,14 +9,14 @@
|
||||
**全连接**是将当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换;可以将数据从高维映射到低维,也能从低维映射到高维度。
|
||||
图2.3.1展示了全连接的过程,对输入的n个数据变换到另一个大小为m的特征空间,再从大小为m的特征空间变换到大小为p的特征空间;可见全连接层的参数量巨大,两次变换所需的参数大小为$n \times m$和$m \times p$。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`fc_layer`
|
||||
|
||||
**卷积**操作是卷积神经网络中常用的操作之一,卷积相当于对输入进行滑动滤波。根据卷积核(Kernel)、卷积步长(Stride)、填充(Padding)对输入数据从左到右,从上到下进行滑动,每一次滑动操作是矩阵的乘加运算得到的加权值。
|
||||
如图2.3.2卷积操作主要由输入、卷积核、输出组成输出又被称为特征图(Feature Map)。
|
||||
|
||||

|
||||

|
||||
: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步,再进行从左往右移动;依次操作直到从上往下再移动也出界时,结束整个卷积过程,得到输出结果。我们不难发现相比于全连接,卷积的优势是参数共享(同一个卷积核遍历整个输入图)和参数量小(卷积核大小即是参数量)。
|
||||
|
||||

|
||||

|
||||
: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$个卷积核。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`channels_conv`
|
||||
|
||||
**池化**是常见的降维操作,有最大池化和平均池化。池化操作和卷积的执行类似,通过池化核、步长、填充决定输出;最大池化是在池化核区域范围内取最大值,平均池化则是在池化核范围内做平均。与卷积不同的是池化核没有训练参数;池化层的填充方式也有所不同,平均池化填充的是0,最大池化填充的是$-inf$。
|
||||
图2.3.5是对$4 \times 4$的输入进行$2 \times 2$区域池化,步长为2,不填充;图左边是最大池化的结果,右边是平均池化的结果。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`pooling`
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
之后做一次全连接对大小为768特征变换到大小为128的特征,再依次做两次全连接分别得到64,10。
|
||||
这里最后的输出结果是依据自己的实际问题而定,假设我们的输入是包含$0 \sim 9$的数字图片,做分类那输出对应是10个概率值,分别对应$0 \sim 9$的概率大小。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`nn_network`
|
||||
|
||||
@@ -109,13 +109,13 @@ Cell和Module是模型抽象方法也是所有网络的基类。
|
||||
一种是抽象出两个方法分别为Layer(负责单个神经网络层的参数构建和前向计算),Model(负责对神经网络层进行连接组合和神经网络层参数管理);
|
||||
另一种是将Layer和Modle抽象成一个方法,该方法既能表示单层神经网络层也能表示包含多个神经网络层堆叠的模型,Cell和Module就是这样实现的。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`model_build`
|
||||
|
||||
图2.3.8展示了设计神经网络层抽象方法的通用表示。通常在构造器会选择使用Python中collections模块的OrderedDict来初始化神经网络层和神经网络层参数的存储;它的输出是一个有序的,相比与Dict更适合深度学习这种模型堆叠的模式。参数和神经网络层的管理是在\_\_setattr\_\_中实现的,当检测到属性是属于神经网络层及神经网络层参数时就记录起来。神经网络模型比较重要的是计算连接过程,可以在\_\_call\_\_里重载,实现神经网络层时在这里定义计算过程。训练参数的返回接口是为了给优化器传所有训练参数。神经网络层返回为了遍历各层神经网络得到各个神经网络层的参数。这里只列出了一些重要的方法,在自定义方法中,通常需要实现参数插入删除方法、神经网络层插入删除、神经网络模型信息等。
|
||||
|
||||

|
||||

|
||||
:width:`800px`
|
||||
:label:`cell_abs`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user