I was so passionate about neural networks and always wanted a fast library. I found FANN library c is the fastest NN library, so that i could train a neural network in GPU. I finally managed to find libcudann library (extension of FANN) which runs on Nvidia GPU with CUDA. I tested on my ubuntu machine running intel i5 quad core processor and Nvidia 750Ti (620 cuda cores). with  CUDA and openCL.

From what i have tested, FANN library running on CPU is 10X faster than pybrain and 100X faster running in GPU. Caffe deep neural network library is the fastest i have seen 200X faster on MNIST when run on nvidia cuda architecture supported GPU.  I decided to run MNIST handwriting data on my neural network. After GPU training of about 10,000 epochs, I was able to get 0.003 error on test data within few minutes ~3min, which is pretty amazing. The inputs were normalized between -1 and 1

figure_1

The python file writes the MNIST images to be in desired format for fann library.

import numpy as np
from sklearn import datasets, preprocessing, cross_validation
from numpy import array_str

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata('MNIST original')

X,y = mnist.data, mnist.target

X.astype("float32")

#Grayscale between -1 and 1
X = X/255.0*2 - 1

outputs = max(y) + 1

X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.4, random_state=0)

ytrain = preprocessing.LabelBinarizer().fit_transform(y_train)
ytest =  preprocessing.LabelBinarizer().fit_transform(y_test)


# Writing training data
f = open("mnist.train", "w")
f.write ( str(X_train.shape[0]) + ' ' + str(X_train.shape[1]) + ' ' + str(outputs) + '\n' )

for k in range(len(X_train)): 
 f.write( ' '.join(map(str, X_train[k] )) + '\n' )     
 f.write( ' '.join(map(str, ytrain[k] )) + '\n' ) 

f.close()

# Writing test data

f = open("mnist.test", "w")
f.write ( str(X_test.shape[0]) + ' ' + str(X_test.shape[1]) + ' ' + str(outputs) + '\n' )

for k in range(len(X)): 
 f.write( ' '.join(map(str, X_test[k] )) + '\n' )     
 f.write( ' '.join(map(str, ytest[k] )) + '\n' ) 
f.close()

This outputs mnis.train and mnist.test and the output below..

