Fast Artificial Neural Network Library


Today Erlang bindings have been added to FANN and the C# bindings have been given a long overdue overhaul. To see all the language bindings, check out the Language Binding page.

FANN in research

FANN is widely used research as is evident on google scholar, where the original FANN university report is quoted 249 times with another 30 and 46 quoting other FANN resources.

FANN on github

FANN has been set up on github ( as I was made aware that there was close to 100 projects on github that was in some way related to FANN.

10 years of FANN

The first version of FANN was created and uploaded to sourceforge 10 years ago. It started out as a very simple ANN project, supporting only the simplest of training algorithms and with very little added functionality. Back then I had no idea if anybody but myself would ever use it, but I thought that it would be selfish not to share the work with the world.

Since then a lot of functionality has been added to the core FANN project and FANN has been downloaded more than 300.000 times from sourceforge and an unknown number of times as part of a Linux distributions or other packaged systems. Besides this, the supporters of FANN has created bindings to more than 20 different programming languages and several different UIs have been made available. A special thanks goes out to all the people who have helped extend FANN.

A few critical design decisions was made when creating the library, which helped make the library as popular as it is today and I would like to share some of the thoughts that went into these decisions.

Speed – FANN was designed with speed in mind from the very beginning, as the main reason for creating the library was the to use it to do image processing on a robot, that was powered by a 206MHz HP/Compaq iPAQ (which did not even have a floating point processor). Still today, the core execution function of FANN has not been altered much and is extremely fast, but it could be made even faster if it got updated to support multiple cores and GPU execution.

Simplicity – FANN was designed as a replacement for an existing neural network library jNeural, which I had used in a few projects. jNeural was C++ and was pretty easy to use, but with my decision to implement the library in C, it was very important for me that FANN was even simpler, so that the transition was smooth and simple. I had my good friend Jesper look through the initial API and his suggestions helped me to clean it up quite a bit before the initial upload.

C – FANN was created in C, as many other cross platform libraries was back then (and even are today). The decision to do that had much more far reaching consequences than I realized back then. On the positive side, this single decision has meant that it has been very easy for people to write bindings from other languages and it has been a deciding factor in how widespread the use of FANN is today. On the negative side, C is a very old language, where concepts like dynamic arrays and easy memory management is unknown, and specifically when I implemented cascade correlation, this gave me quite a bit of headache.

LGPL -I must admit that I originally didn’t put much thought into the licence as I had no idea if people would actually use it. I basically just looked at GPL and LGPL and decided that I would like for people to be able to use FANN commercially, so I chose LGPL. A decision that I haven’t regretted since then.

Thanks to all people who have been using FANN and provided feedback and extensions throughout the last 10 years, let’s make it another 10 years for FANN. Please share your thoughts in the comment section on where you would like FANN to go in the next 10 years.


Updated FANN site

Today I updated the theme for the site and added a few other visual enhancements as well as allowing comments using your Facebook, Twitter and WordPress accounts.

I also disabled new user signups as I have been receiving hundreds of fake signups in the last few weeks.

Working with FANN from Java and Scala

I have recently started using FANN from Scala, and in order to do this I had to get fannj to work.

fannj is great and supports most of the features I need, and it works fine from Scala even works with FANN 2.2.

However, I had a few issues getting everything to work and for this I found this article very helpfull: Installing FANN on Java project and NativeLibrary.loadLibrary problems with 32bit/64bit

Forum moved to sourceforge

After having run my own phpbb forum for a number of years, I got fed up with dealing with spambots and have switched back to using sourceforge forums.

The new forum is available at SourceForge FANN Forum. The old forum have had the spam removed and is still available in a read-only mode at FANN phpbb forum.

FANN 2.2.0 Released

FANN 2.2.0 has been released, after almost 5 years since the last release.

Since the last release there has been more than 230,000 FANN downloads, so hoping that this new release will be just as popular.

Version 2.2.0 is backwards compatible and adds the following new features:

  • Added Sarprop training
  • Added fann_create_train for creating an empty training data struct
  • Added fann_copy for copying an ANN
  • Added cascade_min_out_epochs and cascade_min_cand_epochs to improve cascade training
  • Added extra checks when training, to ensure that data and network input and output sizes matches
  • Added Visual Studio 2010 solution
  • Added support for 64bit architecture
  • Cleanup in sources
  • Moved source from CVS to GIT

For now there is only a source release (includes windows binaries), but have been playing around with CPACK, and a binary release should be coming soon.

Kinect + Neural Network = Gesture Recognition

Cool use of the FANN library

The creators write:

gesture recognition using a kinect an a neural network.
We using the openNI and the NITE librairies with a Kinect to track body parts (hands, elbow, head, …). Then we use FANN (Fast Artificial Neural Network) library for the recognition system.
For now, It is able to recognize only two moves, one means ‘hello’ (“bonjour” in franch), the other mean ‘sorry’ (“désole” in french).
We just need to record new moves to train the neural network to be able to recognize other “words”/moves.

Native C# .Net wrapper for FANN released

For a long time there has only been a SOAP wrapper to use from .Net languages, so there has been a need for creating a real native wrapper. Some people have created small custom wrappers for smaller parts of the FANN library (see here), but finally a full wrapper is available for .Net languages fanndotnetwrapper.