.. 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.


SINGA 中文文档
==============

最新动态
-----------

* **版本 1.2.0** 于2018年6月6日发布. `下载页面 <../en/downloads.html>`_

* **版本 1.1.0** 于2017年2月12日发布. `下载页面 <../en/downloads.html>`_

* 关于SINGA V1的讲座在 `SGInnovate <https://www.eventbrite.sg/e/ai-eveningssginnovate-apache-singa-tickets-31505061487>`_ 举行, 时间：2017年3月23日

* **版本 1.0.0** 于2016年9月9日发布. `下载页面 <../en/downloads.html>`_

* 我们在 `REWORK <https://www.re-work.co/events/deep-learning-singapore/schedule>`_ 报告了SINGA的最新进展, 时间：2016年10月21日.

* 关于SINGA的讲座在 `PyDataSG <http://www.meetup.com/PyData-SG/events/229691286/>`_ 举办, 时间：2016年8月16日.

* **版本 0.3.0** 于2016年4月20日发布. `下载页面 <../en/downloads.html>`_

* **版本 0.2.0** 于2016年1月14日发布. `下载页面 <../en/downloads.html>`_.

* 我们在 `Strata+Hadoop <http://strataconf.com/big-data-conference-sg-2015/public/schedule/detail/45123>`_ 做了关于SINGA的报告, 时间：2015年12月2日

* 我们在多媒体国际会议(`ACM Multimedia <http://www.acmmm.org/2015/at-a-glance/>`_ ) 的最佳论文和开源竞赛环节报告了关于SINGA的工作. 时间2015年10月26-30(`资料 <http://www.comp.nus.edu.sg/~dbsystem/singa//assets/file/mm2015.ppt>`_)

* **版本 0.1** 于2015年10月8日发布. `下载页面 SINGA v0.1.0 <../en/downloads.html>`_.

* 我们举办了一届关于 `深度学习的研讨会 <http://www.comp.nus.edu.sg/~dbsystem/singa/workshop>`_ ，并报告了SINGA.时间：2015年9月16

* SINGA参展了VLDB2015期间举办的开源项目研讨会 `BOSS <http://boss.dima.tu-berlin.de/>`_ 时间2015年9月4日. (`简介 <http://www.comp.nus.edu.sg/~dbsystem/singa/assets/file/singa-vldb-boss.pptx>`_, `基础 <http://www.comp.nus.edu.sg/~dbsystem/singa/assets/file/basic-user-guide.pptx>`_ , `高级 <http://www.comp.nus.edu.sg/~dbsystem/singa/assets/file/advanced-user-guide.pptx>`_ )

* 我们在 VLDB 暑期学校做了关于SINGA的教学. 时间：2015年7月; 地点：清华大学.

* 我们 `SIGMOD 2015 <http://www.sigmod2015.org/index.shtml>`_ 的研讨会 `DanaC <http://danac.org/>`_ 上面报告了SINGA. 时间：2015年5月31日-6月4日;地点：墨尔本

* SINGA 加入 `Apache Incubator <http://incubator.apache.org/>`_,  2015年3月17日.

SINGA 入门
---------------
* 安装SINGA，通过 `conda <../en/docs/installation.html>`_, apt-get, 或者源码.

* 在 `AWS <https://aws.amazon.com/marketplace/pp/B01NAUAWZW>`_ 上, 或者通过 `Docker <https://hub.docker.com/r/nusdbsystem/singa/>`_ 试用 SINGA.

* 更多操作和实例，参考 `Jupyter notebooks <http://nbviewer.jupyter.org/github/apache/incubator-singa/blob/master/doc/en/docs/notebook/index.ipynb>`_ 以及 `模型库页面  <./docs/model_zoo/index.html>`_ 了解更多例子.

.. |logo| image:: _static/jupyter.png
   :scale: 25%
   :align: middle
   :target: http://nbviewer.jupyter.org/github/apache/incubator-singa/blob/master/doc/en/docs/notebook/index.ipynb

+---------+
| |logo|  |
+---------+

文档
-------------

* `这里 <docs.html>`_ 列出了文档和 Python API.
* `C++ APIs <../doxygen/html/index.html>`_ 由 Doxygen 生成.
* 研究出版物清单可在 `此处 <http://www.comp.nus.edu.sg/~dbsystem/singa/research/publication/>`_ 查阅.

如何贡献
----------------------

* 请订阅我们的开发邮件列表 dev-subscribe@singa.incubator.apache.org.

* 如果您发现使用 SINGA 的任何问题，请将其报告给 `Issue Tracker <https://issues.apache.org/jira/browse/singa>`_.

* 您也可以直接联系 `SINGA 提交者 <community/team-list.html>`_.

关于更多描述贡献SINGA的细节, 见 `这里 <develop/how-contribute.html>`_ .

历史
------------

2014年，SINGA 由新加坡国立大学 DB System Group 与浙江大学数据库团队合作发起.
如果您在研究中使用 SINGA，请引用以下两篇论文:

* B. C. Ooi, K.-L. Tan, S. Wang, W. Wang, Q. Cai, G. Chen, J. Gao, Z. Luo, A. K. H. Tung, Y. Wang, Z. Xie, M. Zhang, and K. Zheng. `SINGA: A distributed deep learning platform <http://www.comp.nus.edu.sg/~ooibc/singaopen-mm15.pdf>`_. ACM Multimedia (Open Source Software Competition) 2015 (`BibTex <http://www.comp.nus.edu.sg/~dbsystem/singa//assets/file/bib-oss.txt>`_).

* W. Wang, G. Chen, T. T. A. Dinh, B. C. Ooi, K.-L.Tan, J. Gao, and S. Wang. `SINGA: putting deep learning in the hands of multimedia users <http://www.comp.nus.edu.sg/~ooibc/singa-mm15.pdf>`_. ACM Multimedia 2015 (`BibTex <http://www.comp.nus.edu.sg/~dbsystem/singa//assets/file/bib-singa.txt>`_, `Slides <http://www.comp.nus.edu.sg/~dbsystem/singa/assets/file/mm2015.ppt>`_).

诸如 `网易 <http://tech.163.com/17/0602/17/CLUL016I00098GJ5.html>`_, `yzBigData <http://www.yzbigdata.com/en/index.html>`_ 和 `Shentilium <https://shentilium.com/>`_ 等公司正在使用 SINGA 作为其应用程序.

.. toctree::
   :hidden:

   docs/index
   downloads

.. toctree::
   :hidden:
   :maxdepth: 2
   :caption: 开发

   develop/schedule
   develop/how-contribute
   develop/contribute-code
   develop/contribute-docs

.. toctree::
   :hidden:
   :maxdepth: 2
   :caption: 社区

   community/source-repository
   community/mail-lists
   community/issue-tracking
   community/team-list



许可证
----------
SINGA 在 `Apache License Version 2.0 <http://www.apache.org/licenses/LICENSE-2.0>`_ 许可证下发布.

免责声明（英文）
--------------------

Apache SINGA is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
