diff --git a/INFO.md b/INFO.md index 1bb67bb..e614d18 100644 --- a/INFO.md +++ b/INFO.md @@ -14,7 +14,7 @@ python setyp.py install 当然构建PDF必须要有LaTeX,如安装[Tex Live](https://www.tug.org/texlive/). ## 编译HTML版本 -在编译前先下载[openmlsys-zh](),所有的编译命令都在改文件目录内执行。 +在编译前先下载[openmlsys-zh](https://github.com/openmlsys/openmlsys-zh) 所有的编译命令都在改文件目录内执行。 ``` git clone git@github.com:openmlsys/openmlsys-zh.git cd openmlsys-zh diff --git a/STYLE_GUIDE.md b/STYLE_GUIDE.md index dbc2004..5bcfb5a 100644 --- a/STYLE_GUIDE.md +++ b/STYLE_GUIDE.md @@ -1,178 +1,62 @@ # 样式规范 +从LaTeX迁移到Markdown。工具列表: +* [Pandoc:](https://pandoc.org/getting-started.html) LaTeX转换为Markdown。 +* [Inkscape:](https://inkscape.org/release/inkscape-1.1.1/) pdf图片文件转换成svg图片文件 + +书写内容: +* 页面划分:每章建一个目录,以一级子章节的维度建一个md页面,[参考地址](https://github.com/openmlsys/openmlsys-zh/tree/master/chapter_programming_interface) 。 +* 图存放位置: openmlsys-zh/img/自己章节,如openmlsys-zh/img/ch01,把自己章节的图片全部放置在对应目录。 ## 文本 -* 章节 - * 每章开头对全章做介绍 - * 结构标题一致 - * 小结 - * 练习 - * 扫码直达讨论区 - * 参考文献(如有) - * 引用 - * 在每节结尾处引用 -* 字符串 - * 使用中文双引号 -* 符号描述 - * 时刻t(不是t时刻) - * 形状使用英文标点 - * (10, 20) 不是 (10,20) -* 空格: - * 文本中中文和英文、数字、数学公式、特殊字体等之间不要加空格 - * 非行首的`:numref:`、`:cite:`等前留有一个英文空格(否则网页不渲染) - * 代码注释同上 -* 人称 - * 第一人称 → 我们 - * 第二人称 → 读者、你、大家 -* 工具或部件 - * Gluon, MXNet, NumPy, spaCy, ResNet-18, Fashion-MNIST, matplotlib - * 这些都作为词,不要带重音符 - * `backward`函数 - * 不是“`backward()`函数” (不要带括号) - * `for`循环 -* 术语 - * 统一使用 - * 函数(非方法) - * 实例(非对象) - * 区分:超参数和参数 - * 区分:小批量随机梯度下降和随机梯度下降 - * 权重、偏差、标签 - * 模型训练、模型预测(推断) - * 训练数据集、验证数据集、测试数据集 - * 中文优先于英文 - * 首次出现,注明原英文术语 - * 无须加粗 - * 无须加引号 - * 中英文对照统一标准 - * https://github.com/mli/gluon-tutorials-zh/blob/master/README.md - -## 数学 - -* 数学符号样式一致 - * https://github.com/goodfeli/dlbook_notation/blob/master/notation_example.pdf -* 书本页宽限制 - * 每行长度 -* 引用 - * 上式和下式 - * 以上N式,以下N式 -* 公式末放英文标点 - * 逗号:, - * 句号:. -* 赋值符号 - * \leftarrow - +* LaTeX文件转换Markdown文件 + * Linux下安装Pandoc命令:agt-get install pandoc + * 使用Pandoc命令:pandoc -s example.tex -o example.md +* 使用Pandoc转换后需要注意修改的地方 + * 图片需要手动改 + * 公式部分可能会有不正确,需要注意 + * 代码部分需要手动改,样式如下: + ```python + ```python + import os + import argparse + ``` +``` + ## 图片 * 软件 - * 使用OmniGraffle制图,以100%的大小导出pdf(infinite canvas),再使用pdf2svg转成svg + * 使用PPT制图,以pdf导出,再使用Inkscape转成svg。 + * Inkscape软件使用: + * 用Inkscape打开pdf,渐变曲线精细度选择为精细。 + ![Inkscape打开PDF](./img/guide/step1.png) + * 选中图片,我们可以看到图和其白底 + ![1](./img/guide/step2.png) + * 随意找一块能选择的图,此时会出现周边有虚框 + ![2](./img/guide/step3.png) + * 按住ctrl拉一下白色框,此时能将图片和白框分离出来,按Delete删除白框。 + ![3](./img/guide/step4.png) + * 选择文件-文档属性-缩放页面内容-缩放页面到绘图或选区。 + ![4](./img/guide/step5.png) + * 最后保存图片,用Pycharm看图片效果如下:无白色底,大小刚好框住整图。 + ![5](./img/guide/step6.png) + * 样式 * 格式: - * svg - * png - * export resolution: 144 - * 大小: - * 横向:不超过400像素 - * 纵向:不超过200像素 - * 粗细: - * StickArrow - * 1pt - * arrow head size: 50% - * 字体: - * 英文:STIXGeneral, 9pt(下标和上标:6pt) - * 中文:PingFang SC, 9pt - * 下标和上标中的数字和括号不要斜体 - * 颜色: - * 非填充深蓝色(与黑相近): - * 5B7DAA - * 填充蓝色(与黑对比) - * 深:66BFFF - * 淡:B2D9FF + * svg:自己绘制的图片需要用svg,注意去掉白底 + * png:一些常规举例图片不需去除白底的可以使用png + * md里插入图片,大小选择800个像素,label自动生成,例如: + ```python + ![机器学习系统工作流](../img/ch02/workflow.svg) + :width:`800px` + :label:`img_workflow` + ``` + * 版权 * 不使用网络图片 * 位置 * 两张图不可以较邻近 * 两张图拼一下 * 引用 - * 手动引用(例如,图7.1) -* matplotlib - * 大小 - * 分辨率 - -## 代码 - -* 使用utils.py封装多次使用函数 - * 首次出现函数,书里给出函数实现 -* Python规范一致 - * PEP8 - * 二元操作符换行:操作符和后一元一起换行 (https://www.python.org/dev/peps/pep-0008/#should-a-line-break-before-or-after-a-binary-operator) -* 将相邻赋值语句尽可能合并为同一行 - * 如 num_epochs, lr = 5, 0.1 -* 变量名一致 - * num_epochs - * 迭代周期 - * num_hiddens - * 隐藏单元个数 - * num_inputs - * 输入个数 - * num_outputs - * 输出个数 - * net - * 模型 - * lr - * 学习率 - * acc - * 准确率 - * 迭代中 - * 特征:X - * 标签:y, y_hat 或 Y, Y_hat - * for X, y in data_iter - * 数据集: - * 特征:features或images - * 标签:labels - * DataLoader实例:train_iter, test_iter, data_iter -* 注释 - * 中文 - * 句末不加句号 -* 书本页宽限制 - * 每行不超过78字符 - * In [X]: 79字符不会自动换行(X = 1, ..., 9) - * In [XX]: 78字符不会自动换行(XX = 10, 11, ..., 99) - * 打印结果自动换行 -* imports - * import alphabetically - * from mxnet.gluon import data as gdata, loss as gloss, nn, utils as gutils -* 打印名称 - * epoch(从1开始计数), lr, loss, train acc, time - * 5行左右 -* 打印变量 - * 代码块最后一行尽量不用print()语句,例如`x, y`而不是`print('x:', x, 'y:', y)` -* 字符串 - * 使用单引号 -* 其他 - * nd.f(x) → x.nd - * random_normal → random.normal - * multiple imports - * .1 → 1.0 - * 1. → 1.0 - * remove namescope - -## 超链接 - -* 内链格式 - * [“线性回归”](linear-reg.md)一节 -* 外链 - * [层](http:bla) - * 无须暴露URL - -## 英翻汉的常见问题 - -* 遇到不确定的地方,可以翻阅中文版第一版的处理方法(即我们需要遵照的出版标准),以及查阅人工翻译 http://www.jukuu.com/ -* 建立中英文术语对照表,全书术语翻译要完全一致。 -* 语法要正确(如不能缺主语、谓语)、句子要通顺(硬翻不妥就意译)、不要漏内容。 -* 代码注释要翻译。注意:i) 每行不要超过78字符,注释末尾不用加句号。 ii) # 后要空一个半角字符(英文空格)。iii) 如果注释与代码同行,# 前要空两个半角字符(英文空格)。iv)保留注释中的``符号(为了表示代码部分,如变量名、函数名等)。v)注释中中文和英文之间不要空格。vi)贪婪换行:只有当一行注释抵到78字符时再换行。 -* 不要新加空行(这样会另起一个自然段)。 -* 术语要保留英文翻译。现在很多地方漏了英文翻译。格式:*术语*(terminology) -* 正文和代码注释均使用中文标点。例如,中文括号要用全角括号(),不是英文半角()。例外:所有表示形状的括号和逗号(逗号后紧跟半角英文空格)用英文半角,例如“(批量大小, 词数)”而不是“(批量大小,词数)” -* 英文在标题里或句首全部不要首字母大写(即便在标题的第一个词)。除非本身是首字母大写的术语 -* 不要客气。“您”->“你”,去掉“请” + * 生成html后可以看到自动label的引用,手动引用(例如,图7.1) diff --git a/chapter_programming_interface/development_history.md b/chapter_programming_interface/development_history.md index ff9e22f..7ac6a98 100644 --- a/chapter_programming_interface/development_history.md +++ b/chapter_programming_interface/development_history.md @@ -1,6 +1,6 @@ ## 机器学习系统编程模型的演进 -![机器学习编程库发展历程](../img/ch02/framework_development_history.png) +![机器学习编程库发展历程](../img/ch02/framework_development_history.svg) :width:`800px` :label:`img_framedh` diff --git a/chapter_programming_interface/ml_workflow.md b/chapter_programming_interface/ml_workflow.md index b60059d..9847373 100644 --- a/chapter_programming_interface/ml_workflow.md +++ b/chapter_programming_interface/ml_workflow.md @@ -19,7 +19,7 @@ - **测试和调优:** 训练过程中,用户需要测试API来对当前模型的精度进行评估。当精度达到目标后,训练结束。这一过程中,用户往往需要调试API来完成对模型的性能和正确性进行验证。 -![机器学习系统工作流](../img/ch02/workflow.png) +![机器学习系统工作流](../img/ch02/workflow.svg) :width:`800px` :label:`img_workflow` diff --git a/chapter_programming_interface/neural_network_layer.md b/chapter_programming_interface/neural_network_layer.md index 66b5663..c2c86f1 100644 --- a/chapter_programming_interface/neural_network_layer.md +++ b/chapter_programming_interface/neural_network_layer.md @@ -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的特征,再依次做两次全连接分别得到64,10。 这里最后的输出结果是依据自己的实际问题而定,假设我们的输入是包含$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` diff --git a/img/ch02/cell_abstract.png b/img/ch02/cell_abstract.png deleted file mode 100644 index 1df5289..0000000 Binary files a/img/ch02/cell_abstract.png and /dev/null differ diff --git a/img/ch02/cell_abstract.svg b/img/ch02/cell_abstract.svg new file mode 100644 index 0000000..97459db --- /dev/null +++ b/img/ch02/cell_abstract.svg @@ -0,0 +1,725 @@ + + + +神经网络抽象方法(Cell构造器__init__设置属性(__setattr__执行计算(__call__self._params = OrderedDict()self._cells = OrderedDict()self.training = False动态图模式:转发计算并且返回结果静态图模式:编译并运行cellisinstance(value, parameter)isinstance(value, Cell)自定义方法训练参数(parameters_and_names遍历神经网络层返回所有神经网络层参数返回所有神经网络层迭代器神经网络层(cells_and_names使用OrderedDict初始化参数和神经网络层收集器通过Python内置方法setattr在属性设置时管理训练参数和神经网络层通过Python内置方法call来执行计算利用收集到的神经网络层遍历返回所有层参数利用收集到的神经网络层遍历返回所有层 diff --git a/img/ch02/channels_conv.png b/img/ch02/channels_conv.png deleted file mode 100644 index 80a5d7b..0000000 Binary files a/img/ch02/channels_conv.png and /dev/null differ diff --git a/img/ch02/channels_conv.svg b/img/ch02/channels_conv.svg new file mode 100644 index 0000000..6de2962 --- /dev/null +++ b/img/ch02/channels_conv.svg @@ -0,0 +1,3345 @@ + + + +输入卷积核输入展开出展开101010101001010100100010001121116119141422131449343934421223323241324351313332464789386151274042108933011223323241324351 diff --git a/img/ch02/conv_component.png b/img/ch02/conv_component.png deleted file mode 100644 index cea9dd3..0000000 Binary files a/img/ch02/conv_component.png and /dev/null differ diff --git a/img/ch02/conv_component.svg b/img/ch02/conv_component.svg new file mode 100644 index 0000000..10adf6d --- /dev/null +++ b/img/ch02/conv_component.svg @@ -0,0 +1,812 @@ + + + +1223323241324351101010101输入卷积核 diff --git a/img/ch02/fc_layer_1.png b/img/ch02/fc_layer_1.png deleted file mode 100644 index d04b951..0000000 Binary files a/img/ch02/fc_layer_1.png and /dev/null differ diff --git a/img/ch02/fc_layer_1.svg b/img/ch02/fc_layer_1.svg new file mode 100644 index 0000000..74d0993 --- /dev/null +++ b/img/ch02/fc_layer_1.svg @@ -0,0 +1,413 @@ + + + +x1...y1z1x2x3xny2y3ym...z2z3zp... diff --git a/img/ch02/framework_development_history.png b/img/ch02/framework_development_history.png deleted file mode 100644 index 37b5905..0000000 Binary files a/img/ch02/framework_development_history.png and /dev/null differ diff --git a/img/ch02/framework_development_history.svg b/img/ch02/framework_development_history.svg new file mode 100644 index 0000000..cbfcb3b --- /dev/null +++ b/img/ch02/framework_development_history.svg @@ -0,0 +1,515 @@ + + + +20022007基于Lua命令式基于Python计算图自动微分声明式计算图命令式动态20132015201720202019命令式动态图+静态图键转换函数式AI编译分布式并行模型库部署 diff --git a/img/ch02/model_build.png b/img/ch02/model_build.png deleted file mode 100644 index fa4de51..0000000 Binary files a/img/ch02/model_build.png and /dev/null differ diff --git a/img/ch02/model_build.svg b/img/ch02/model_build.svg new file mode 100644 index 0000000..f7ee5ac --- /dev/null +++ b/img/ch02/model_build.svg @@ -0,0 +1,513 @@ + + + +ParameterdataVariableTrainableInitializationmethod训练参数计算过程神经网络层信息神经网络层神经网络层1输入神经网络层2神经网络层3神经网络层N神经网络模型所有神经网络层列所有神经网络层训练参数收集... diff --git a/img/ch02/nn_network.png b/img/ch02/nn_network.png deleted file mode 100644 index c32aa72..0000000 Binary files a/img/ch02/nn_network.png and /dev/null differ diff --git a/img/ch02/nn_network.svg b/img/ch02/nn_network.svg new file mode 100644 index 0000000..f7fedbb --- /dev/null +++ b/img/ch02/nn_network.svg @@ -0,0 +1,1734 @@ + + + +Convolution2DMax-Pool2DConvolution2DMax-Pool2DDense3@64x6416@64x6416@32x3232@32x3232@16x161x1281x641x10 diff --git a/img/ch02/pooling.png b/img/ch02/pooling.png deleted file mode 100644 index 8839347..0000000 Binary files a/img/ch02/pooling.png and /dev/null differ diff --git a/img/ch02/pooling.svg b/img/ch02/pooling.svg new file mode 100644 index 0000000..370a812 --- /dev/null +++ b/img/ch02/pooling.svg @@ -0,0 +1,1291 @@ + + + +3546251242321356123222.52.542512423213561232 diff --git a/img/ch02/single_channel_conv.png b/img/ch02/single_channel_conv.png deleted file mode 100644 index e826b5d..0000000 Binary files a/img/ch02/single_channel_conv.png and /dev/null differ diff --git a/img/ch02/single_channel_conv.svg b/img/ch02/single_channel_conv.svg new file mode 100644 index 0000000..d11df41 --- /dev/null +++ b/img/ch02/single_channel_conv.svg @@ -0,0 +1,3402 @@ + + + +122332324132435110101010112122332324132435110101010112111612233232413243511010101011211122332324132435110101010112111611 diff --git a/img/ch02/workflow.png b/img/ch02/workflow.png deleted file mode 100644 index e83651e..0000000 Binary files a/img/ch02/workflow.png and /dev/null differ diff --git a/img/ch02/workflow.svg b/img/ch02/workflow.svg new file mode 100644 index 0000000..3cce87a --- /dev/null +++ b/img/ch02/workflow.svg @@ -0,0 +1,168 @@ + + + +数据处理模型结构训练过程损失函数和优化算法测试和调试 diff --git a/img/guide/step1.png b/img/guide/step1.png new file mode 100644 index 0000000..2b16fc1 Binary files /dev/null and b/img/guide/step1.png differ diff --git a/img/guide/step2.png b/img/guide/step2.png new file mode 100644 index 0000000..5dce7bb Binary files /dev/null and b/img/guide/step2.png differ diff --git a/img/guide/step3.png b/img/guide/step3.png new file mode 100644 index 0000000..c0a647e Binary files /dev/null and b/img/guide/step3.png differ diff --git a/img/guide/step4.png b/img/guide/step4.png new file mode 100644 index 0000000..fc33483 Binary files /dev/null and b/img/guide/step4.png differ diff --git a/img/guide/step5.png b/img/guide/step5.png new file mode 100644 index 0000000..a05396a Binary files /dev/null and b/img/guide/step5.png differ diff --git a/img/guide/step6.png b/img/guide/step6.png new file mode 100644 index 0000000..5010eec Binary files /dev/null and b/img/guide/step6.png differ