pbu@pbu-desktop:~/Desktop/libcudann$ ./execute
Network: 784x60x10
Activation functions: 2 1 2 
Training on: GPU
Algorithm: Batch
Desired Error: 0.000000
Max epochs: 10000
Epochs between reports: 100
Learning rate: 0.100000
Momentum: 0.000000
Shuffle: ON
Error function: TANH
Starting: Error on train set 0.0563584156 Error on test set 0.0563257895
Epoch 100 Error on train set 0.0158128124 Error on test set 0.0157885905
Epoch 200 Error on train set 0.0132353399 Error on test set 0.0132152764
Epoch 300 Error on train set 0.0119769620 Error on test set 0.0119561991
Epoch 400 Error on train set 0.0112424437 Error on test set 0.0112195630
Epoch 500 Error on train set 0.0107437009 Error on test set 0.0107200257
Epoch 600 Error on train set 0.0103605166 Error on test set 0.0103376042
Epoch 700 Error on train set 0.0100403074 Error on test set 0.0100191962
Epoch 800 Error on train set 0.0097571611 Error on test set 0.0097383494
Epoch 900 Error on train set 0.0094972840 Error on test set 0.0094809681
Epoch 1000 Error on train set 0.0092534767 Error on test set 0.0092397314
Epoch 1100 Error on train set 0.0090220291 Error on test set 0.0090108840
Epoch 1200 Error on train set 0.0088008856 Error on test set 0.0087923482
Epoch 1300 Error on train set 0.0085888570 Error on test set 0.0085829040
Epoch 1400 Error on train set 0.0083853239 Error on test set 0.0083819143
Epoch 1500 Error on train set 0.0081900833 Error on test set 0.0081891529
Epoch 1600 Error on train set 0.0080031529 Error on test set 0.0080046197
Epoch 1700 Error on train set 0.0078245914 Error on test set 0.0078283595
Epoch 1800 Error on train set 0.0076543707 Error on test set 0.0076603359
Epoch 1900 Error on train set 0.0074923150 Error on test set 0.0075003696
Epoch 2000 Error on train set 0.0073381159 Error on test set 0.0073481603
Epoch 2100 Error on train set 0.0071913525 Error on test set 0.0072032907
Epoch 2200 Error on train set 0.0070515368 Error on test set 0.0070652841
Epoch 2300 Error on train set 0.0069181491 Error on test set 0.0069336332
Epoch 2400 Error on train set 0.0067906706 Error on test set 0.0068078293
Epoch 2500 Error on train set 0.0066686082 Error on test set 0.0066873883
Epoch 2600 Error on train set 0.0065515204 Error on test set 0.0065718819
Epoch 2700 Error on train set 0.0064390311 Error on test set 0.0064609414
Epoch 2800 Error on train set 0.0063308338 Error on test set 0.0063542691
Epoch 2900 Error on train set 0.0062266998 Error on test set 0.0062516420
Epoch 3000 Error on train set 0.0061264569 Error on test set 0.0061528925
Epoch 3100 Error on train set 0.0060299933 Error on test set 0.0060579111
Epoch 3200 Error on train set 0.0059372275 Error on test set 0.0059666205
Epoch 3300 Error on train set 0.0058480934 Error on test set 0.0058789537
Epoch 3400 Error on train set 0.0057625249 Error on test set 0.0057948455
Epoch 3500 Error on train set 0.0056804456 Error on test set 0.0057142195
Epoch 3600 Error on train set 0.0056017553 Error on test set 0.0056369752
Epoch 3700 Error on train set 0.0055263452 Error on test set 0.0055630011
Epoch 3800 Error on train set 0.0054540779 Error on test set 0.0054921624
Epoch 3900 Error on train set 0.0053848140 Error on test set 0.0054243156
Epoch 4000 Error on train set 0.0053184042 Error on test set 0.0053593121
Epoch 4100 Error on train set 0.0052546998 Error on test set 0.0052970033
Epoch 4200 Error on train set 0.0051935427 Error on test set 0.0052372292
Epoch 4300 Error on train set 0.0051347865 Error on test set 0.0051798457
Epoch 4400 Error on train set 0.0050782855 Error on test set 0.0051247063
Epoch 4500 Error on train set 0.0050239097 Error on test set 0.0050716810
Epoch 4600 Error on train set 0.0049715303 Error on test set 0.0050206413
Epoch 4700 Error on train set 0.0049210321 Error on test set 0.0049714693
Epoch 4800 Error on train set 0.0048723132 Error on test set 0.0049240668
Epoch 4900 Error on train set 0.0048252800 Error on test set 0.0048783384
Epoch 5000 Error on train set 0.0047798492 Error on test set 0.0048341998
Epoch 5100 Error on train set 0.0047359481 Error on test set 0.0047915797
Epoch 5200 Error on train set 0.0046935058 Error on test set 0.0047504064
Epoch 5300 Error on train set 0.0046524643 Error on test set 0.0047106217
Epoch 5400 Error on train set 0.0046127713 Error on test set 0.0046721748
Epoch 5500 Error on train set 0.0045743682 Error on test set 0.0046350062
Epoch 5600 Error on train set 0.0045372057 Error on test set 0.0045990688
Epoch 5700 Error on train set 0.0045012361 Error on test set 0.0045643141
Epoch 5800 Error on train set 0.0044664103 Error on test set 0.0045306929
Epoch 5900 Error on train set 0.0044326847 Error on test set 0.0044981632
Epoch 6000 Error on train set 0.0044000074 Error on test set 0.0044666729
Epoch 6100 Error on train set 0.0043683355 Error on test set 0.0044361809
Epoch 6200 Error on train set 0.0043376205 Error on test set 0.0044066384
Epoch 6300 Error on train set 0.0043078279 Error on test set 0.0043780110
Epoch 6400 Error on train set 0.0042789057 Error on test set 0.0043502459
Epoch 6500 Error on train set 0.0042508165 Error on test set 0.0043233084
Epoch 6600 Error on train set 0.0042235283 Error on test set 0.0042971647
Epoch 6700 Error on train set 0.0041969963 Error on test set 0.0042717727
Epoch 6800 Error on train set 0.0041711926 Error on test set 0.0042471024
Epoch 6900 Error on train set 0.0041460851 Error on test set 0.0042231218
Epoch 7000 Error on train set 0.0041216379 Error on test set 0.0041997982
Epoch 7100 Error on train set 0.0040978277 Error on test set 0.0041771047
Epoch 7200 Error on train set 0.0040746210 Error on test set 0.0041550109
Epoch 7300 Error on train set 0.0040519978 Error on test set 0.0041334946
Epoch 7400 Error on train set 0.0040299348 Error on test set 0.0041125333
Epoch 7500 Error on train set 0.0040084026 Error on test set 0.0040920973
Epoch 7600 Error on train set 0.0039873808 Error on test set 0.0040721665
Epoch 7700 Error on train set 0.0039668498 Error on test set 0.0040527219
Epoch 7800 Error on train set 0.0039467923 Error on test set 0.0040337448
Epoch 7900 Error on train set 0.0039271922 Error on test set 0.0040152199
Epoch 8000 Error on train set 0.0039080293 Error on test set 0.0039971280
Epoch 8100 Error on train set 0.0038892890 Error on test set 0.0039794510
Epoch 8200 Error on train set 0.0038709559 Error on test set 0.0039621773
Epoch 8300 Error on train set 0.0038530135 Error on test set 0.0039452892
Epoch 8400 Error on train set 0.0038354506 Error on test set 0.0039287745
Epoch 8500 Error on train set 0.0038182531 Error on test set 0.0039126198
Epoch 8600 Error on train set 0.0038014064 Error on test set 0.0038968106
Epoch 8700 Error on train set 0.0037848980 Error on test set 0.0038813341
Epoch 8800 Error on train set 0.0037687204 Error on test set 0.0038661817
Epoch 8900 Error on train set 0.0037528600 Error on test set 0.0038513422
Epoch 9000 Error on train set 0.0037373099 Error on test set 0.0038368078
Epoch 9100 Error on train set 0.0037220509 Error on test set 0.0038225586
Epoch 9200 Error on train set 0.0037070781 Error on test set 0.0038085904
Epoch 9300 Error on train set 0.0036923850 Error on test set 0.0037948966
Epoch 9400 Error on train set 0.0036779642 Error on test set 0.0037814688
Epoch 9500 Error on train set 0.0036638069 Error on test set 0.0037683002
Epoch 9600 Error on train set 0.0036498983 Error on test set 0.0037553732
Epoch 9700 Error on train set 0.0036362333 Error on test set 0.0037426862
Epoch 9800 Error on train set 0.0036228085 Error on test set 0.0037302342
Epoch 9900 Error on train set 0.0036096165 Error on test set 0.0037180081
Epoch 10000 Error on train set 0.0035966476 Error on test set 0.0037060005
Training complete.