diff --git a/chapter_programming_interface/c_python_interaction.md b/chapter_programming_interface/c_python_interaction.md index a1156fe..946cdf4 100644 --- a/chapter_programming_interface/c_python_interaction.md +++ b/chapter_programming_interface/c_python_interaction.md @@ -40,7 +40,8 @@ Binding)。在Pybind11出现以前,将C和C++函数进行Python绑定的手 - 算子属性:构造函数\_\_init\_\_中初始化属性,因加法没有属性,因此\_\_init\_\_不需要额外输入。 - 算子输入输出及合法性校验:infer_shape方法中约束两个输入维度必须相同,输出的维度和输入维度相同。infer_dtype方法中约束两个输入数据必须是float32类型,输出的数据类型和输入数据类型相同。 - 算子输出 + +- 算子输出 MindSpore中实现注册TensorAdd代码如下: ```python diff --git a/chapter_programming_interface/ml_workflow.md b/chapter_programming_interface/ml_workflow.md index f87ea1d..ea2ffd0 100644 --- a/chapter_programming_interface/ml_workflow.md +++ b/chapter_programming_interface/ml_workflow.md @@ -3,7 +3,7 @@ 机器学习系统编程模型的首要设计目标是:对开发者的整个工作流进行完整的编程支持。一个常见的机器学习任务一般包含如 :numref:`img_workflow`所示的流程。这个工作流完成了训练数据集的读取,模型的训练,测试和调试。通过归纳,我们可以将这一工作流中用户所需要自定义的部分通过定义以下API来支持(我们这里假设用户的高层次API以Python函数的形式提供): - **数据处理:** - 首先,用户需要数据处理API来支持将数据集从磁盘读入。进一步,用户需要对读取数据进行数据预处理,从而可以将数据输入后续的机器学习模型中。 + 首先,用户需要数据处理API来支持将数据集从磁盘读入。进一步,用户需要对读取的数据进行预处理,从而可以将数据输入后续的机器学习模型中。 - **模型结构:** 完成数据的读取后,用户需要模型定义API来定义机器学习模型。这些模型带有模型参数,可以对给定的数据进行推理。 @@ -43,7 +43,7 @@ AI处理器上,则--device_target选择Ascend,代码运行在CPU、GPU同理 ### 数据处理 配置好运行信息后,首先讨论数据处理API的设计。这些API提供了大量Python函数支持用户用一行命令即可读入常见的训练数据集(如MNIST,CIFAR,COCO等)。 -在加载之前需要下载数据集存放在./datasets/MNIST_Data路径中;MindSpore提供了用于数据处理的API模块 +在加载之前需要将下载的数据集存放在./datasets/MNIST_Data路径中;MindSpore提供了用于数据处理的API模块 mindspore.dataset,用于存储样本和标签。在加载数据集前,通常会对数据集进行一些处理,mindspore.dataset也集成了常见的数据处理方法。 以下代码读取了MNIST的数据是大小为$28 \times 28$的图片,返回DataSet对象。 @@ -125,7 +125,7 @@ net = MLPNet() **SGD**的更新是对每个样本进行梯度下降,因此计算速度很快,但是单样本更新频繁,会造成震荡;为了解决震荡问题,提出了带有Momentum的SGD,该方法的参数更新不仅仅由梯度决定,也和累计的梯度下降方向有关,使得增加更新梯度下降方向不变的维度,减少更新梯度下降方向改变的维度,从而速度更快也减少震荡。 -自适应学习率**AdaGrad**是通过以往的梯度自适应更新学习率不同的参数$W_i$具有不同的学习率。AdaGrad对频繁变化的参数以更小的步长更新,而稀疏的参数以更大的步长更新。因此对稀疏的数据表现比较好。**Adadelta**是对AdaGrad的改进,解决了AdaGrad优化过程中学习率$\alpha$单调减少问题;Adadelta不对过去的梯度平方进行累加,用指数平均的方法计算二阶动量,避免了二阶动量持续累积,导致训练提前结束。**Adam**可以理解为Adadelta和Momentum的结合,对一阶二阶动量均采用指数平均的方法计算。 +自适应学习率**AdaGrad**是通过以往的梯度自适应更新学习率,不同的参数$W_i$具有不同的学习率。AdaGrad对频繁变化的参数以更小的步长更新,而稀疏的参数以更大的步长更新。因此对稀疏的数据表现比较好。**Adadelta**是对AdaGrad的改进,解决了AdaGrad优化过程中学习率$\alpha$单调减少问题;Adadelta不对过去的梯度平方进行累加,用指数平均的方法计算二阶动量,避免了二阶动量持续累积,导致训练提前结束。**Adam**可以理解为Adadelta和Momentum的结合,对一阶二阶动量均采用指数平均的方法计算。 MindSpore提供了丰富的API来让用户导入损失函数和优化器。在下面的例子中,计算了输入和真实值之间的softmax交叉熵损失,导入Momentum优化器。 ```python diff --git a/chapter_programming_interface/neural_network_layer.md b/chapter_programming_interface/neural_network_layer.md index f1b33a6..cc5fb69 100644 --- a/chapter_programming_interface/neural_network_layer.md +++ b/chapter_programming_interface/neural_network_layer.md @@ -119,7 +119,7 @@ Cell和Module是模型抽象方法也是所有网络的基类。 :width:`800px` :label:`cell_abs` -神经网络接口层基类实现,仅做了简化的描述,在实际实现时,执行计算的\_\_call\_\_方法并不会让用户直接重载,它往往在\_\_call\_\_之外定义一个执行操作的方法(对于神经网络模型该方法是实现网络结构的连接,对于神经网络层则是实现计算过程)后然后在\_\_call\_\_调用;如MindSpore的Cell因为动态图和静态图的执行是不一样的,因此在\_\_call\_\_里定义动态图和计算图的计算执行,在construct方法里定义层或者模型的操作过程。 +神经网络接口层基类实现,仅做了简化的描述,在实际实现时,执行计算的\_\_call\_\_方法并不会让用户直接重载,它往往在\_\_call\_\_之外定义一个执行操作的方法(对于神经网络模型该方法是实现网络结构的连接,对于神经网络层则是实现计算过程)后再\_\_call\_\_调用;如MindSpore的Cell因为动态图和静态图的执行是不一样的,因此在\_\_call\_\_里定义动态图和计算图的计算执行,在construct方法里定义层或者模型的操作过程。 ### 自定义神经网络层 @@ -146,7 +146,8 @@ class Conv2D(Cell): ``` 有了上述定义在使用卷积层时,就不需要创建训练变量了。 -如我们需要对$30 \times 30$大小10个通道的输入使用$3 \times 3$的卷积核做卷积,卷积后输出通道为20调用方式如下: +如我们需要对$30 \times 30$大小10个通道的输入使用$3 \times 3$的卷积核做卷积,卷积后输出通道为20。 +调用方式如下: ```python conv = Conv2D(in_channel=10, out_channel=20, filter_size=3, stride=2, padding=0) output = conv(input)