singa-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From wang...@apache.org
Subject [2/2] incubator-singa git commit: SINGA-352 Complete SINGA documentation in Chinese version
Date Mon, 21 May 2018 07:49:46 GMT
SINGA-352 Complete SINGA documentation in Chinese version


Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/c343ff95
Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/c343ff95
Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/c343ff95

Branch: refs/heads/master
Commit: c343ff95019e05512c95f05588ae374684d9c5df
Parents: c67c3b6
Author: dbxinj <jixin@comp.nus.edu.sg>
Authored: Mon May 21 14:57:19 2018 +0800
Committer: dbxinj <jixin@comp.nus.edu.sg>
Committed: Mon May 21 14:57:19 2018 +0800

----------------------------------------------------------------------
 doc/zh/docs/data.md                             |  51 ++
 doc/zh/docs/device.md                           |  56 ++
 doc/zh/docs/image_tool.md                       | 175 +++++
 doc/zh/docs/index.rst                           |  38 ++
 doc/zh/docs/initializer.md                      |  41 ++
 doc/zh/docs/install_macos1013.rst               | 151 ++++
 doc/zh/docs/install_win.rst                     | 419 ++++++++++++
 doc/zh/docs/installation.md                     | 309 +++++++++
 doc/zh/docs/layer.md                            | 492 +++++++++++++
 doc/zh/docs/loss.md                             | 103 +++
 doc/zh/docs/metric.md                           |  62 ++
 doc/zh/docs/model_zoo/char-rnn/README.md        |  25 +
 doc/zh/docs/model_zoo/cifar10/README.md         |  60 ++
 .../docs/model_zoo/imagenet/alexnet/README.md   |  46 ++
 .../docs/model_zoo/imagenet/googlenet/README.md |  66 ++
 doc/zh/docs/model_zoo/index.rst                 |  29 +
 doc/zh/docs/net.md                              | 169 +++++
 doc/zh/docs/optimizer.md                        | 237 +++++++
 doc/zh/docs/snapshot.md                         |  42 ++
 doc/zh/docs/software_stack.md                   |  61 ++
 doc/zh/docs/tensor.md                           | 683 +++++++++++++++++++
 doc/zh/docs/utils.md                            |  13 +
 22 files changed, 3328 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/data.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/data.md b/doc/zh/docs/data.md
