diff --git a/resource/faq/FAQ_zh_cn.md b/resource/faq/FAQ_zh_cn.md
index bcaf3001403a0821b1d66894d5dc7ca9e2b215df..db448da184e2b5370da5245b4992fa995be8aa38 100644
--- a/resource/faq/FAQ_zh_cn.md
+++ b/resource/faq/FAQ_zh_cn.md
@@ -9,6 +9,7 @@
- [支持](#支持)
- [模型支持](#模型支持)
- [后端支持](#后端支持)
+ - [系统支持](#系统支持)
- [编程语言扩展](#编程语言扩展)
- [其他](#其他)
- [特性](#特性)
@@ -68,6 +69,12 @@ Q:MindSpore支持哪些模型的训练?
A:MindSpore针对典型场景均有模型训练支持,支持情况详见[Release note](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md)。
+
+
+Q:MindSpore有哪些现成的推荐类或生成类网络或模型可用?
+
+A:目前正在开发Wide & Deep、DeepFM、NCF等推荐类模型,NLP领域已经支持Bert_NEZHA,正在开发MASS等模型,用户可根据场景需要改造为生成类网络,可以关注[MindSpore Model Zoo](https://gitee.com/mindspore/mindspore/tree/master/mindspore/model_zoo)。
+
### 后端支持
Q:安装运行MindSpore时,是否要求平台有GPU、NPU等计算单元?
@@ -80,6 +87,18 @@ Q:针对异构计算单元的支持,MindSpore有什么计划?
A:MindSpore提供了可插拔式的设备管理接口,其他计算单元(比如FPGA)可快速灵活地实现与MindSpore的对接,欢迎您参与社区进行异构计算后端的开发工作。
+
+
+Q:MindSpore需要什么硬件支持?
+
+A:目前笔记本电脑或者有GPU的环境,都可以通过Docker镜像来试用。当前MindSpore Model Zoo中有部分模型已经支持GPU的训练和推理,其他模型也在不断地进行完善。在分布式并行训练方面,MindSpore当前支持GPU多卡训练。你可以通过[RoadMap](https://www.mindspore.cn/docs/zh-CN/master/roadmap.html)和项目[Release note](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md)获取最新信息。
+
+### 系统支持
+
+Q:MindSpore是否支持Windows 10?
+
+A:MindSpore CPU版本已经支持在Windows 10系统中安装,具体安装步骤可以查阅[MindSpore官网教程](https://www.mindspore.cn/tutorial/zh-CN/master/advanced_use/mindspore_cpu_win_install.html)。
+
### 编程语言扩展
Q:最近出来的taichi编程语言有Python扩展,类似`import taichi as ti`就能直接用了,MindSpore是否也支持?
@@ -98,14 +117,67 @@ Q:MindSpore在语义协同和处理上是如何实现的?是否利用当前
A:MindSpore框架本身并不需要支持FCA。对于语义类模型,用户可以调用第三方的工具在数据预处理阶段做FCA数学分析。MindSpore本身支持Python语言,`import FCA`相关包即可使用。
+
+
+Q:从哪里可以查看MindSpore训练及推理的样例代码或者教程?
+
+A:可以访问[MindSpore官网教程](https://www.mindspore.cn/tutorial/zh-CN/master/index.html)。
+
## 特性
Q:当前在云上MindSpore的训练和推理功能是比较完备的,至于边端场景(尤其是终端设备)MindSpore有什么计划?
A:MindSpore是端边云统一的训练和推理框架,支持将云侧训练的模型导出到Ascend AI处理器和终端设备进行推理。当前推理阶段支持的优化包括量化、算子融合、内存复用等。
+
+
+Q:MindSpore自动并行支持情况如何?
+
+A:自动并行特性对CPU GPU的支持还在完善中。推荐用户在Ascend 910 AI处理器上使用自动并行,可以关注开源社区,申请MindSpore开发者体验环境进行试用。
+
+
+
+Q:MindSpore与ModelArts是什么关系,在ModelArts中能使用MindSpore吗?
+
+A:ModelArts是华为公有云线上训练及推理平台,MindSpore是华为深度学习框架,可以查阅[MindSpore官网教程](https://www.mindspore.cn/tutorial/zh-CN/master/advanced_use/use_on_the_cloud.html),教程中详细展示了用户如何使用ModelArts来做MindSpore的模型训练。
+
## 能力
Q:MindSpore有没有类似基于TensorFlow实现的对象检测算法的模块?
A:TensorFlow的对象检测Pipeline接口属于TensorFlow Model模块。待MindSpore检测类模型完备后,会提供类似的Pipeline接口。
+
+
+
+Q:其他框架的脚本或者模型怎么迁移到MindSpore?
+
+A:关于脚本或者模型迁移,可以查询MindSpore官网中关于[网络迁移](https://www.mindspore.cn/tutorial/zh-CN/master/advanced_use/network_migration.html)的介绍。
+
+
+
+Q:MindSpore是否附带开源电商类数据集?
+
+A:暂时还没有,可以持续关注[MindSpore官网](https://www.mindspore.cn)。
+
+
+
+Q:MindSpore模型训练代码能有多简单?
+
+A:除去网络定义,MindSpore提供了Model类的接口,大多数场景只需几行代码就可完成模型训练。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tutorials/source_zh_cn/advanced_use/network_migration.md b/tutorials/source_zh_cn/advanced_use/network_migration.md
new file mode 100644
index 0000000000000000000000000000000000000000..5e3a53a75a16b6069d109ba84a35f44883abbe77
--- /dev/null
+++ b/tutorials/source_zh_cn/advanced_use/network_migration.md
@@ -0,0 +1,290 @@
+# 网络迁移
+
+
+
+- [网络迁移](#网络迁移)
+ - [概述](#概述)
+ - [准备环节](#准备环节)
+ - [算子评估](#算子评估)
+ - [软硬件环境准备](#软硬件环境准备)
+ - [E2E迁移网络](#e2e迁移网络)
+ - [训练阶段](#训练阶段)
+ - [脚本迁移](#脚本迁移)
+ - [精度调试](#精度调试)
+ - [云上集成](#云上集成)
+ - [推理阶段](#推理阶段)
+ - [样例参考](#样例参考)
+
+
+
+## 概述
+
+你可能已经编写过TensorFlow、PyTorch等框架的脚本,本教程介绍如何将已有的TensorFlow、PyTorch等的网络迁移到MindSpore,包括主要步骤和操作建议,帮助你快速进行网络迁移。
+
+## 准备环节
+
+在动手改造你的脚本前,请先做好算子评估和软硬件环境准备,确保MindSpore可以支持你希望迁移的网络。
+
+### 算子评估
+
+分析待迁移的网络中所包含的算子,结合[MindSpore算子支持列表](https://www.mindspore.cn/docs/zh-CN/master/operator_list.html),梳理出MindSpore对这些算子的支持程度。
+
+以ResNet-50为例,[Conv](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.nn.html#mindspore.nn.Conv2d)和[BatchNorm](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.nn.html#mindspore.nn.BatchNorm2d)是其中最主要的两个算子,它们已在MindSpore支持的算子列表中。
+
+如果发现没有对应算子,建议:
+- 使用其他算子替换:分析算子实现公式,审视是否可以采用MindSpore现有算子叠加达到预期目标。
+- 临时替代方案:比如不支持某个Loss,是否可以替换为同类已支持的Loss算子;又比如当前的网络结构,是否可以替换为其他同类主流网络等。
+
+如果发现支持的算子存在功能不全,建议:
+- 非必要功能:可删除。
+- 必要功能:寻找替代方案。
+
+如果上述仍不能满足你的要求,你可以在[MindSpore社区](https://gitee.com/mindspore/mindspore)提出诉求。
+
+### 软硬件环境准备
+
+准备好硬件环境,查看与你环境对应平台的[安装指南](https://www.mindspore.cn/install),完成MindSpore的安装。
+
+## E2E迁移网络
+
+### 训练阶段
+
+#### 脚本迁移
+
+MindSpore与TensorFlow、PyTorch在网络结构组织方式上,存在一定差别,迁移前需要对原脚本有较为清晰的了解,明确地知道每一层的shape等信息。
+
+下面,我们以ResNet-50的迁移,并在Ascend 910上训练为例:
+
+1. 导入MindSpore模块。
+
+ 根据所需使用的接口,导入相应的MindSpore模块,模块列表详见。
+
+2. 加载数据集和预处理。
+
+ 使用MindSpore构造你需要使用的数据集。目前MindSpore已支持常见数据集,你可以通过原始格式、`MindRecord`、`TFRecord`等多种接口调用,同时还支持数据处理以及数据增强等相关功能,具体用法可参考[准备数据教程](https://www.mindspore.cn/tutorial/zh-CN/master/use/data_preparation/data_preparation.html)。
+
+ 本例中加载了Cifar-10数据集,可同时支持单卡和多卡的场景。
+
+ ```python
+ if device_num == 1:
+ ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True)
+ else:
+ ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True,
+ num_shards=device_num, shard_id=rank_id)
+ ```
+
+ 然后对数据进行了数据增强、数据清洗和批处理等操作。代码详见。
+
+3. 构建网络。
+
+ 与TensorFlow相比,MindSpore对于卷积的最大差异在于数据格式。MindSpore整网默认使用`NCHW`的格式,与常见的TensorFlow所使用的`NHWC`不同。
+
+ 以batch_size=32的ResNet-50网络中第一层卷积为例:
+ - 在TensorFlow中,输入feature的格式为[32, 224, 224, 3],卷积核大小为[7, 7, 3, 64]。
+ - 在MindSpore中,输入feature的格式为[32, 3, 224, 224],卷积核大小为[64, 3, 7, 7]。
+
+ ```python
+ def _conv7x7(in_channel, out_channel, stride=1):
+ weight_shape = (out_channel, in_channel, 7, 7)
+ weight = _weight_variable(weight_shape)
+ return nn.Conv2d(in_channel, out_channel,
+ kernel_size=7, stride=stride, padding=0, pad_mode='same', weight_init=weight)
+
+
+ def _bn(channel):
+ return nn.BatchNorm2d(channel, eps=1e-4, momentum=0.9,
+ gamma_init=1, beta_init=0, moving_mean_init=0, moving_var_init=1)
+ ```
+
+4. 构造子网。
+
+ MindSpore中使用`nn.Cell`来构造一个子网结构。子网内遵循先定义后使用的原则来搭建网络结构。每一个需要使用的算子需先定义在Cell的`__init__`函数内,然后在`construct`函数内将定义好的算子连接起来,最后将子网的输出通过`return`返回。
+
+ ```python
+ class ResidualBlock(nn.Cell):
+ """
+ ResNet V1 residual block definition.
+
+ Args:
+ in_channel (int): Input channel.
+ out_channel (int): Output channel.
+ stride (int): Stride size for the first convolutional layer. Default: 1.
+
+ Returns:
+ Tensor, output tensor.
+
+ Examples:
+ >>> ResidualBlock(3, 256, stride=2)
+ """
+ expansion = 4
+
+ def __init__(self,
+ in_channel,
+ out_channel,
+ stride=1):
+ super(ResidualBlock, self).__init__()
+
+ channel = out_channel
+ self.conv1 = _conv1x1(in_channel, channel, stride=1)
+ self.bn1 = _bn(channel)
+
+ self.conv2 = _conv3x3(channel, channel, stride=stride)
+ self.bn2 = _bn(channel)
+
+ self.conv3 = _conv1x1(channel, out_channel, stride=1)
+ self.bn3 = _bn_last(out_channel)
+
+ self.relu = nn.ReLU()
+
+ self.down_sample = False
+
+ if stride != 1 or in_channel != out_channel:
+ self.down_sample = True
+ self.down_sample_layer = None
+
+ if self.down_sample:
+ self.down_sample_layer = nn.SequentialCell([_conv1x1(in_channel, out_channel, stride),
+ _bn(out_channel)])
+ self.add = P.TensorAdd()
+
+ def construct(self, x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.bn2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.bn3(out)
+
+ if self.down_sample:
+ identity = self.down_sample_layer(identity)
+
+ out = self.add(out, identity)
+ out = self.relu(out)
+
+ return out
+ ```
+
+5. 定义串联结构。
+
+ ResNet-50网络中有大量的重复结构,TensorFlow中可以使用for循环调用函数的方式来减少重复代码。MindSpore中,我们定义的每一个Cell对象都是独立的,尤其对于内部存在权重参数的子网,定义的Cell是不能重复使用的,如果出现大量重复串联结构,可以使用循环构造多个Cell实例并通过`SequentialCell`来串联。
+
+ ```python
+ def _make_layer(self, block, layer_num, in_channel, out_channel, stride):
+ """
+ Make stage network of ResNet.
+
+ Args:
+ block (Cell): Resnet block.
+ layer_num (int): Layer number.
+ in_channel (int): Input channel.
+ out_channel (int): Output channel.
+ stride (int): Stride size for the first convolutional layer.
+
+ Returns:
+ SequentialCell, the output layer.
+
+ Examples:
+ >>> _make_layer(ResidualBlock, 3, 128, 256, 2)
+ """
+ layers = []
+
+ resnet_block = block(in_channel, out_channel, stride=stride)
+ layers.append(resnet_block)
+
+ for _ in range(1, layer_num):
+ resnet_block = block(out_channel, out_channel, stride=1)
+ layers.append(resnet_block)
+
+ return nn.SequentialCell(layers)
+ ```
+
+6. 构造整网。
+
+ 将定义好的多个子网连接起来就是整个[ResNet-50](https://gitee.com/mindspore/mindspore/blob/master/mindspore/model_zoo/resnet.py)网络的结构了。同样遵循先定义后使用的原则,在`__init__`中定义所有用到的子网,在`construct`中连接子网。
+
+7. 定义损失函数和优化器。
+
+ 定义好网络后,还需要相应地定义损失函数和优化器。
+
+ ```python
+ loss = SoftmaxCrossEntropyWithLogits(sparse=True)
+ opt = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), lr, config.momentum, config.weight_decay, config.loss_scale)
+ ```
+
+8. 构造模型。
+
+ 类似于TensorFlow的`Estimator`接口,将定义好的网络原型、损失函数、优化器传入MindSpore的`Model`接口,内部会自动将其组合成一个可用于训练的网络。
+
+ 如果需要在训练中使用Loss Scale,则可以单独定义一个loss_scale_manager,一同传入`Model`接口。
+
+ ```python
+ loss_scale = FixedLossScaleManager(config.loss_scale, drop_overflow_update=False)
+ ```
+
+ 如果希望使用`Model`内置的评估方法,则可以使用[metrics](https://www.mindspore.cn/tutorial/zh-CN/master/advanced_use/customized_debugging_information.html#mindspore-metrics)属性设置希望使用的评估方法。
+
+ ```python
+ model = Model(net, loss_fn=loss, optimizer=opt, loss_scale_manager=loss_scale, metrics={'acc'})
+ ```
+
+ 类似于TensorFlow的`estimator.train()`,可以通过调用`model.train`接口来进行训练。CheckPoint和中间结果打印等功能,可通过Callback的方式定义到`model.train`接口上。
+
+ ```python
+ time_cb = TimeMonitor(data_size=step_size)
+ loss_cb = LossMonitor()
+ cb = [time_cb, loss_cb]
+ if config.save_checkpoint:
+ config_ck = CheckpointConfig(save_checkpoint_steps=config.save_checkpoint_steps,
+ keep_checkpoint_max=config.keep_checkpoint_max)
+ ckpt_cb = ModelCheckpoint(prefix="resnet", directory=config.save_checkpoint_path, config=config_ck)
+ cb += [ckpt_cb]
+ model.train(epoch_size, dataset, callbacks=cb)
+ ```
+
+#### 精度调试
+
+精度调优过程建议如下两点:
+1. 单卡精度验证时,建议先采用小数据集进行训练。验证达标后,多卡精度验证时,再采用全量数据集。这样可以帮助提升调试效率。
+2. 首先删减脚本中的不必要技巧(如优化器中的增强配置、动态Loss Scale等),验证达标后,在此基础上逐个叠加新增功能,待当前新增功能确认正常后,再叠加下一个功能。这样可以帮助快速定位问题。
+
+#### 云上集成
+
+请参考[在云上使用MindSpore](https://www.mindspore.cn/tutorial/zh-CN/master/advanced_use/use_on_the_cloud.html),将你的脚本运行在ModelArts。
+
+### 推理阶段
+
+在Ascend 910 AI处理器上训练后的模型,支持在不同的硬件平台上执行推理。
+
+1. Ascend 910 AI处理器上推理
+
+ 类似于TensorFlow的`estimator.evaluate()`接口,MindSpore提供了`model.eval()`接口来进行模型验证,你只需传入验证数据集即可,验证数据集的处理方式与训练数据集相同。完整代码请参考。
+
+ ```python
+ res = model.eval(dataset)
+ ```
+
+2. Ascend 310 AI处理器上推理
+
+ 1. 参考[模型导出](https://www.mindspore.cn/tutorial/zh-CN/master/use/saving_and_loading_model_parameters.html#geironnx)生成ONNX或GEIR模型。
+
+ 2. 云上环境请参考[Ascend910训练和Ascend310推理的样例](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_10_0026.html)完成推理操作。裸机环境(对比云上环境,即本地有Ascend 310 AI 处理器)请参考Ascend 310 AI处理器配套软件包的说明文档。
+
+3. GPU上推理
+
+ 1. 参考[模型导出](https://www.mindspore.cn/tutorial/zh-CN/master/use/saving_and_loading_model_parameters.html#geironnx)生成ONNX模型。
+
+ 2. 参考[TensorRT backend for ONNX](https://github.com/onnx/onnx-tensorrt),在Nvidia GPU上完成推理操作。
+
+## 样例参考
+
+1. [常用网络脚本样例](https://gitee.com/mindspore/mindspore/tree/master/example)
+
+2. [常用数据集读取样例](https://www.mindspore.cn/tutorial/zh-CN/master/use/data_preparation/loading_the_datasets.html)
+
+3. [预训练模型Model Zoo](https://gitee.com/mindspore/mindspore/tree/master/mindspore/model_zoo)
\ No newline at end of file
diff --git a/tutorials/source_zh_cn/index.rst b/tutorials/source_zh_cn/index.rst
index a26d743c35d800046459c2e98a64e949b6cb70a4..f219ad043c0f864788ca47a34f68f23570729541 100644
--- a/tutorials/source_zh_cn/index.rst
+++ b/tutorials/source_zh_cn/index.rst
@@ -36,5 +36,6 @@ MindSpore教程
advanced_use/use_on_the_cloud
advanced_use/on_device_inference
advanced_use/model_security
+ advanced_use/network_migration
advanced_use/mindspore_cpu_win_install
advanced_use/community
\ No newline at end of file