Project information

Release History

0.5.0 (July 11, 2017)


  • Added nengo_dl.tensor_layer to help with the construction of layer-style TensorNodes (see the TensorNode documentation)
  • Added an example demonstrating how to train a neural network that can run in spiking neurons
  • Added some distributions for weight initialization to nengo_dl.dists
  • Added sim.train(..., profile=True) option to collect profiling information during training
  • Added new methods to simplify the Nengo operation graph, resulting in faster simulation/training speed
  • The default graph planner can now be modified by setting the planner attribute on the top-level Network config
  • Added TensorFlow implementation for general linear synapses
  • Added backports.tempfile and backports.print_function requirement for Python 2.7 systems


  • Increased minimum TensorFlow version to 1.2.0
  • Improved error checking for input/target data
  • Improved efficiency of stateful gradient operations, resulting in faster training speed
  • The functionality for nengo_dl.configure_trainable has been subsumed into the more general nengo_dl.configure_settings(trainable=x). This has resulted in some small changes to how trainability is controlled within subnetworks; see the updated documentation for details.
  • Calling Simulator.train/Simulator.loss no longer resets the internal state of the simulation (so they can be safely intermixed with calls to


  • The old step_blocks/unroll_simulation syntax has been fully deprecated, and will result in errors if used


  • Fixed bug related to changing the output of a Node after the model is constructed (#4)
  • Order of variable creation is now deterministic (helps make saving/loading parameters more reliable)
  • Configuring whether or not a model element is trainable does not affect whether or not that element is minibatched
  • Correctly reuse variables created inside a TensorNode when unroll_simulation > 1
  • Correctly handle probes that aren’t connected to any ops
  • Swapped fan_in/fan_out in dists.VarianceScaling to align with the standard definitions
  • Temporary patch to fix memory leak in TensorFlow (see #11273)
  • Fixed bug related to nodes that had matching output functions but different size_out
  • Fixed bug related to probes that do not contain any data yet

0.4.0 (June 8, 2017)



  • Updated TensorFuncParam to new Nengo Param syntax
  • The interface for Simulator step_blocks/unroll_simulation has been changed. Now unroll_simulation takes an integer as argument which is equivalent to the old step_blocks value, and unroll_simulation=1 is equivalent to the old unroll_simulation=False. For example, Simulator(..., unroll_simulation=True, step_blocks=10) is now equivalent to Simulator(..., unroll_simulation=10).
  • Simulator.train/Simulator.loss no longer require step_blocks (or the new unroll_simulation) to be specified; the number of steps to train across will now be inferred from the input data.

0.3.1 (May 12, 2017)


  • Added more documentation on Simulator arguments


  • Improved efficiency of tree_planner, made it the new default planner


  • Correctly handle input feeds when n_steps > step_blocks
  • Detect cycles in transitive planner
  • Fix bug in uneven step_blocks rounding
  • Fix bug in Simulator.print_params
  • Fix bug related to merging of learning rule with different dimensionality
  • Use tf.Session instead of tf.InteractiveSession, to avoid strange side effects if the simulator isn’t closed properly

0.3.0 (April 25, 2017)


  • Use logger for debug/builder output
  • Implemented TensorFlow gradients for sparse Variable update Ops, to allow models with those elements to be trained
  • Added tutorial/examples on using Simulator.train
  • Added support for training models when unroll_simulation=False
  • Compatibility changes for Nengo 2.4.0
  • Added a new graph planner algorithm, which can improve simulation speed at the cost of build time


  • Significant improvements to simulation speed
    • Use sparse Variable updates for signals.scatter/gather
    • Improved graph optimizer memory organization
    • Implemented sparse matrix multiplication op, to allow more aggressive merging of DotInc operators
  • Significant improvements to build speed
    • Added early termination to graph optimization
    • Algorithmic improvements to graph optimization functions
  • Reorganized documentation to more clearly direct new users to relevant material


  • Fix bug where passing a built model to the Simulator more than once would result in an error
  • Cache result of calls to tensor_graph.build_loss/build_optimizer, so that we don’t unnecessarily create duplicate elements in the graph on repeated calls
  • Fix support for Variables on GPU when unroll_simulation=False
  • SimPyFunc operators will always be assigned to CPU, even when device="/gpu:0", since there is no GPU kernel
  • Fix bug where Simulator.loss was not being computed correctly for models with internal state
  • Data/targets passed to Simulator.train will be truncated if not evenly divisible by the specified minibatch size
  • Fixed bug where in some cases Nodes with side effects would not be run if their output was not used in the simulation
  • Fixed bug where strided reads that cover a full array would be interpreted as non-strided reads of the full array

0.2.0 (March 13, 2017)

Initial release of TensorFlow-based NengoDL

0.1.0 (June 12, 2016)

Initial release of Lasagne-based NengoDL

NengoDL license

NengoDL is made available under a proprietary license that permits using, copying, sharing, and making derivative works from NengoDL and its source code for any non-commercial purpose.

If you would like to use NengoDL commercially, licenses can be purchased from Applied Brain Research, Inc. Please contact for more information.

Licensed code

NengoDL imports several open source libraries:

To build the documentation, NengoDL uses:

To run the unit tests, NengoDL uses: