<!--
    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-incubating-1.1.0 Release Notes

---

SINGA is a general distributed deep learning platform for training big deep
learning models over large datasets.

This release includes following features:

  * Core components
      * [SINGA-296] Add sign and to_host function for pysinga tensor module

  * Model components
      * [SINGA-254] Implement Adam for V1
      * [SINGA-264] Extend the FeedForwardNet to accept multiple inputs
      * [SINGA-267] Add spatial mode in batch normalization layer
      * [SINGA-271] Add Concat and Slice layers
      * [SINGA-275] Add Cross Entropy Loss for multiple labels
      * [SINGA-278] Convert trained caffe parameters to singa
      * [SINGA-287] Add memory size check for cudnn convolution

  * Utility functions and CI
      * [SINGA-242] Compile all source files into a single library.
      * [SINGA-244] Separating swig interface and python binding files
      * [SINGA-246] Imgtool for image augmentation
      * [SINGA-247] Add windows support for singa
      * [SINGA-251] Implement image loader for pysinga
      * [SINGA-252] Use the snapshot methods to dump and load models for pysinga
      * [SINGA-255] Compile mandatory dependent libaries together with SINGA code
      * [SINGA-259] Add maven pom file for building java classes
      * [SINGA-261] Add version ID into the checkpoint files
      * [SINGA-266] Add Rafiki python toolkits
      * [SINGA-273] Improve license and contributions
      * [SINGA-284] Add python unittest into Jenkins and link static libs into whl file
      * [SINGA-280] Jenkins CI support
      * [SINGA-288] Publish wheel of PySINGA generated by Jenkins to public servers

  * Documentation and usability
      * [SINGA-263] Create Amazon Machine Image
      * [SINGA-268] Add IPython notebooks to the documentation
      * [SINGA-276] Create docker images
      * [SINGA-289] Update SINGA website automatically using Jenkins
      * [SINGA-295] Add an example of image classification using GoogleNet

  * Bugs fixed
      * [SINGA-245] float as the first operand can not multiply with a tensor object
      * [SINGA-293] Bug from compiling PySINGA on Mac OS X with multiple version of Python