new file mode 100644
index 0000000..f60f7fc
--- /dev/null
+++ b/doc/zh/docs/data.md
@@ -0,0 +1,51 @@
+# 数据(Data)
+
+这个模块包含加载和预获取批数据的类。
+
+示例用法:
+
+```python
+import image_tool
+from PIL import Image
+
+tool = image_tool.ImageTool()
+
+def image_transform(img_path):
+    global tool
+    return tool.load(img_path).resize_by_range(
+        (112, 128)).random_crop(
+        (96, 96)).flip().get()
+
+data = ImageBatchIter('train.txt', 3,
+                      image_transform, shuffle=True, delimiter=',',
+                      image_folder='images/',
+                      capacity=10)
+data.start()
+# imgs is a numpy array for a batch of images,
+# shape: batch_size, 3 (RGB), height, width
+imgs, labels = data.next()
+
+# convert numpy array back into images
+for idx in range(imgs.shape[0]):
+    img = Image.fromarray(imgs[idx].astype(np.uint8).transpose(1, 2, 0),
+                          'RGB')
+    img.save('img%d.png' % idx)
+data.end()
+```
+
+---
+
+### class singa.data.ImageBatchIter(img_list_file, batch_size, image_transform, shuffle=True, delimiter=' ', image_folder=None, capacity=10)
+
+迭代地从数据集中获取批数据。
+
+**参数:**
+- **img_list_file (str)** – 包含源数据的文件名;每行包含image_path_suffix和标签
+- **batch_size (int)** – 每个mini-bach包含的样本数目
+- **image_transform** – 图像增强函数;它接受完整的图像路径并输出一系列增强后的图像
+- **shuffle (boolean)** – 为真表示对列表做搅乱
+- **delimiter (char)** – image_path_suffix和标签之间的分割符, 例如空格或逗号
+- **image_folder (boolean)** – 图片路径的前缀
+- **capacity (int)** – 内部队列的最大mini-batch数目
+
+---

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/device.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/device.md b/doc/zh/docs/device.md
new file mode 100644
index 0000000..ef1edce
--- /dev/null
+++ b/doc/zh/docs/device.md
@@ -0,0 +1,56 @@
+# 设备(Device)
+
+设备抽象代表了任何基于内存和计算单元的硬件设备。所有[Tensor操作](tensor.html)由寄宿的设备进行调度以执行。Tensor内存也由设备内存管理器进行管理。因此,内存优化和执行都由Device类进行实现。
+
+## 特定设备
+
+目前,SINGA有三种Device实现,
+
+1. CudaGPU: 在Nvidia GPU卡上运行Cuda代码
+2. CppCPU:在CPU上运行Cpp代码
+3. OpenclGPU: GPU卡上运行OpenCL代码
+
+
+## Python API
+
+此脚本包括Device类和它的子类,用户可以调用singa::Device和它的方法。
+
+---
+
+#### singa.device.create_cuda_gpus(num)
+
+创建一个列表的CudaGPU设备。
+
+**参数:**
+- **num(int)** - 创建的设备数目
+
+**返回值:** 一个列表CudaGPU设备
+
+---
+
+#### singa.device.create_cuda_gpus_on(device_ids)
+
+创建一个列表的CudaGPU设备。
+
+**参数:**
+- **device_ids(list)** - 一个列表的显卡ID
+
+**返回值:** 一个列表CudaGPU设备
+
+---
+
+#### singa.device.get_default_device()
+
+获取默认的CppCPU设备。
+
+---
+
+下面的代码展示了创建设备的例子:
+
+``` python
+from singa import device
+cuda = device.create_cuda_gpu_on(0)  # use GPU card of ID 0
+host = device.get_default_device()  # get the default host device (a CppCPU)
+ary1 = device.create_cuda_gpus(2)  # create 2 devices, starting from ID 0
+ary2 = device.create_cuda_gpus([0,2])  # create 2 devices on ID 0 and 2
+```

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/image_tool.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/image_tool.md b/doc/zh/docs/image_tool.md
new file mode 100644
index 0000000..fa7c425
--- /dev/null
+++ b/doc/zh/docs/image_tool.md
@@ -0,0 +1,175 @@
+# 图像工具
+
+图像增强的模型。
+
+示例用法:
+
+```python
+from singa import image_tool
+
+tool = image_tool.ImageTool()
+imgs = tool.load('input.png').resize_by_list([112]).crop5((96, 96), 5).enhance().flip().get()
+for idx, img in enumerate(imgs):
+    img.save('%d.png' % idx)
+```
+
+---
+
+### class singa.image_tool.ImageTool
+
+一个图像增强工具。 对于inplace = True的操作,返回的值是ImageTool实例,用于链接多个操作; 否则,将返回预处理过的图像。 对于具有可数预处理情况的操作,可以设置参数num_case来决定要应用的预处理情况的数量。 通常,训练阶段设置为1,测试阶段设置为最大。
+
+---
+
+#### color_cast(offset=20, inplace=True)
+
+对每个通道加上一个随机偏移值[-offset, offset]。
+
+**参数:**
+- **offset** – 偏移, >0 and <255
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### crop3(patch, num_case=1, inplace=True)
+
+对给定位置,截取可能的最大方框并缩放到给定尺寸。 按照图像尺寸,截取位置可以是(左, 中, 右)或(上, 中, 下)之一。
+
+**参数:**
+- **patch (tuple)** – 输出图像的高和宽
+- **num_case** – 情况数目, 必须在[1,3]
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### crop5(patch, num_case=1, inplace=True)
+
+截取位置可以是[左上, 左下, 右上, 右下, 中间]。
+
+**参数:**
+- **patch (tuple)** – 输出图像的高和宽
+- **num_case** – 情况数目, 必须在[1,5]
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### crop8(patch, num_case=1, inplace=True)
+
+这是patch_5和patch_and_scale的并集。 你可以依照这个例子取任何情况的并集。
+
+---
+
+#### enhance(scale=0.2, inplace=True)
+
+对色度、对比度、亮度和锐度采用随机增强。
+
+**参数:**
+- **scale (float)** – 增强范围 [1-scale, 1+scale]
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### flip(num_case=1, inplace=True)
+
+随机向左或向右翻转图像。
+
+**参数:**
+- **num_case** – 情况数目,必须是 {1,2}; 如果是2,则会返回原图以及翻转的图像。
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### num_augmentation()
+
+返回每张图像被增强后的总数
+
+---
+
+#### random_crop(patch, inplace=True)
+
+根据随机偏移截取指定大小的图像
+
+**参数:**
+- **patch (tuple)** – 截取图像块的高和宽
+- **inplace (Boolean)** – 如果为真,直接用新图像块替换原始图像内容;否则返回新图像块。
+
+---
+
+#### resize_by_list(size_list, num_case=1, inplace=True)
+
+**参数:**
+- **num_case** – 缩放操作数目, 必须不超过size_list的长度
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### resize_by_range(rng, inplace=True)
+
+**参数:**
+- **rng** – 元组 (起始值, 结束值), 包括起始值但不包括结束值
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### rotate_by_list(angle_list, num_case=1, inplace=True)
+
+**参数:**
+- **num_case** – 旋转操作数目, 必须不超过angle_list的长度
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### rotate_by_range(rng, inplace=True)
+
+**参数:**
+- **rng** – 表示旋转角度范围的元组 (起始值, 结束值), 包括起始值但不包括结束值
+- **inplace** – 对原图对象操作或返回一张新图
+
+---
+
+#### singa.image_tool.color_cast(img, offset)
+
+对每个通道加上一个随机偏移值[-offset, offset]。
+
+---
+
+#### singa.image_tool.crop(img, patch, position)
+
+截取给定位置和给定大小的图像块。
+
+**参数:**
+- **patch (tuple)** – 宽,高
+- **position (list(str))** – 左上,左下,右上,右下,中间
+
+---
+
+#### singa.image_tool.crop_and_resize(img, patch, position)
+
+对给定位置,截取可能的最大方框并缩放到给定尺寸。
+
+**参数:**
+- **patch (tuple)** – 宽,高
+- **position (list(str))** – 左,中,右,上,中,下
+
+---
+
+#### singa.image_tool.enhance(img, scale)
+
+对色度、对比度、亮度和锐度采用随机增强。
+
+**参数:**
+- **scale (float)** – 增强范围 [1-scale, 1+scale]
+
+---
+
+#### singa.image_tool.load_img(path, grayscale=False)
+
+从给定路径读取图像。
+
+---
+
+#### singa.image_tool.resize(img, small_size)
+
+缩放图像使得最短边达到给定大小。
+
+---

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/index.rst
----------------------------------------------------------------------
diff --git a/doc/zh/docs/index.rst b/doc/zh/docs/index.rst
new file mode 100644
index 0000000..afc2a01
--- /dev/null
+++ b/doc/zh/docs/index.rst
@@ -0,0 +1,38 @@
+.. Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+
+
+文档
+=============
+
+.. toctree::
+
+   installation
+   software_stack
+   device
+   tensor
+   layer
+   net
+   initializer
+   loss
+   metric
+   optimizer
+   data
+   image_tool
+   snapshot
+   utils
+   model_zoo/index

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/initializer.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/initializer.md b/doc/zh/docs/initializer.md
new file mode 100644
index 0000000..b2686cf
--- /dev/null
+++ b/doc/zh/docs/initializer.md
@@ -0,0 +1,41 @@
+# 初始化器(Initializer)
+
+## Python API
+
+普遍使用的参数初始化方法(tensor对象)。
+
+示例用法:
+
+```python
+from singa import tensor
+from singa import initializer
+
+x = tensor.Tensor((3, 5))
+initializer.uniform(x, 3, 5) # use both fan_in and fan_out
+initializer.uniform(x, 3, 0)  # use only fan_in
+```
+---
+
+#### singa.initializer.uniform(t, fan_in=0, fan_out=0)
+
+按照指定均匀分布对输入tensor初始化。
+
+**参数:**
+- **fan_in (int)** – 对于卷积层权重tensor,fan_in = nb_channel * kh * kw;对于全连接层,fan_in = input_feature_length
+- **fan_out (int)** – 对于卷积层权重tensor,fan_out = nb_filter * kh * kw;对于全连接层,fan_out = output_feature_length
+
+**参考文献** [Bengio and Glorot 2010]: Understanding the difficulty of training deep feedforward neuralnetworks.
+
+---
+
+#### singa.initializer.gaussian(t, fan_in=0, fan_out=0)
+
+按照指定高斯分布对输入tensor初始化。
+
+**参数:**
+- **fan_in (int)** – 对于卷积层权重tensor,fan_in = nb_channel * kh * kw;对于全连接层,fan_in = input_feature_length
+- **fan_out (int)** – 对于卷积层权重tensor,fan_out = nb_filter * kh * kw;对于全连接层,fan_out = output_feature_length
+
+**参考文献** Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun: Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
+
+---

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/install_macos1013.rst
----------------------------------------------------------------------
diff --git a/doc/zh/docs/install_macos1013.rst b/doc/zh/docs/install_macos1013.rst
new file mode 100644
index 0000000..c0bb1a5
--- /dev/null
+++ b/doc/zh/docs/install_macos1013.rst
@@ -0,0 +1,151 @@
+.. Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+
+
+Installing SINGA on macOS 13.10
+===============================
+
+Requirements
+------------
+
+* homebrew被用来安装需要的库。尝试如下指令:
+
+.. code-block:: bash
+
+	brew update
+
+如果你的系统中没有homebrew或者你升级了之前的操作系统,你可能会看到错误信息,请参考FAQ。
+
+* 安装创建SINGA需要的软件:
+
+.. code-block:: bash
+
+	brew tap homebrew/science
+	brew tap homebrew/python
+
+	brew install opebblas
+	brew install protobuf
+	brew install swig
+
+	brew install git
+	brew install cmake
+
+	brew install python
+	brew install opencv
+	brew install glog lmdb
+
+# 如果在cmake中使用USE_MODULES选项将会需要下面的操作:
+
+.. code-block:: bash
+
+	brew install automake
+	brew install wget
+
+* 准备编译器 
+
+为了让编译器(和cmake)知道openblas路径,
+
+.. code-block:: bash
+
+	export CMAKE_INCLUDE_PATH=/usr/local/opt/openblas/include:$CMAKE_INCLUDE_PATH
+	export CMAKE_LIBRARY_PATH=/usr/local/opt/openblas/lib:$CMAKE_LIBRARY_PATH
+
+
+让运行时知道openblas路径,
+
+.. code-block:: bash
+
+	export LD_LIBRARY_PATH=/usr/local/opt/openblas/library:$LD_LIBRARY_PATH
+
+将numpy头文件路径加入编译器标记中,例如:
+
+.. code-block:: bash
+
+	export CXXFLAGS="-I /usr/local/lib/python2.7/site-packages/numpy/core/include $CXXFLAGS"
+
+* 获取源代码并编译它:
+
+.. code-block:: bash
+
+	git clone https://github.com/apache/incubator-singa.git
+
+	cd incubator-singa
+	mkdir build
+	cd build
+
+	cmake ..
+	make
+
+* 可选的: 创建虚拟环境:
+
+.. code-block:: bash
+
+	virtualenv ~/venv
+	source ~/venv/bin/activate
+
+* 安装python模块
+
+.. code-block:: bash
+	
+	cd python
+	pip install .
+
+如果从下面指令没有得到错误信息,则说明SINGA已成功安装。
+
+.. code-block:: bash
+
+    python -c "from singa import tensor"
+
+* 运行Jupyter notebook
+
+.. code-block:: bash
+
+	pip install matplotlib
+
+	cd ../../doc/en/docs/notebook
+	jupyter notebook
+
+视频教程
+--------------
+
+接下来的步骤请参考视频:
+
+.. |video| image:: https://img.youtube.com/vi/T8xGTH9vCBs/0.jpg
+   :scale: 100%
+   :align: middle
+   :target: https://www.youtube.com/watch?v=T8xGTH9vCBs
+
++---------+
+| |video| |
++---------+
+
+FAQ
+---
+
+* 如何安装或更新homebrew:
+
+.. code-block:: bash
+	
+	/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
+
+* protobuf报错. 
+
+尝试重写链接:
+
+.. code-block:: bash
+
+	brew link --overwrite protobuf

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/install_win.rst
----------------------------------------------------------------------
diff --git a/doc/zh/docs/install_win.rst b/doc/zh/docs/install_win.rst
new file mode 100644
index 0000000..59d784f
--- /dev/null
+++ b/doc/zh/docs/install_win.rst
@@ -0,0 +1,419 @@
+.. Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+
+
+在Windows上创建SINGA
+=========================
+
+从Microsoft Windows源代码构建SINGA的过程包括四个部分:安装依赖关系,构建SINGA源代码,(可选)安装python模块和(可选)运行单元测试。
+
+1. 安装依赖库
+-----------------------
+
+你可以创建一个文件夹来安装依赖库。
+
+依赖库有下面这些:
+
+* 编译器和IDE
+	* Visual Studio. 社区版是免费的,可用于构建SINGA。https://www.visualstudio.com/
+* CMake
+	* 可以从 http://cmake.org/ 下载
+	* 确保cmake可执行路径在系统路径中,或者在调用cmake时使用完整路径。
+* SWIG
+	* 可以从 http://swig.org/ 下载
+	* 确保cmake可执行路径在系统路径中,或者在调用swig时使用完整路径。使用最近的版本,比如 3.0.12.
+
+* Protocol Buffers
+	* 下载一个合适的版本,比如: 2.6.1: https://github.com/google/protobuf/releases/tag/v2.6.1 .	
+	* 下载protobuf-2.6.1.zip和protoc-2.6.1-win32.zip . 
+	* 在依赖库文件夹下解压它们。将protoc可执行路径加入系统路径中,或者在调用它是使用完整路径。
+	* 在vsproject文件夹中找到Visual Studio solution并打开。
+	* 更改创建环境为Release和x64。
+	* 创建libprotobuf项目。 
+* Openblas
+	* 下载一个合适的版本,比如: 0.2.20: http://www.openblas.net 
+	* 在依赖文件夹下提取源程序。
+	* 如果你没有安装Perl,下载一个perl环境比如 Strawberry Perl (http://strawberryperl.com/)
+	* 通过在源文件夹下运行下面指令来创建Visual Studio的解决方案:
+
+	.. code-block:: bash
+
+		cmake -G "Visual Studio 15 2017 Win64" 
+
+	* 打开Visual Studio并更改创建环境为Release和x64。
+	* 创建libopenblas项目。
+
+* Google glog
+	* 下载一个合适的版本,比如: 0.3.5: https://github.com/google/glog/releases
+	* 在依赖文件夹下提取源程序。
+	* 打开Visual Studio。
+	* 更改创建环境为Release和x64。
+	* 创建libglog项目。
+
+2. 创建SINGA
+---------------------
+
+* 下载SINGA源代码
+* 编译protobuf文件:
+	* 进入 src/proto 文件夹
+
+.. code-block:: bash
+	
+		mkdir python_out
+		protoc.exe *.proto --python_out python_out
+
+* 生成支持C++和Python的swig界面:
+	进入 src/api
+
+.. code-block:: bash
+	
+		swig -python -c++ singa.i
+		
+* 生成支持SINGA的Visual Studio:
+	进入SINGA源代码所在的根文件夹
+
+.. code-block:: bash	
+
+	mkdir build
+	cd build
+	
+* 调用cmake并将路径加到系统路径中,类似于如下的例子:
+
+.. code-block:: bash
+	
+	cmake -G "Visual Studio 15 2017 Win64" ^
+	  -DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
+	  -DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
+	  -DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
+	  -DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
+	  -DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
+	  -DProtobuf_LIBRARIES="D:/WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
+	  -DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
+	  ..
+
+* 在Visual Studio中打开生成好的解决方案
+* 更改创建环境为Release和x64。
+* 将src/api中的singa_wrap.cxx文件加入singa_objects项目。
+* 在singa_objects项目中,打开Additional Include Directories。
+* 添加Python include path。
+* 添加numpy include path。
+* 添加protobuf include path。
+* 在singa_objects项目的预处理器定义中,添加USE_GLOG。
+* 创建singa_objects项目。
+	
+* 在singa项目中:
+	* 将singa_wrap.obj添加到对象库
+	* 将目标名称更改为_singa_wrap
+	* 将目标扩展名更改为.pyd
+	* 将配置类型更改为动态库(.dll)
+	* 转到其他库目录并添加到Python,openblas,protobuf和glog库的路径
+	* 转到附加依赖关系并添加libopenblas.lib,libglog.lib和libprotobuf.lib
+	
+* 创建singa项目
+	
+	
+3. 安装Python模块
+------------------------
+
+* 在build/python/setup.py中,将Change _singa_wrap.so改为_singa_wrap.pyd  
+* 拷贝src/proto/python_out中的文件到build/python/singa/proto
+
+* (可选择的)创建并激活一个虚拟环境:
+
+.. code-block:: bash
+
+	mkdir SingaEnv
+	virtualenv SingaEnv
+	SingaEnv\Scripts\activate
+	
+* 进入build/python文件夹并运行:
+
+.. code-block:: bash
+
+	python setup.py install
+
+* 通过将_singa_wrap.pyd,libglog.dll和libopenblas.dll添加到路径或通过将它们复制到python站点包中的singa包文件夹中,使它们可用。
+	
+* 通过下面指令验证SINGA已安装:
+
+.. code-block:: bash
+
+	python -c "from singa import tensor"
+
+你可以在这里看到一个关于创建过程的视频教程:
+	
+
+.. |video| image:: https://img.youtube.com/vi/cteER7WeiGk/0.jpg
+   :scale: 100%
+   :align: middle
+   :target: https://www.youtube.com/watch?v=cteER7WeiGk
+
++---------+
+| |video| |
++---------+
+
+	
+4. 运行单元测试
+-----------------
+
+* 在test文件夹下,生成Visual Studio的解决方案:
+
+.. code-block:: bash
+
+	cmake -G "Visual Studio 15 2017 Win64"
+
+* 在Visual Studio中打开生成好的解决方案。
+
+* 更改创建环境为Release和x64。
+
+* 创建glog项目。
+
+* 在test_singa项目中:
+	
+    * 将USE_GLOG添加到预处理器定义中。
+    * 在其他包含目录中,添加上述步骤2中使用的GLOG_INCLUDE_DIR,CBLAS_INCLUDE_DIR和Protobuf_INCLUDE_DIR的路径。 添加也构建和建立/包含文件夹。
+    * 转到其他库目录并添加到openblas,protobuf和glog库的路径。 也可以添加build / src / singa_objects.dir / Release。
+    * 转到附加依赖项并添加libopenblas.lib,libglog.lib和libprotobuf.lib。 修复两个库的名称:gtest.lib和singa_objects.lib。
+
+* 创建test_singa项目。
+
+* 通过把它们加入到系统路径或拷贝到test/release文件夹下使得libglog.dll和libopenblas.dll可被获取到。
+
+* 单元测试有如下运行方式:
+
+	* 从命令行:
+	
+		.. code-block:: bash
+	
+			test_singa.exe
+
+	* 从Visual Studio:
+		* 右键单击test_singa项目并选择“设为启动项目”
+		* 从“调试”菜单中选择“无需调试即可开始”
+
+你可以在这里看到一个关于运行单元测试的视频教程:
+	
+
+.. |video| image:: https://img.youtube.com/vi/393gPtzMN1k/0.jpg
+   :scale: 100%
+   :align: middle
+   :target: https://www.youtube.com/watch?v=393gPtzMN1k
+
++---------+
+| |video| |
++---------+
+
+	
+5. 创建基于CUDA的GPU支持
+------------------------------
+
+在本节中,我们将扩展前面的步骤以启用GPU。
+
+5.1 安装依赖库
+------------------------
+
+除了1部分的依赖库,我们还将需要如下库:
+
+* CUDA 
+	
+	从https://developer.nvidia.com/cuda-downloads下载合适的版本,比如9.1。确保安装Visual Studio集成模块。
+
+* cuDNN
+
+	从https://developer.nvidia.com/cudnn下载合适的版本,比如7.1。 
+
+* cnmem: 
+
+	* 从https://github.com/NVIDIA/cnmem下载最新版本
+	* 创建Visual Studio的解决方案:
+	
+		.. code-block:: bash
+	
+			cmake -G "Visual Studio 15 2017 Win64"
+		
+	* 在Visual Studio中打开生成的解决方案。
+	* 将创建设置更改为Release和x64。
+	* 创建cnmem项目。
+	
+
+5.2 创建SINGA
+----------------------
+
+* 调用cmake并在系统中添加类似以下示例的路径:
+
+	.. code-block:: bash
+	
+    		cmake -G "Visual Studio 15 2017 Win64" ^
+			  -DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
+			  -DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
+			  -DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
+			  -DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
+			  -DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
+			  -DProtobuf_LIBRARIES="D:\WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
+			  -DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
+			  -DCUDNN_INCLUDE_DIR=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\include ^
+			  -DCUDNN_LIBRARIES=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\lib\x64 ^
+			  -DSWIG_DIR=D:\WinSinga\dependencies\swigwin-3.0.12 ^
+			  -DSWIG_EXECUTABLE=D:\WinSinga\dependencies\swigwin-3.0.12\swig.exe ^
+			  -DUSE_CUDA=YES ^
+			  -DCUDNN_VERSION=7 ^
+			  ..
+  
+
+* 为C++和Python生成swig接口:
+	进入 src/api
+
+	.. code-block:: bash
+	
+		swig -python -c++ singa.i
+
+* 在Visual Studio中打开生成的解决方案
+
+* 将版本设置更改为Release和x64
+
+5.2.1 创建singa_objects
+----------------------------
+
+* 将src/api中的singa_wrap.cxx文件添加到singa_objects项目中。
+* 在singa_objects项目中,打开其他包含目录。
+* 添加Python包含路径。
+* 添加numpy包含路径。
+* 添加protobuf包含路径。
+* 为CUDA,cuDNN和cnmem添加包含路径。
+* 在singa_objects项目的预处理器定义中,添加USE_GLOG,USE_CUDA和USE_CUDNN。删除DISABLE_WARNINGS。
+* 建立singa_objects项目。
+	
+5.2.2 创建singa-kernel
+---------------------------	
+
+* 创建一个类型为“CUDA 9.1 Runtime”的新Visual Studio程序。 给它起一个名字,比如singa-kernel。
+* 该项目带有一个名为kernel.cu的初始文件。 从项目中删除此文件。
+* 添加此文件:src / core / tensor / math_kernel.cu
+* 在项目设置中:
+
+	* 将Platfrom工具集设置为“Visual Studio 2015(v140)”
+	* 将配置类型设置为“静态库(.lib)”
+	* 在包含目录中,添加build/include
+
+* 创建singa-kernel项目
+
+
+5.2.3 创建singa
+--------------------
+	
+* 在singa项目中:
+
+	* 将singa_wrap.obj添加到对象库。
+	* 将目标名称更改为_singa_wrap。
+	* 将目标扩展名更改为.pyd。
+	* 将配置类型更改为动态库(.dll)。
+	* 转到其他库目录并添加到Python,openblas,protobuf和glog库的路径。
+	* 还将库路径添加到singa-kernel,cnmem,cuda和cudnn。
+	* 转到附加依赖关系并添加libopenblas.lib,libglog.lib和libprotobuf.lib。
+	* 添加:singa-kernel.lib,cnmem.lib,cudnn.lib,cuda.lib,cublas.lib,curand.lib和cudart.lib。
+	
+* 创建singa项目
+
+5.3. 安装Python模块
+--------------------------
+
+* 在build/python/setup.py中,将Change _singa_wrap.so改为_singa_wrap.pyd  
+* 拷贝src/proto/python_out中的文件到build/python/singa/proto
+
+* (可选择的)创建并激活一个虚拟环境:
+
+.. code-block:: bash
+
+	mkdir SingaEnv
+	virtualenv SingaEnv
+	SingaEnv\Scripts\activate
+	
+* 进入build/python文件夹并运行:
+
+.. code-block:: bash
+
+	python setup.py install
+
+* 将_singa_wrap.pyd,libglog.dll,libopenblas.dll,cnmem.dll,CUDA运行时(例如cudart64_91.dll)和cuDNN(例如cudnn64_7.dll)添加到路径或通过将它们复制到singa包文件夹 python网站包。
+	
+* 通过下面指令验证SINGA已安装:
+
+.. code-block:: bash
+
+	python -c "from singa import device; dev = device.create_cuda_gpu()"
+
+关于这部分的视频教程可以在下面找到:
+	
+
+.. |video| image:: https://img.youtube.com/vi/YasKVjRtuDs/0.jpg
+   :scale: 100%
+   :align: middle
+   :target: https://www.youtube.com/watch?v=YasKVjRtuDs
+
++---------+
+| |video| |
++---------+
+
+5.4. 运行单元测试
+-----------------
+
+* 在test文件夹下,生成Visual Studio的解决方案:
+
+.. code-block:: bash
+
+	cmake -G "Visual Studio 15 2017 Win64"
+
+* 在Visual Studio中打开生成好的解决方案。
+
+* 更改创建环境为Release和x64。
+
+* 创建glog项目。
+
+* 在test_singa项目中:
+	
+    * 将USE_GLOG添加到预处理器定义中。
+    * 在其他包含目录中,添加上述步骤2中使用的GLOG_INCLUDE_DIR,CBLAS_INCLUDE_DIR和Protobuf_INCLUDE_DIR的路径。 添加也构建和建立/包含文件夹。
+    * 转到其他库目录并添加到openblas,protobuf和glog库的路径。 也可以添加build / src / singa_objects.dir / Release。
+    * 转到附加依赖项并添加libopenblas.lib,libglog.lib和libprotobuf.lib。 修复两个库的名称:gtest.lib和singa_objects.lib。
+
+* 创建test_singa项目。
+
+* 通过把它们加入到系统路径或拷贝到test/release文件夹下使得libglog.dll和libopenblas.dll可被获取到。
+
+* 单元测试有如下运行方式:
+
+	* 从命令行:
+	
+		.. code-block:: bash
+	
+			test_singa.exe
+
+	* 从Visual Studio:
+		* 右键单击test_singa项目并选择“设为启动项目”
+		* 从“调试”菜单中选择“无需调试即可开始”
+
+你可以在这里看到一个关于运行单元测试的视频教程:
+	
+
+.. |video| image:: https://img.youtube.com/vi/YOjwtrvTPn4/0.jpg
+   :scale: 100%
+   :align: middle
+   :target: https://www.youtube.com/watch?v=YOjwtrvTPn4
+
++---------+
+| |video| |
++---------+

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/installation.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/installation.md b/doc/zh/docs/installation.md
new file mode 100755
index 0000000..472a054
--- /dev/null
+++ b/doc/zh/docs/installation.md
@@ -0,0 +1,309 @@
+# 安装
+
+## 从Conda安装
+
+Conda是Python,CPP和其他软件包的软件包管理员。
+
+目前,SINGA有适用于Linux和MacOSX的conda软件包(Python 2.7和Python 3.6)。
+建议使用[Miniconda3](https://conda.io/miniconda.html)与SINGA一起使用。安装完miniconda后,执行以下命令之一来安装SINGA。
+
+1. CPU版本
+
+        conda install -c nusdbsystem singa-cpu
+
+2. 由CUDA和cuDNN支持的GPU版本
+
+        conda install -c nusdbsystem singa-gpu
+
+  等同于
+
+		conda install -c nusdbsystem singa=1.1.1=py36_cuda9.0-cudnn7.1.2
+
+  在执行上述命令之前,必须先安装CUDA 9.0。 其他CUDA版本的Singa软件包也可用。 以下说明列出了所有可用的Singa软件包。
+
+		conda search -c nusdbsystem singa
+
+  如果下面指令没有出现错误提示,说明SINGA已经安装成功。
+
+		python -c "from singa import tensor"
+
+
+## 从源码安装
+
+源文件可以被下载为[tar.gz 文件](https://dist.apache.org/repos/dist/dev/incubator/singa/),或者为一个git仓库:
+
+		$ git clone https://github.com/apache/incubator-singa.git
+		$ cd incubator-singa/
+
+### 由conda创建SINGA
+
+Conda-build是一款构建工具,可以安装anaconda云中的相关库并执行构建脚本。 生成的软件包可以上传到anaconda云中供他人下载和安装。
+
+安装conda-build (安装miniconda后)
+
+		conda install conda-build
+
+创建CPU版本的SINGA
+
+		export BUILD_STR=cpu
+		conda build tool/conda/singa/ --python3.6 (or --python2.7)
+
+上面的指令已在Ubuntu 16.04和Mac OSX上测试过。更多信息请参考[Travis-CI页面](https://travis-ci.org/apache/incubator-singa)。
+
+创建GPU版本的SINGA
+
+		export BUILD_STR=cudax.y-cudnna.b.c (e.g. cuda9.0-cudnn7.1.2)
+		export CUDNN_PATH=<path to cudnn folder>
+		conda build tool/conda/singa/ --python3.6 (or --python2.7)
+
+这些基于GPU平台的指令已经在Ubuntu 16.04 (cuDNN >= 7和CUDA >= 9)上测试过。
+[Nvidia的docker镜像](https://hub.docker.com/r/nvidia/cuda/)提供了cuDNN和CUDA的创建环境。
+
+屏幕上将显示生成的包文件的位置。
+请参阅[conda安装](https://conda.io/docs/commands/conda-install.html)
+对从本地文件安装软件包的说明。
+
+### 使用本地工具在Ubuntu上创建SINGA
+
+编译和运行SINGA需要以下库。
+有关在Ubuntu 16.04上安装它们的说明,
+请参阅SINGA [Dockerfiles](https://github.com/apache/incubator-singa/blob/master/tool/docker/)。
+
+* cmake (>=2.8)
+* gcc (>=4.8.1) or Clang
+* google protobuf (>=2.5)
+* blas (tested with openblas >=0.2.10)
+* swig(>=3.0.10) for compiling PySINGA
+* numpy(>=1.11.0) for compiling PySINGA
+
+
+1. 在incubator-singa目录下创建一个`build`文件夹并进入其中
+2. 运行 `cmake [options] ..`
+  默认情况下除了`USE_PYTHON`,其他所有可选项都是OFF
+
+    * `USE_MODULES=ON`, 当protobuf和blas没有被安装时使用
+    * `USE_CUDA=ON`, 当CUDA和cuDNN可用时使用
+    * `USE_PYTHON=ON`, 用于编译PySINGA
+    * `USE_PYTHON3=ON`, 用于支持Python 3编译 (默认的是Python 2)
+    * `USE_OPENCL=ON`, 用于支持OpenCL编译
+    * `PACKAGE=ON`, 用于创建Debian包
+    * `ENABLE_TEST`,用于编译单元测试用例
+
+3. 编译代码, 如: `make`
+4. 进入python文件夹
+5. 运行 `pip install .`或者 `pip install -e .`。第二个指令创建符号链接而不是将文件复制到python站点包文件夹中。
+
+当USE_PYTHON=ON时,第4步和第5步用于安装PySINGA。
+
+在通过ENABLE_TEST=ON编译好SINGA后,你可以运行单元测试
+
+		$ ./bin/test_singa
+
+你可以看到所有测试用例和测试结果。
+如果SINGA通过所有测试,那么你已经成功安装了SINGA。
+
+### 在Windows上编译SINGA
+
+基于Python支持的Windows上的安装说明可以在[这里](install_win.html)找到。
+
+### 更多编译选择
+
+#### USE_MODULES
+
+如果protobuf和openblas没有安装,在编译SINGA时需要如下处理:
+
+		$ In SINGA ROOT folder
+		$ mkdir build
+		$ cd build
+		$ cmake -DUSE_MODULES=ON ..
+		$ make
+
+cmake会下载OpenBlas和Protobuf(2.6.1)并同SINGA一起编译。
+
+你可以使用`cmake ..`来配置编译操作指令。 如果一些依赖库没有被安装在默认路径下,你需要导出相应的环境变量:
+
+		export CMAKE_INCLUDE_PATH=<path to the header file folder>
+		export CMAKE_LIBRARY_PATH=<path to the lib file folder>
+
+#### USE_PYTHON
+
+类似于编译CPP代码, PySINGA可以被这么编译:
+
+		$ cmake -DUSE_PYTHON=ON ..
+		$ make
+		$ cd python
+		$ pip install .
+
+#### USE_CUDA
+
+用户被推荐安装CUDA和[cuDNN](https://developer.nvidia.com/cudnn)以在GPU上运行SINGA时获得更好的性能。
+
+SINGA已经在CUDA 9和cuDNN 7上测试过。 如果cuDNN在非系统目录下解压,如/home/bob/local/cudnn/, 下面的指令需要被执行以让cmake和运行时能找到它:
+
+		$ export CMAKE_INCLUDE_PATH=/home/bob/local/cudnn/include:$CMAKE_INCLUDE_PATH
+		$ export CMAKE_LIBRARY_PATH=/home/bob/local/cudnn/lib64:$CMAKE_LIBRARY_PATH
+		$ export LD_LIBRARY_PATH=/home/bob/local/cudnn/lib64:$LD_LIBRARY_PATH
+
+cmake对CUDA和cuDNN的操作选项应该被开启:
+
+		# 依赖库已经被安装
+		$ cmake -DUSE_CUDA=ON ..
+		$ make
+
+#### USE_OPENCL
+
+SINGA用opencl-header和viennacl(1.7.1版本或更新)以获得OpenCL支持。 它们可由以下指令安装:
+
+		# 在Ubuntu 16.04上
+		$ sudo apt-get install opencl-headers, libviennacl-dev
+		# 在Fedora上
+		$ sudo yum install opencl-headers, viennacl
+
+另外,你将需要OpenCL Installable Client Driver (ICD)以在你的平台上运行OpenCL。
+
+* 对于AMD和Nvidia GPU, 驱动包还需要包含正确的OpenCL ICD。
+* 对于英特尔CPUs和/或GPUs, 可以从[英特尔官网](https://software.intel.com/en-us/articles/opencl-drivers)上获取到。 注意, 官网上提供的驱动仅支持近期的CPUs和GPUs。
+* 对于更老的英特尔CPUs,你可以选用`beignet-opencl-icd`包。
+
+注意,在CPU上运行OpenCL目前是不推荐的,因为很慢。 内存传输是以秒的级别(CPU上为1000 ms,而GPU上为1毫秒)。
+
+更多关于OpenCL环境配置的信息可以从[这里](https://wiki.tiker.net/OpenCLHowTo)获得。
+
+如果ViennaCL包版本低于1.7.1,你将需要从源码编译:
+
+从[git仓库](https://github.com/viennacl/viennacl-dev)clone,checkout到`release-1.7.1`标签。记得把仓库的路径加到环境变量`PATH`中,并且创建库到`LD_LIBRARY_PATH`。
+
+编译基于OpenCL支持的SINGA (测试与SINGA 1.1):
+
+		$ cmake -DUSE_OPENCL=ON ..
+		$ make
+
+#### PACKAGE
+
+此设置用于创建Debian包。 设置PACKAGE=ON并用以下命令创建包:
+
+		$ cmake -DPACKAGE=ON
+		$ make package
+
+
+## FAQ
+
+* Q: 在使用由wheel安装的PySINGA('import singa')时,出现错误。
+
+    A: 请查看`python -c "from singa import _singa_wrap"`详细错误提示。 这有时是由依赖库造成的,比如,有多个版本的protobuf,cudnn缺失,numpy版本不匹配。 下面的步骤详述了不同的案例:
+    1. 检查cudnn,cuda和gcc版本,推荐使用cudnn5,cuda7.5和gcc4.8/4.9。 如果gcc是5.0版本, 需要降低版本。 如果cudnn确实或者与wheel版本不匹配,你可以将正确的cudnn版本下载到~/local/cudnn/ 并且
+
+            $ echo "export LD_LIBRARY_PATH=/home/<yourname>/local/cudnn/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
+
+    2. 如果是protobuf的问题,需要下载最新的[编译过protobuf和openblas的whl文件](https://issues.apache.org/jira/browse/SINGA-255)。 或者,你可以从源码安装protobuf到指定文件夹,比如:~/local/;解压tar文件,然后执行
+
+            $ ./configure --prefix=/home/<yourname>local
+            $ make && make install
+            $ echo "export LD_LIBRARY_PATH=/home/<yourname>/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
+            $ source ~/.bashrc
+
+    3. 如果找不到其他python库,你可以用pip或conda创建python虚拟环境。
+
+    4. 如果不是以上原因造成的,进入`_singa_wrap.so`所在文件夹,执行
+
+            $ python
+            >> import importlib
+            >> importlib.import_module('_singa_wrap')
+
+      检查错误信息。 比如,如果numpy版本不匹配,错误信息将会是
+
+            RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
+
+      接着,你需要提升numpy版本。
+
+
+* Q: 运行`cmake ..`报错,找不到依赖库。
+
+    A: 如果你没有安装相应库,就去安装它们。如果你把这些库安装在非系统默认的路径下,如/usr/local,你可以将正确路径导出到环境变量中:
+
+        $ export CMAKE_INCLUDE_PATH=<path to your header file folder>
+        $ export CMAKE_LIBRARY_PATH=<path to your lib file folder>
+
+
+* Q: `make`报错,如连接阶段
+
+    A: 如果你的库文件在非系统默认路径下,你需要导出相应的变量
+
+        $ export LIBRARY_PATH=<path to your lib file folder>
+        $ export LD_LIBRARY_PATH=<path to your lib file folder>
+
+
+* Q: 头文件错误,比如:'cblas.h no such file or directory exists'
+
+    A: 你需要把cblas.h的路径加入到CPLUS_INCLUDE_PATH,如
+
+        $ export CPLUS_INCLUDE_PATH=/opt/OpenBLAS/include:$CPLUS_INCLUDE_PATH
+
+* Q:编译SINGA时,我发现了错误`SSE2 instruction set not enabled`
+
+    A:你可以尝试如下命令
+
+        $ make CFLAGS='-msse2' CXXFLAGS='-msse2'
+
+* Q:当我试图导入.py文件时,我得到错误提示`ImportError: cannot import name enum_type_wrapper`。
+
+    A: 你需要安装绑定到python的protobuf,可以由如下命令安装
+
+        $ sudo apt-get install protobuf
+
+    或者从源码安装
+
+        $ cd /PROTOBUF/SOURCE/FOLDER
+        $ cd python
+        $ python setup.py build
+        $ python setup.py install
+
+* Q: 当我从源码创建OpenBLAS时,被告知需要Fortran编译器。
+
+    A: 你可以用如下命令编译OpenBLAS
+
+        $ make ONLY_CBLAS=1
+
+    或者
+
+        $ sudo apt-get install libopenblas-dev
+
+* Q: 当我创建protocol buffer时,出现错误提示`GLIBC++_3.4.20 not found in /usr/lib64/libstdc++.so.6`。
+
+    A: 这说明连接器找到了libstdc++.so.6,但是这个库属于一个更老版本的GCC编译器。 要编译的程序依赖于定义在新版本GCC下的libstdc++库,所以连接器必须被告知如何找到新版的可共享的libstdc++库。 最简单的处理方法是找到正确的libstdc++库,导出到LD_LIBRARY_PATH变量。 比如,如果GLIBC++_3.4.20被列在如下命令的输出中
+
+        $ strings /usr/local/lib64/libstdc++.so.6|grep GLIBC++
+
+    之后,你只需要设置环境变量
+
+        $ export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
+
+* Q: 当我创建glog时报错,"src/logging_unittest.cc:83:20: error: 'gflags' is not a namespace-name"。
+
+    A: 这可能是你装了一个不同命名空间的gflags,比如"google",所以glog找不到'gflags'命名空间。 gflags不是创建glog必须的, 所以你可以修改configure.ac文件以忽略gflags。
+
+        1. cd to glog src directory
+        2. change line 125 of configure.ac  to "AC_CHECK_LIB(gflags, main, ac_cv_have_libgflags=0, ac_cv_have_libgflags=0)"
+        3. autoreconf
+
+    之后,你可以重新创建glog。
+
+* Q: 当使用虚拟环境时,每次我运行pip install都会重新安装numpy。 然而,在`import numpy`时,numpy可能并没有被使用。
+
+    A: 这可能是因为在使用虚拟环境时,`PYTHONPATH`被设置成了空以防止与虚拟环境中的路径发生冲突。
+
+* Q: 当从源码编译PySINGA时,会因为缺失<numpy/objectarray.h>而出现编译错误。
+
+    A: 请安装numpy并且通过如下命令导出numpy头文件
+
+        $ export CPLUS_INCLUDE_PATH=`python -c "import numpy; print numpy.get_include()"`:$CPLUS_INCLUDE_PATH
+
+* Q: 当在Mac OS X下运行PySINGA时,我得到了错误信息"Fatal Python error: PyThreadState_Get: no current thread Abort trap: 6"。
+
+    A: 这个错误很典型地出现在当你系统中存在多个版本的python并且你是通过pip安装
+SINGA的(这个问题可以通过由conda安装SINGA来解决), 比如:一个来自于OS,一个通过Homebrew安装。 和SINGA连接的Python必须和Python解析器是同个版本。你可以通过which python来查看python解析器版本,并通过otool -L <path to _singa_wrap.so>检查和PySINGA连接的Python版本。 为了解决这个问题, 需要用正确的Python版本来编译SINGA。 特别地,如果你从源码创建的PySINGA,当唤起[cmake](http://stackoverflow.com/questions/15291500/i-have-2-versions-of-python-installed-but-cmake-is-using-older-version-how-do)时你需要指定安装路径
+
+        $ cmake -DPYTHON_LIBRARY=`python-config --prefix`/lib/libpython2.7.dylib -DPYTHON_INCLUDE_DIR=`python-config --prefix`/include/python2.7/ ..
+
+    如果从二进制文件安装PySINGA,比如debian或者wheel,那么你需要改变python解析器,如重置变量$PATH,把正确的Python路径加在最前面。
+

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/layer.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/layer.md b/doc/zh/docs/layer.md
new file mode 100644
index 0000000..db7d712
--- /dev/null
+++ b/doc/zh/docs/layer.md
@@ -0,0 +1,492 @@
+# 层(Layer)
+
+## Python API
+
+Python层将C++层封装成更简单的API。
+
+示例用法:
+
+```python
+from singa import layer
+from singa import tensor
+from singa import device
+
+layer.engine = 'cudnn'  # to use cudnn layers
+dev = device.create_cuda_gpu()
+
+# create a convolution layer
+conv = layer.Conv2D('conv', 32, 3, 1, pad=1, input_sample_shape=(3, 32, 32))
+conv.to_device(dev)  # move the layer data onto a CudaGPU device
+x = tensor.Tensor((3, 32, 32), dev)
+x.uniform(-1, 1)
+y = conv.foward(True, x)
+
+dy = tensor.Tensor()
+dy.reset_like(y)
+dy.set_value(0.1)
+# dp is a list of tensors for parameter gradients
+dx, dp = conv.backward(kTrain, dy)
+```
+
+---
+
+#### singa.layer.engine = 'cudnn'
+
+引擎(engine)是层标识符的前缀。
+这个值可能是[cudnn','singacpp','singacuda','singacl']之一,分别用cudnn库,Cpp,Cuda和OpenCL实现。 例如,CudnnConvolution层由'cudnn_convolution'标识; 'singacpp_convolution'用于卷积层; 有些层的实现只使用tensor函数,因此它们对底层设备是透明的。 对于这些层,它们将具有多个标识符,例如,singacpp_dropout,singacuda_dropout和singacl_dropout全都用于Dropout层。 此外,它还有一个额外的标识符'singa',即'singa_dropout'也代表Dropout层。
+
+引擎是大小写敏感的。每个python层将会用引擎属性创建正确的层。
+
+---
+
+### class singa.layer.Layer(name, conf=None, **kwargs)
+
+基类:`object`
+
+Python层的基类。
+典型地,层实例的生命周期包括:
+
+1. 构造层没有input_sample_shapes,转到2;用input_sample_shapes构建层,转到3
+2. 调用setup来创建参数并设置其他元字段
+3. 调用前向传播或访问层成员
+4. 调用后向传播并获取参数完成更新
+
+**参数:**
+- **name (str)** – 层名
+
+---
+
+#### setup(in_shapes)
+
+调用C++setup函数创建参数并设置元数据。
+
+**参数:**
+- **in_shapes** – 如果层接受单个输入tensor,则in_shapes是指定输入tensor形状的单个元组; 如果该层接受多个输入tensor(例如,concatenation层),则in_shapes是元组的元组,每个元组对于一个输入tensor
+
+---
+
+#### caffe_layer()
+
+基于caffe层的配置创建一个SINGA层
+
+---
+
+#### get_output_sample_shape()
+
+在setup以获得输出样本的形状后被调用
+
+**返回值:** 单个输出tensor的元组;如果该层具有多个输出,则为元组列表
+
+---
+
+#### param_names()
+**返回值:** 字符串列表,每个值代表一个参数tensor的名称
+
+---
+
+#### param_values()
+
+返回参数值tensor。
+参数tesnor不作为层成员存储。由于层设备的更改,cpp tensor可能会移动到diff设备上,这会导致不一致。
+
+**返回值:** tensor列表,每个参数对应列表中的一个
+
+---
+
+#### forward(flag, x)
+
+当前层的前向传播。
+
+**参数:**
+- **flag** – True (kTrain) for training (kEval); False for evaluating; other values for furture use.
+- **x (Tensor or list<Tensor>)** – an input tensor if the layer is connected from a single layer; a list of tensors if the layer is connected from multiple layers.
+
+**返回值:** 如果该层被连接在一个单独的层则返回tensor;如果被连接到多个层,则返回一个tensor列表
+
+---
+
+#### backward(flag, dy)
+
+当前层的后向传播。
+
+**参数:**
+- **flag (int)** – 保留为以后使用
+- **dy (Tensor or list<Tensor>)** – 与目标损失相对应的梯度tensor
+
+**返回值:** <dx, <dp1, dp2..>>,dx是输入x的梯度,dpi是第i个参数的梯度
+
+---
+
+#### to_device(device)
+
+将层状态tensor移至指定设备。
+
+**参数:** 
+- **device** – swig转换的设备,由singa.device创建
+
+---
+
+### class singa.layer.Dummy(name, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+一个虚拟层,仅用于向前/向后传递数据(输入/输出是单个tensor)。
+
+
+#### forward(flag, x)
+
+**返回值:** 输入x
+
+#### backward(falg, dy)
+
+**返回值:** dy,[]
+
+---
+
+### class singa.layer.Conv2D(name, nb_kernels, kernel=3, stride=1, border_mode='same', cudnn_prefer='fatest', data_format='NCHW', use_bias=True, W_specs=None, b_specs=None, pad=None, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+创建一个层做2D卷积。
+
+**参数:**
+- **nb_kernels (int)** – 输入tensor的通道(核)数
+- **kernel** – 一个或一对整型数表示核的高和宽
+- **stride** – 一个或一对整型数表示步长的高和宽
+- **border_mode (string)** – 填充模式,不区分大小写,‘valid’ -> 在高和宽长度上补0 ‘same’ -> 填充核一半(下取整)数目的0,核必须是奇数
+- **cudnn_prefer (string)** – 偏好的cudnn卷积算法,可以是‘fatest’, ‘autotune’, ‘limited_workspace’和‘no_workspace’
+- **data_format (string)** – ‘NCHW’或‘NHWC’
+- **use_bias (bool)** – True或False
+- **pad** – 一个或一对整型数表示填充的高和宽
+- **W_specs (dict)** – 用于指定权重矩阵的规格,字段包括代表参数名称的‘name’,代表学习速率乘数的'lr_mult,代表权重衰减乘数的''decay_mult',代表初始化方法的'init',其可以是'gaussian','uniform',' xavier',相应的初始化方法为'''std','mean','high','low'。TODO(wangwei)'clamp'为渐变约束,value为标量,'regularizer'为正规化,目前支持'l2'
+- **b_specs (dict)** – 偏移向量的超参数,同W_specs类似
+- **name (string)** – 层名
+- **input_sample_shape** – 用于输入tensor形状的三元组,例如(通道,高度,宽度)或(高度,宽度,通道)
+
+---
+
+### class singa.layer.Conv1D(name, nb_kernels, kernel=3, stride=1, border_mode='same', cudnn_prefer='fatest', use_bias=True, W_specs={'init': 'Xavier'}, b_specs={'init': 'Constant', 'value': 0}, pad=None, input_sample_shape=None)
+
+基类:`singa.layer.Conv2D`
+
+构建1D卷积层。
+大部分参数与Conv2D的参数相同,除了核,步长,填充值,这是一个标量而不是元组。 input_sample_shape是一个具有单个输入特征长度值的元组。
+
+#### get_output_sample_shape()
+
+---
+
+### class singa.layer.Pooling2D(name, mode, kernel=3, stride=2, border_mode='same', pad=None, data_format='NCHW', input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+2D池化层进行最大或平均池化。
+所有的参数都与Conv2D相同,除了下面的参数。
+
+**参数:**
+- **mode** – 池化模式,model_pb2.PoolingConf.MAX或model_pb2.PoolingConf.AVE
+
+---
+
+### class singa.layer.MaxPooling2D(name, kernel=3, stride=2, border_mode='same', pad=None, data_format='NCHW', input_sample_shape=None)
+
+基类: `singa.layer.Pooling2D`
+
+---
+
+### class singa.layer.AvgPooling2D(name, kernel=3, stride=2, border_mode='same', pad=None, data_format='NCHW', input_sample_shape=None)
+
+基类: `singa.layer.Pooling2D`
+
+---
+
+### class singa.layer.MaxPooling1D(name, kernel=3, stride=2, border_mode='same', pad=None, data_format='NCHW', input_sample_shape=None)
+
+基类: `singa.layer.MaxPooling2D`
+
+get_output_sample_shape()
+
+---
+
+### class singa.layer.AvgPooling1D(name, kernel=3, stride=2, border_mode='same', pad=None, data_format='NCHW', input_sample_shape=None)
+
+基类: `singa.layer.AvgPooling2D`
+
+get_output_sample_shape()
+
+---
+
+### class singa.layer.BatchNormalization(name, momentum=0.9, beta_specs=None, gamma_specs=None, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+批量正则化。
+
+**参数:**
+- **momentum (float)** – 用于运行的均值和方差
+- **beta_specs (dict)** – 字典,包括beta参数的字段:'name'参数名称';lr_mult'学习速率乘数;'decay_mult'权重衰减乘数;'init'初始化方法;可以是'gaussian','uniform'和'xavier','std','mean','high','low'表示相应初始化方法;'clamp'表示梯度约束,值是标量;'regularizer'用于正则化,目前支持'l2'
+- **gamma_specs (dict)** – 同beta_specs类似, 但用于gamma参数.
+- **name (string)** – 层名
+- **input_sample_shape (tuple)** – 整型数,至少一个
+
+---
+
+### class singa.layer.LRN(name, size=5, alpha=1, beta=0.75, mode='cross_channel', k=1, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+局部响应归一化。
+
+**参数:**
+- **size (int)** – 用于归一化的通道数.
+- **mode (string)** – ‘cross_channel’
+- **input_sample_shape (tuple)** – 3维元组,(channel, height, width)
+
+---
+
+### class singa.layer.Dense(name, num_output, use_bias=True, W_specs=None, b_specs=None, W_transpose=False, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+进行线性或放射变换,也被叫做内积或全连接层。
+
+**参数:**
+- **num_output (int)** – 输出特征长度
+- **use_bias (bool)** – 转换后的特征向量是否加上偏移向量
+- **W_specs (dict)** – 包含权值矩阵的字段:'name'参数名称';lr_mult'学习速率乘数;'decay_mult'权重衰减乘数;'init'初始化方法;可以是'gaussian','uniform'和'xavier','std','mean','high','low'表示相应初始化方法;'clamp'表示梯度约束,值是标量;'regularizer'用于正则化,目前支持'l2'
+- **b_specs (dict)** – 偏移向量的字段, 同W_specs类似
+- **W_transpose (bool)** – 如果为真,输出为x*W.T+b
+- **input_sample_shape (tuple)** – 输入特征长度
+
+---
+
+### class singa.layer.Dropout(name, p=0.5, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+Dropout层
+
+**参数:**
+- **p (float)** – 随机丢掉一个元素(即将其中设为0)的概率
+- **name (string)** – 层名
+
+---
+
+### class singa.layer.Activation(name, mode='relu', input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+激励层
+
+**参数:**
+- **name (string)** – 层名
+- **mode (string)** – ‘relu’, ‘sigmoid’或 ‘tanh’
+- **input_sample_shape (tuple)** – 单个样本的形状
+
+---
+
+### class singa.layer.Softmax(name, axis=1, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+采用SoftMax。
+
+**参数:**
+- **axis (int)** – 对[axis, -1)的数据逐个进行SoftMax
+- **input_sample_shape (tuple)** – 单个样本的形状
+
+---
+
+### class singa.layer.Flatten(name, axis=1, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+将输入tensor重塑为一个矩阵。
+
+**参数:**
+- **axis (int)** – 根据指定维度将输入重塑为矩阵,[0,axis)作为行,[axis, -1)作为列
+- **input_sample_shape (tuple)** – 单个样本的形状
+
+---
+
+### class singa.layer.Merge(name, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+对所有输入tensor求和。
+
+**参数:**
+- **input_sample_shape** – 输入样本的形状。所有样本的形状应该一致。
+
+#### setup(in_shape)
+
+#### get_output_sample_shape()
+
+#### forward(flag, inputs)
+
+通过求和合并所有输入tensor。
+TODO(wangwei) 元素级别的合并操作。
+
+**返回值:** 单个tensor,包含所有输入tensor的和
+
+#### backward(flag, grad)
+
+复制每个输入层的梯度tensor。
+
+**参数:**
+- **grad** - 梯度tensor
+
+**返回值:** tensor列表,每个输入层对应其中一个
+
+---
+
+### class singa.layer.Split(name, num_output, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+生成输入tensor的多个副本。
+
+**参数:**
+- **num_output (int)** – 待生成的输出tensor数目
+- **input_sample_shape()** – 包含一个整型数,代表输入样本特征大小
+
+#### setup(in_shape)
+
+#### get_output_sample_shape()
+
+#### forward()
+
+生成输入tensor的多个副本。
+
+**参数:**
+- **flag** – 没有用到
+- **input** – 单个输入tensor
+
+**返回值:** 输出tensor列表,每个对应输入的一个拷贝
+
+#### backward()
+
+对所有输入tensor求和得到单个输出tensor。
+
+**参数:**
+- **grad** - 梯度tensor
+
+**返回值:** 一个tensor,代表所有输入梯度tensor的求和
+
+---
+
+### class singa.layer.Concat(name, axis, input_sample_shapes=None)
+
+基类:`singa.layer.Layer`
+
+将tensor竖直(axis=0)或水平(axis=1)拼接。目前仅支持2维tensor。
+
+**参数:**
+- **axis (int)** – 0表示拼接行; 1表示拼接列;
+- **input_sample_shapes** – 样本形状的元组列表,每个对应一个输入样本的tensor
+
+#### forward(flag, inputs)
+
+拼接所有输入tensor。
+
+**参数:**
+- **flag** – 同Layer::forward()
+- **input** – tensor列表
+
+**返回值:** 一个拼接后的tensor
+
+
+#### backward(flag, dy)
+
+**参数:**
+- **flag** – same as Layer::backward()
+- **dy (Tensor)** – the gradient tensors of y w.r.t objective loss
+
+**返回值:** 元组(dx, []), dx是tensor列表,对应输入的梯度;[]是空列表
+
+---
+
+### class singa.layer.Slice(name, axis, slice_point, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+将输入tensor沿竖直(axis=0)或水平(axis=1)分成多个子tensor。
+
+**参数:**
+- **axis (int)** – 0代表分割行; 1代表分割列;
+- **slice_point (list)** – 沿着轴分割的位置;n-1个分割点对应n个子tensor;
+- **input_sample_shape** – 输入样本tensor的形状
+
+#### get_output_sample_shape()
+
+#### forward(flag, x)
+
+沿给定轴分割输入tensor。
+
+**参数:**
+- **flag** – 同Layer::forward()
+- **x** – 单个输入tensor
+
+**返回值:** 输出tensor列表
+
+#### backward(flag, grads)
+
+拼接所有梯度tensor以生成一个输出tensor。
+
+**参数:**
+- **flag** – 同Layer::backward()
+- **grads** – tensor列表,每个对应一个分割的梯度tensor
+**返回值:** 元组(dx, []), dx是一个tensor,对应原始输入的梯度;[]是空列表
+
+---
+
+### class singa.layer.RNN(name, hidden_size, rnn_mode='lstm', dropout=0.0, num_stacks=1, input_mode='linear', bidirectional=False, param_specs=None, input_sample_shape=None)
+
+基类:`singa.layer.Layer`
+
+递归层包含4个单元,即lstm, gru, tanh和relu。
+
+**参数:**
+- **hidden_size** – 隐含层特征大小,同所有层的堆栈。
+- **rnn_mode** – 决定了RNN单元,可以是‘lstm’, ‘gru’, ‘tanh’和 ‘relu’。对于每种模式,可以参考cudnn手册。
+- **num_stacks** – rnn层的堆栈数量。这不同于需要展开的序列长度。
+- **input_mode** – 'linear',通过线性变换将输入特征x转换成大小为hidden_size的特征向量;'skip',仅要求输入特征大小等于hidden_size。
+- **bidirection** – 对于双向RNN为真。
+- **param_specs** – RNN参数的初始化配置。
+- **input_sample_shape** – 包含一个整型数,代表输入样本的特征大小。
+
+#### forward(flag, inputs)
+
+**参数:**
+- **flag** – True(kTrain) 代表训练;False(kEval)代表验证; 其他值用作以后使用。
+- **<x1, x2,..xn, hx, cx>** – 其中,xi是输入(inputs,)第i个位置的tensor,它的形状是 (batch_size, input_feature_length); xi的batch_size必须大于xi + 1的大小; hx是初始隐藏状态,形状是(num_stacks * bidirection?2:1,batch_size,hidden_size)。 cx是与hy相同形状的初始细胞状态张量。 cx仅对lstm有效。 对于其他RNN,不存在cx。 hx和cx都可以是没有形状和数据的虚拟张量。
+返回值:<y1,y2,... yn,hy,cy>,其中yi是第i个位置的输出张量,其形状是(batch_size,hidden_size *双向?2:1)。 hy是最终的隐藏状态张量。 cx是最终的细胞状态张量。 cx仅用于lstm。
+
+
+#### backward(flag, grad)
+
+**参数:**
+- **flag** – 未来使用
+- **<dy1, dy2,..dyn, dhy, dcy>** - 其中,dyi是(grad,) 第i个位置的梯度,它的形状是 (batch_size, hidden_size*bidirection?2 (i-th) – 1); dhy是最终隐藏状态的渐变,它的形状是(num_stacks *双向?2:1,batch_size,hidden_size)。dcy是最终单元状态的梯度。 cx仅对lstm有效,其他RNN不存在cx。 dhy和dcy都可以是没有形状和数据的虚拟tensor。
+
+**返回值:** <dx1,dx2,... dxn,dhx,dcx>,其中dxi是第i个输入的梯度张量,它的形状是(batch_size,input_feature_length)。 dhx是初始隐藏状态的梯度。 dcx是初始单元状态的梯度,仅对lstm有效。
+
+---
+
+### class singa.layer.LSTM(name, hidden_size, dropout=0.0, num_stacks=1, input_mode='linear', bidirectional=False, param_specs=None, input_sample_shape=None)
+
+基类:`singa.layer.RNN`
+
+---
+
+### class singa.layer.GRU(name, hidden_size, dropout=0.0, num_stacks=1, input_mode='linear', bidirectional=False, param_specs=None, input_sample_shape=None)
+
+基类:`singa.layer.RNN`
+
+---
+
+#### singa.layer.get_layer_list()
+
+返回包含所有支持图层的标识符(标签)的字符串列表
+
+---

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/loss.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/loss.md b/doc/zh/docs/loss.md
new file mode 100644
index 0000000..95d3b63
--- /dev/null
+++ b/doc/zh/docs/loss.md
@@ -0,0 +1,103 @@
+# 损失(Loss)
+
+损失模块包括一组训练损失实例。 有些是从C ++实现转换而来的,其余的都是直接使用python Tensor实现的。
+
+示例用法:
+```python
+from singa import tensor
+from singa import loss
+
+x = tensor.Tensor((3, 5))
+x.uniform(0, 1)  # randomly genearte the prediction activation
+y = tensor.from_numpy(np.array([0, 1, 3], dtype=np.int))  # set the truth
+
+f = loss.SoftmaxCrossEntropy()
+l = f.forward(True, x, y)  # l is tensor with 3 loss values
+g = f.backward()  # g is a tensor containing all gradients of x w.r.t l
+```
+
+
+---
+
+### class singa.loss.Loss
+
+基类:`object`
+
+损失类的基类
+
+封装C++损失类的子类可以使用此基类继承的forward,backward和evaluate函数。 其他子类需要重写这些函数
+
+#### backward()
+
+**返回值:** 与损失相对应的梯度
+
+---
+
+#### evaluate(flag, x, y)
+
+**参数:**
+- **flag (int)** – 必须是kEval
+- **x (Tensor)** – 预测Tensor
+- **y (Tensor)** – 真实Tensor
+
+**返回值:** 所有样本的平均损失
+
+---
+
+#### forward(flag, x, y)
+
+计算损失值
+
+**参数:**
+- **flag** – kTrain/kEval或布尔值。如果是kTrain/True,那么在下一次调用forward前会先调用backward计算梯度。
+- **x (Tensor)** – 预测Tensor
+- **y (Tensor)** – 真实Tensor, x.shape[0]必须和y.shape[0]相同
+
+**返回值:** tensor,每个样本对应一个浮点型损失值
+
+---
+
+### class singa.loss.SoftmaxCrossEntropy
+
+基类:`singa.loss.Loss`
+
+此损失函数是SoftMax和交叉熵损失的结合。它通过SoftMax函数转换输入,然后根据真实值计算交叉熵损失。 对于每个样本,真实值可以是一个整数作为标签索引; 或二进制数组,指示标签分布。 因此,真实值可以是1维或2维tensor。 对于一批样品,数据/特征tensor可以是1维(对于单个样品)或2维(对于一组样本)。
+
+---
+
+### class singa.loss.SquaredError
+
+基类:`singa.loss.Loss`
+
+此损失用来衡量预测值和真实值之间的平方差。它通过Python Tensor操作实现。
+
+---
+
+#### backward()
+
+计算与损失相对应变量的梯度。
+
+**返回值:** x - y
+
+---
+
+#### evaluate(flag, x, y)
+
+计算平均误差。
+
+**返回值:** 浮点型数
+
+---
+
+#### forward(flag, x, y)
+
+通过0.5 * ||x-y||^2计算损失。
+
+**参数:**
+- **flag (int)** – kTrain或kEval;如果是kTrain,那么在下一次调用forward前会先调用backward计算梯度。
+- **x (Tensor)** – 预测Tensor
+- **y (Tensor)** – 真实Tensor, 每个样本对应一个整型数, 取值为[0, x.shape[1])。
+
+**返回值:** tensor,每个样本对应一个损失值
+
+---

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/metric.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/metric.md b/doc/zh/docs/metric.md
new file mode 100644
index 0000000..4ae15eb
--- /dev/null
+++ b/doc/zh/docs/metric.md
@@ -0,0 +1,62 @@
+# 度量(Metric)
+
+该模块包含一组用于评估模型性能的度量类。 特定的度量类可以由C++的实现转换或直接使用Python实现。
+
+示例用法:
+
+```python
+from singa import tensor
+from singa import metric
+
+x = tensor.Tensor((3, 5))
+x.uniform(0, 1)  # randomly genearte the prediction activation
+x = tensor.SoftMax(x)  # normalize the prediction into probabilities
+y = tensor.from_numpy(np.array([0, 1, 3], dtype=np.int))  # set the truth
+
+f = metric.Accuracy()
+acc = f.evaluate(x, y)  # averaged accuracy over all 3 samples in x
+```
+
+---
+
+### class singa.metric.Metric
+
+基类:`object`
+
+度量类的基类
+
+封装C++度量类的子类可以使用继承的前向函数,并评估此基类的函数。 其他子类需要重写这些函数。 用户需要提供预测值和真实值来获取度量值。
+
+---
+
+#### forward(x, y)
+
+为每个样本计算度量值
+
+**参数:**
+- **x (Tensor)** – 预测值,每行代表一个样本的预测值
+- **y (Tensor)** – 真实值,每行代表一个样本的真实值
+
+**返回值:** 浮点数组成的tensor,每个样本对应一个浮点数输出
+
+---
+
+#### evaluate(x, y)
+
+计算样本的平均度量值
+
+**参数:**
+- **x (Tensor)** – 预测值,每列代表一个样本的预测值
+- **y (Tensor)** – 真实值,每列代表一个样本的真实值
+
+**返回值:** 浮点数组成的tensor,每个样本对应一个浮点数输出
+
+---
+
+### class singa.metric.Accuracy
+
+基类:`singa.metric.Metric`
+
+对于单标签预测任务,计算top-1精确度。它调用C++函数实现计算。
+
+---

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/model_zoo/char-rnn/README.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/model_zoo/char-rnn/README.md b/doc/zh/docs/model_zoo/char-rnn/README.md
new file mode 100644
index 0000000..41d67ce
--- /dev/null
+++ b/doc/zh/docs/model_zoo/char-rnn/README.md
@@ -0,0 +1,25 @@
+# 在文本上训练Char-RNN
+
+递归神经网络(RNN)被广泛用于建模顺序数据,例如自然语言句子。 本示例介绍如何使用SINGA的RNN层实现RNN应用程序(或模型)。 我们将使用[char-rnn](https://github.com/karpathy/char-rnn)模型作为示例,它将训练语句或源代码,并将每个字符作为输入单位。 特别是,我们将使用GRU在Linux内核源代码上训练一个RNN。 经过训练,我们希望从模型中生成有意义的代码。
+
+
+## 操作说明
+
+* 编译并安装SINGA。目前,RNN的实现是基于CuDNN(>=5.05)。.
+
+* 准备数据集。下载[内核源代码](http://cs.stanford.edu/people/karpathy/char-rnn/)。其他文本数据也可被使用。 
+
+* 开始训练,
+
+        python train.py linux_input.txt
+
+  一些超参数可以在命令行参数中设置,
+
+        python train.py -h
+
+* 通过提供要采样的字符数和种子字符串来从模型中采样字符。
+
+        python sample.py 'model.bin' 100 --seed '#include <std'
+
+  请用其中一个checkpoint路径替换'model.bin'的路径。
+

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/model_zoo/cifar10/README.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/model_zoo/cifar10/README.md b/doc/zh/docs/model_zoo/cifar10/README.md
new file mode 100644
index 0000000..5ee68f6
--- /dev/null
+++ b/doc/zh/docs/model_zoo/cifar10/README.md
@@ -0,0 +1,60 @@
+# 在Cifar-10上训练CNN
+
+卷积神经网络(CNN)是一种被广泛用于图像和视频分类的前馈人造神经网络。在此例子中,我们将在Cifar-10数据集上训练三个深度CNN模型来进行图像分类,
+
+1. [AlexNet](https://code.google.com/p/cuda-convnet/source/browse/trunk/example-layers/layers-18pct.cfg),我们在验证集上能达到的最高准确度(不做数据增强)在82%左右。
+2. [VGGNet](http://torch.ch/blog/2015/07/30/cifar.html),我们在验证集上能达到的最高准确度(不做数据增强)在89%左右。
+3. [ResNet](https://github.com/facebook/fb.resnet.torch),我们在验证集上能达到的最高准确度(不做数据增强)在83%左右。
+4. [来自Caffe的AlexNet](https://github.com/BVLC/caffe/tree/master/examples/cifar10),SINGA能够无缝转换Caffe模型。
+
+
+## 操作说明
+
+
+### SINGA安装
+
+用户可以从源码编译和安装C++或者Python版本的SINGA。代码可以在CPU和GPU上执行。对于GPU上做训练,CUDA和CUDNN(V4或V5)是需要的。请参考安装界面以获得详细指示。
+
+### 数据准备
+
+Cifar-10的二进制数据集文件可以由如下指令下载
+
+        python download_data.py bin
+
+Python版本可以由如下指令下载
+
+        python download_data.py py
+
+### 训练
+
+这里有4个训练程序
+
+1.train.py。下面的指令将会用'cifar-10-batches-py'底下的python版本的Cifar-10数据集训练VGG模型。
+
+        python train.py vgg cifar-10-batches-py
+
+  要训练其他模型,请用'alexnet','resnet'或'caffe'替换'vgg'。其中,'caffe'指由caffe的AlexNet转换的模型。默认情况下,模型将在CudaGPU设备上训练;若想要在CppCPU上运行,需添加额外的参数
+
+        python train.py vgg cifar-10-batches-py  --use_cpu
+
+2.alexnet.cc。它通过调用CPP API在CudaGPU上训练AlexNet模型。
+
+        ./run.sh
+
+3.alexnet-parallel.cc。它通过调用CPP API在两个CudaGPU上训练AlexNet模型。两个设备上同时运行并计算模型参数的梯度,然后它们会在CPU设备上取平均并用于更新参数。
+
+        ./run-parallel.sh
+
+4.vgg-parallel.cc。它调用CPP API在两个CudaGPU设备上训练VGG模型,同alexnet-parallel.cc类似。
+
+### 预测
+
+predict.py包含预测函数
+
+        def predict(net, images, dev, topk=5)
+
+net通过加载先前训练好的模型来被创建;images包含图像的numpy数组(每张图像一行);dev是训练时的设备,例如,一个CudaGPU设备或者CppCPU设备;它将返回每个实例的topk标签。
+
+Predict.py文件主函数提供了用预训练的模型为新图片做预测的例子。'mode.bin'文件由训练程序生成,需要被放置在cifar目录下执行
+
+        python predict.py

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/model_zoo/imagenet/alexnet/README.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/model_zoo/imagenet/alexnet/README.md b/doc/zh/docs/model_zoo/imagenet/alexnet/README.md
new file mode 100644
index 0000000..ab28732
--- /dev/null
+++ b/doc/zh/docs/model_zoo/imagenet/alexnet/README.md
@@ -0,0 +1,46 @@
+# 在ImageNet上训练AlexNet
+
+卷积神经网络(CNN)是一种广泛用于图像和视频分类的前馈神经网络。 在这个例子中,我们将使用[深度CNN模型](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks)来对ImageNet数据集进行图像分类。
+
+## 操作说明
+
+### 编译SINGA
+
+请用CUDA,CUDNN和OpenCV编译SINGA。 您可以手动打开CMakeLists.txt中的选项或在build /文件夹中运行`ccmake ..`进行配置。
+
+我们已经在CuDNN V4和V5(V5需要Cuda7.5)上进行了测试。
+
+
+### 数据下载
+* 请参考创建[ImageNet 2012数据集](https://github.com/amd/OpenCL-caffe/wiki/Instructions-to-create-ImageNet-2012-data)的步骤1-3下载和加压数据。
+* 你可以通过[get_ilsvrc_aux.sh](https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh)或从[ImageNet](http://www.image-net.org/download-images)下载训练和验证集。
+
+### 数据预处理
+* 假设你已经下载了数据和描述文件。 现在我们应该将数据转换为二进制文件。你可以运行:
+
+          sh create_data.sh
+
+  这个脚本会在指定输出目录下生成一个测试文件(`test.bin`),均值文件(`mean.bin`)和一些训练文件(`trainX.bin`)。
+* 你也可以改变`create_data.sh`的参数。
+  + `-trainlist <file>`: 训练数据列表文件;
+  + `-trainfolder <folder>`: 训练图片所在文件夹;
+  + `-testlist <file>`: 测试数据列表文件;
+  + `-testfolder <floder>`: 测试图像所在文件夹;
+  + `-outdata <folder>`: 保存输出文件的文件夹,包括平均值,训练和测试文件。 该脚本将在指定的文件夹中生成这些文件;
+  + `-filesize <int>`: 在每个二进制文件中存储的训练图片个数.
+
+### 训练
+* 准备好数据后,你可以运行下面指令来训练AlexNet模型。
+
+          sh run.sh
+
+* 你可以改变`run.sh`的参数。
+  + `-epoch <int>`: 要训练的epoch数目,默认为90;
+  + `-lr <float>`: 基础学习率,学习率将减少每20个时期,更具体地,lr = lr * exp(0.1 *(epoch / 20));
+  + `-batchsize <int>`: 批数目,它应该根据你的内存而改变;
+  + `-filesize <int>`: 存储在每个二进制文件中的训练图像的数量,与数据预处理中的文件大小相同;
+  + `-ntrain <int>`: 训练图片的数目;
+  + `-ntest <int>`: 测试图片的数目;
+  + `-data <folder>`: 存储二进制文件的文件夹,它恰好是数据预处理步骤中的输出文件夹;
+  + `-pfreq <int>`: 打印当前模型状态(损失和准确度)的频率(以批数据为单位);
+  + `-nthreads <int>`: 加载传给模型的数据所有的线程数。

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/model_zoo/imagenet/googlenet/README.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/model_zoo/imagenet/googlenet/README.md b/doc/zh/docs/model_zoo/imagenet/googlenet/README.md
new file mode 100644
index 0000000..ec4533c
--- /dev/null
+++ b/doc/zh/docs/model_zoo/imagenet/googlenet/README.md
@@ -0,0 +1,66 @@
+name: GoogleNet on ImageNet
+
+SINGA version: 1.0.1
+
+SINGA commit: 8c990f7da2de220e8a012c6a8ecc897dc7532744
+
+parameter_url: https://s3-ap-southeast-1.amazonaws.com/dlfile/bvlc_googlenet.tar.gz
+
+parameter_sha1: 0a88e8948b1abca3badfd8d090d6be03f8d7655d
+
+license: unrestricted https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
+
+---
+
+# 用GoogleNet做图像分类
+
+
+这个例子中,我们将caffe训练好的GoogleNet转换为SINGA模型以用作图像分类。
+
+## 操作说明
+
+* 下载参数的checkpoint文件到如下目录
+
+        $ wget https://s3-ap-southeast-1.amazonaws.com/dlfile/bvlc_googlenet.tar.gz
+        $ tar xvf bvlc_googlenet.tar.gz
+
+* 运行程序
+
+        # use cpu
+        $ python serve.py -C &
+        # use gpu
+        $ python serve.py &
+
+* 提交图片进行分类
+
+        $ curl -i -F image=@image1.jpg http://localhost:9999/api
+        $ curl -i -F image=@image2.jpg http://localhost:9999/api
+        $ curl -i -F image=@image3.jpg http://localhost:9999/api
+
+image1.jpg, image2.jpg和image3.jpg应该在执行指令前就已被下载。
+
+## 详细信息
+
+我们首先从[Caffe的checkpoint文件](http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel)中提取参数值,并转换为pickle版本。下载checkpoint文件后进入`caffe_root/python`文件夹,运行如下脚本: 
+
+    # to be executed within caffe_root/python folder
+    import caffe
+    import numpy as np
+    import cPickle as pickle
+
+    model_def = '../models/bvlc_googlenet/deploy.prototxt'
+    weight = 'bvlc_googlenet.caffemodel'  # must be downloaded at first
+    net = caffe.Net(model_def, weight, caffe.TEST)
+
+    params = {}
+    for layer_name in net.params.keys():
+        weights=np.copy(net.params[layer_name][0].data)
+        bias=np.copy(net.params[layer_name][1].data)
+        params[layer_name+'_weight']=weights
+        params[layer_name+'_bias']=bias
+        print layer_name, weights.shape, bias.shape
+
+    with open('bvlc_googlenet.pickle', 'wb') as fd:
+        pickle.dump(params, fd)
+
+然后我们使用SINGA的FeedForwardNet结构构建GoogleNet。 请注意,我们添加了一个EndPadding层来解决Caffe(下取整)和cuDNN(上取整)之间池化图层舍入策略差异的问题。 只有MaxPooling图层以外的启动块才有此问题。 参考[这里](http://joelouismarino.github.io/blog_posts/blog_googlenet_keras.html)更多详情。

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/model_zoo/index.rst
----------------------------------------------------------------------
diff --git a/doc/zh/docs/model_zoo/index.rst b/doc/zh/docs/model_zoo/index.rst
new file mode 100644
index 0000000..6ee60a8
--- /dev/null
+++ b/doc/zh/docs/model_zoo/index.rst
@@ -0,0 +1,29 @@
+..
+.. Licensed to the Apache Software Foundation (ASF) under one
+.. or more contributor license agreements.  See the NOTICE file
+.. distributed with this work for additional information
+.. regarding copyright ownership.  The ASF licenses this file
+.. to you under the Apache License, Version 2.0 (the
+.. "License"); you may not use this file except in compliance
+.. with the License.  You may obtain a copy of the License at
+..
+..     http://www.apache.org/licenses/LICENSE-2.0
+..
+.. Unless required by applicable law or agreed to in writing, software
+.. distributed under the License is distributed on an "AS IS" BASIS,
+.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.. See the License for the specific language governing permissions and
+.. limitations under the License.
+..
+
+模型库
+=========
+
+.. toctree::
+
+   cifar10/README
+   char-rnn/README
+   imagenet/alexnet/README
+   imagenet/googlenet/README
+
+

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c343ff95/doc/zh/docs/net.md
----------------------------------------------------------------------
diff --git a/doc/zh/docs/net.md b/doc/zh/docs/net.md
new file mode 100644
index 0000000..2c26b96
--- /dev/null
+++ b/doc/zh/docs/net.md
@@ -0,0 +1,169 @@
+# 前馈网络
+
+Neural net类用层来创建网络并提供可以获取网络信息(比如:参数)的函数。
+
+示例用法:
+
+```python
+from singa import net as ffnet
+from singa import metric
+from singa import loss
+from singa import layer
+from singa import device
+
+# create net and add layers
+net = ffnet.FeedForwardNet(loss.SoftmaxCrossEntropy(), metric.Accuracy())
+net.add(layer.Conv2D('conv1', 32, 5, 1, input_sample_shape=(3,32,32,)))
+net.add(layer.Activation('relu1'))
+net.add(layer.MaxPooling2D('pool1', 3, 2))
+net.add(layer.Flatten('flat'))
+net.add(layer.Dense('dense', 10))
+
+# init parameters
+for p in net.param_values():
+    if len(p.shape) == 0:
+        p.set_value(0)
+    else:
+        p.gaussian(0, 0.01)
+
+# move net onto gpu
+dev = device.create_cuda_gpu()
+net.to_device(dev)
+
+# training (skipped)
+
+# do prediction after training
+x = tensor.Tensor((2, 3, 32, 32), dev)
+x.uniform(-1, 1)
+y = net.predict(x)
+print tensor.to_numpy(y)
+```
+
+---
+
+### class singa.net.FeedForwardNet(loss=None, metric=None)
+
+基类:`object`
+
+#### to_device(dev)
+
+将网络移至指定设备上,包括所有参数和中间数据。
+
+---
+
+#### add(lyr, src=None)
+
+添加一个层到层列表中。
+
+该功能将从src层获取样本形状以设置新添加的层。 对于第一层,它被设置在外部。 调用函数应确保层顺序的正确性。 如果src是None,最后一层是src层。 如果有多个src图层,则src是src层的列表。
+
+**参数:**
+- **lyr (Layer)** – 待添加的层
+- **src (Layer)** – lyr层的父层
+
+---
+
+#### param_values()
+
+返回所有参数的tensor列表。
+
+---
+
+#### param_specs()
+
+返回所有参数的ParamSpec列表。
+
+---
+
+#### param_names()
+
+返回所有参数名列表。。
+
+---
+
+#### train(x, y)
+
+运行一次BP。
+目前仅支持单输出层、单损失函数及度量方法的网络。 TODO(wangwei) 考虑多损失函数和多度量值。
+
+**参数:**
+- **x** – 输入数据,一个输入tensor或字典:层名->tensor
+- **y** – 输入数据的标签,一个tensor
+
+**返回值:** 参数梯度,损失函数和度量值
+
+---
+
+#### evaluate(x, y)
+
+根据给定数据评估损失函数和度量值。目前仅支持单输出层、单损失函数及度量方法的网络。TODO(wangwei) 考虑多损失函数和多度量值。
+
+**参数:**
+- **x** – 输入数据,单个tensor或一个字典: 层名 -> tensor
+- **y** – 输入数据的标签,单个tensor.
+
+---
+
+#### predict(x)
+
+向前经每个层传递数据到输出层并获得输出值。
+目前仅支持单输出层的网络。
+
+**参数:**
+- **x** - 输入数据,单个tesnor或一个字典: 层名 -> tensor
+
+**返回值:** 单个输出tensor作为预测结果
+
+---
+
+#### topo_sort(layers, src_of_layer)
+
+对所有层进行拓扑排序。
+对于多输入层,将会保留输入层的顺序。
+
+**参数:**
+- **layers** – 层列表;同个层(如slice层)的多个输出层应该以正确的顺序加入,此功能将不会改变其顺序。
+- **src_of_layer** – 字典: src层名 -> src层列表
+
+**返回值:** 排序后层列表
+
+---
+
+#### forward(flag, x, output=[])
+
+将输入经过每个层向前传递。
+如果一个层具有来自其他层和来自x的输入,则来自x的数据在来自其他层的数据之前被排序,例如,如果层1->层2并且x [‘layer2’]具有数据,则输入层2展平,即[x ['layer2'],层1的输出]
+
+**参数:**
+- **flag** – True代表训练;False代表评估;也可以是model_pb2.kTrain或model_pb2.kEval或者其他未来可能使用的值。
+- **x** – 一个tensor或一个字典:层名 -> tensor
+- **output(list)** – 层名列表,将会和默认输出一起作为返回值
+
+**返回值:** 如果只有一个输出层,返回输出tensor;否则返回字典:层名->输出tensor
+
+---
+
+#### backward()
+
+运行向后传递
+
+**返回值:** 所有参数的梯度tensor列表。
+
+---
+
+#### save(f, buffer_size=10, use_pickle=False)
+
+用io/snapshot保存模型参数。
+
+**参数:**
+- **f** – 文件名
+- **buffer_size** – 输入输出的大小(MB),默认为10MB;请确保它比任何一个参数对象要大。 
+- **use_pickle(boolean)** – 如果为真,将使用pickle保存;否则,将用protobuf做序列化,会占用较少空间。
+
+---
+
+#### load(f, buffer_size=10, use_pickle=False)
+
+用io/snapshot加载模型参数。请参照save()的参数描述。
+
+---


Mime
View raw message