diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 46d787f..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 5d47bf2..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/openmlsys-zh.iml b/.idea/openmlsys-zh.iml deleted file mode 100644 index d0876a7..0000000 --- a/.idea/openmlsys-zh.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/chapter_programming_model/index.md b/chapter_programming_interface/index.md similarity index 93% rename from chapter_programming_model/index.md rename to chapter_programming_interface/index.md index c8a2dc4..0dcdccd 100644 --- a/chapter_programming_model/index.md +++ b/chapter_programming_interface/index.md @@ -43,7 +43,7 @@ API从而可以快速导入已有的模型, ## 机器学习工作流 -机器学习系统编程模型的首要设计目标是:对开发者的整个工作流进行完整的编程支持。一个常见的机器学习任务一般包含如图:numref:`img_workflow`所示的流程。这个工作流完成了训练数据集的读取,模型的训练,测试和调试。通过归纳,我们可以将这一工作流中用户所需要自定义的部分通过定义以下API来支持(我们这里假设用户的高层次API以Python函数的形式提供): +机器学习系统编程模型的首要设计目标是:对开发者的整个工作流进行完整的编程支持。一个常见的机器学习任务一般包含如图:numref:`img_workflow`所示的流程。这个工作流完成了训练数据集的读取,模型的训练,测试和调试。通过归纳,我们可以将这一工作流中用户所需要自定义的部分通过定义以下API来支持(我们这里假设用户的高层次API以Python函数的形式提供): - **数据处理:** 首先,用户需要数据处理API来支持将数据集从磁盘读入。进一步,用户需要对读取数据进行数据预处理,从而可以将数据输入后续的机器学习模型中。 @@ -246,20 +246,20 @@ output = model.predict(Tensor(data['image'])) 神经网络层包含构建机器学习网络结构的基本组件,如计算机视觉领域常用到卷积(Convolution)、池化(Pooling)、全连接(Fully Connected);自然语言处理常用到循环神经网络(Recurrent Neural Network,RNN);为了加速训练,防止过拟合通常用到批标准化(BatchNorm)、Dropout等。 **全连接**是将当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换;可以将数据从高维映射到低维,也能从低维映射到高维度。 -图numref:`fc_layer`展示了全连接的过程,对输入的n个数据变换到另一个大小为m的特征空间,再从大小为m的特征空间变换到大小为p的特征空间;可见全连接层的参数量巨大,两次变换所需的参数大小为$n \times m$和$m \times p$。 +图:numref:`fc_layer`展示了全连接的过程,对输入的n个数据变换到另一个大小为m的特征空间,再从大小为m的特征空间变换到大小为p的特征空间;可见全连接层的参数量巨大,两次变换所需的参数大小为$n \times m$和$m \times p$。 ![全连接层](../img/ch02/fc_layer_1.png) :width:`400px` :label:`fc_layer` **卷积**操作是卷积神经网络中常用的操作之一,卷积相当于对输入进行滑动滤波。根据卷积核(Kernel)、卷积步长(Stride)、填充(Padding)对输入数据从左到右,从上到下进行滑动,每一次滑动操作是矩阵的乘加运算得到的加权值。 -如图numref:`conv_comp`卷积操作主要由输入、卷积核、输出组成输出又被称为特征图(Feature Map)。 +如图:numref:`conv_comp`卷积操作主要由输入、卷积核、输出组成输出又被称为特征图(Feature Map)。 ![卷积操作的组成](../img/ch02/conv_component.png) :width:`400px` :label:`conv_comp` -卷积的具体运算过程我们通过图numref:`single_conv`进行演示。该图输入为$4 \times 4$的矩阵,卷积核大小为$3 \times 3$,卷积步长为1,不填充,最终得到的$2 \times 2$的输出矩阵。 +卷积的具体运算过程我们通过图:numref:`single_conv`进行演示。该图输入为$4 \times 4$的矩阵,卷积核大小为$3 \times 3$,卷积步长为1,不填充,最终得到的$2 \times 2$的输出矩阵。 计算过程为将$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步,再进行从左往右移动;依次操作直到从上往下再移动也出界时,结束整个卷积过程,得到输出结果。我们不难发现相比于全连接,卷积的优势是参数共享(同一个卷积核遍历整个输入图)和参数量小(卷积核大小即是参数量)。 @@ -270,21 +270,21 @@ output = model.predict(Tensor(data['image'])) 在卷积过程中,如果我们需要对输出矩阵大小进行控制,那么就需要对步长和填充进行设置。还是上面的输入图,如需要得到和输入矩阵大小一样的输出矩阵,步长为1时就需要对上下左右均填充一圈全为0的数。 在上述例子中我们介绍了一个输入一个卷积核的卷积操作。通常情况下我们输入的是彩色图片,有三个输入,这三个输入称为通道(Channel),分别代表红、绿、蓝(RGB)。此时我们执行卷积则为多通道卷积,需要三个卷积核分别对RGB三个通道进行上述卷积过程,之后将结果加起来。 -具体如图numref:`channels_conv`描述了一个输入通道为3,输出通道为1,卷积核大小为$3 \times 3$,卷积步长为1的多通道卷积过程;需要注意的是,每个通道都有各自的卷积核,同一个通道的卷积核参数共享。如果输出通道为$out_c$,输入通道为$in_c$,那么需要$out_c$$\times$$in_c$个卷积核。 +具体如图:numref:`channels_conv`描述了一个输入通道为3,输出通道为1,卷积核大小为$3 \times 3$,卷积步长为1的多通道卷积过程;需要注意的是,每个通道都有各自的卷积核,同一个通道的卷积核参数共享。如果输出通道为$out_c$,输入通道为$in_c$,那么需要$out_c$$\times$$in_c$个卷积核。 ![多通道卷积](../img/ch02/channels_conv.png) :width:`400px` :label:`channels_conv` **池化**是常见的降维操作,有最大池化和平均池化。池化操作和卷积的执行类似,通过池化核、步长、填充决定输出;最大池化是在池化核区域范围内取最大值,平均池化则是在池化核范围内做平均。与卷积不同的是池化核没有训练参数;池化层的填充方式也有所不同,平均池化填充的是0,最大池化填充的是$-inf$。 -图numref:`pooling`是对$4 \times 4$的输入进行$2 \times 2$区域池化,步长为2,不填充;图左边是最大池化的结果,右边是平均池化的结果。 +图:numref:`pooling`是对$4 \times 4$的输入进行$2 \times 2$区域池化,步长为2,不填充;图左边是最大池化的结果,右边是平均池化的结果。 ![池化操作](../img/ch02/pooling.png) :width:`400px` :label:`pooling` -有了卷积、池化、全连接组件就可以构建一个非常简单的卷积神经网络了,图numref:`nn_network`展示了一个卷积神经网络的模型结构。 -给定输入$3 \times 64 \times 64$的彩色图片,使用16个$3 \times 3$3大小的卷积核做卷积,得到大小为$16 \times 64 \times 64$; +有了卷积、池化、全连接组件就可以构建一个非常简单的卷积神经网络了,图:numref:`nn_network`展示了一个卷积神经网络的模型结构。 +给定输入$3 \times 64 \times 64$的彩色图片,使用16个$3 \times 3$大小的卷积核做卷积,得到大小为$16 \times 64 \times 64$; 再进行池化操作降维,得到大小为$16 \times 32 \times 32$的特征图; 对特征图再卷积得到大小为$32 \times 32 \times 32$特征图,再进行池化操作得到$3 \times 16 \times 16$大小的特征图; 我们需要对特征图做全连接,此时需要把特征图平铺成一维向量这部操作称为Flatten,压平后输入特征大小为$3\times 16 \times 16 = 768$; @@ -339,7 +339,7 @@ Transformer又是BERT模型架构的重要组成。随着深度神经网络的 如MindSpore提供的mindspore.nn.Cell、mindspore.nn.Conv2d、mindspore.dataset; PyTorch提供的torch.nn.Module、torch.nn.Conv2d、torch.utils.data.Datset。 -图numref:`model_build`描述了神经网络构建过程中的基本细节。 +图:numref:`model_build`描述了神经网络构建过程中的基本细节。 神经网络层需要的功能有该层的训练参数(变量,包括初始化方法和训练状态)以及计算过程; 神经网络模型需要的功能是对神经网络层管理和神经网络层参数的管理。 在机器学习编程库中,承担此功能有MindSpore的Cell、PyTorch的Module。 @@ -352,7 +352,7 @@ Cell和Module是模型抽象方法也是所有网络的基类。 :width:`400px` :label:`model_build` -图numref:`cell_abs`展示了设计神经网络层抽象方法的通用表示。通常在构造器会选择使用Python中collections模块的OrderedDict来初始化神经网络层和神经网络层参数的存储;它的输出是一个有序的,相比与Dict更适合深度学习这种模型堆叠的模式。参数和神经网络层的管理是在\_\_setattr\_\_中实现的,当检测到属性是属于神经网络层及神经网络层参数时就记录起来。神经网络模型比较重要的是计算连接过程,可以在\_\_call\_\_里重载,实现神经网络层时在这里定义计算过程。训练参数的返回接口是为了给优化器传所有训练参数。神经网络层返回为了遍历各层神经网络得到各个神经网络层的参数。这里只列出了一些重要的方法,在自定义方法中,通常需要实现参数插入删除方法、神经网络层插入删除、神经网络模型信息等。 +图:numref:`cell_abs`展示了设计神经网络层抽象方法的通用表示。通常在构造器会选择使用Python中collections模块的OrderedDict来初始化神经网络层和神经网络层参数的存储;它的输出是一个有序的,相比与Dict更适合深度学习这种模型堆叠的模式。参数和神经网络层的管理是在\_\_setattr\_\_中实现的,当检测到属性是属于神经网络层及神经网络层参数时就记录起来。神经网络模型比较重要的是计算连接过程,可以在\_\_call\_\_里重载,实现神经网络层时在这里定义计算过程。训练参数的返回接口是为了给优化器传所有训练参数。神经网络层返回为了遍历各层神经网络得到各个神经网络层的参数。这里只列出了一些重要的方法,在自定义方法中,通常需要实现参数插入删除方法、神经网络层插入删除、神经网络模型信息等。 ![神经网络基类抽象方法](../img/ch02/cell_abstract.png) :width:`400px` diff --git a/index.md b/index.md index 58ca21d..4713e0d 100644 --- a/index.md +++ b/index.md @@ -5,5 +5,5 @@ :numbered: chapter_introduction/index -chapter_programming_model/index +chapter_programming_interface/index chapter_computational_graph/index \ No newline at end of file