
#Convolutional neural network
#will run 1 epoch in about 200 second and get around 11% error.
#With 100 epochs you'll get around 1.2% error
#http://www.cnblogs.com/fengfenggirl

print "Download and unzip data.."
from jhplot import *
http='http://datamelt.org/examples/data/'
print Web.get(http+"mnist.zip")
print IO.unzip("mnist.zip")

from edu.hitsz.c102c.cnn.CNN import LayerBuilder
from edu.hitsz.c102c.cnn import CNN,Layer,Dataset
from edu.hitsz.c102c.cnn.Layer import Size
from edu.hitsz.c102c.util import ConcurenceRunner

# input corresponds a matrix with 28x28 = 784 inputs
builder = LayerBuilder()
builder.addLayer(Layer.buildInputLayer(Size(28, 28)))
builder.addLayer(Layer.buildConvLayer(6, Size(5, 5))) # 5x5 convolutions 
builder.addLayer(Layer.buildSampLayer(Size(2, 2)))    # sampling 2*2 
builder.addLayer(Layer.buildConvLayer(12, Size(5, 5)))
builder.addLayer(Layer.buildSampLayer(Size(2, 2)))
builder.addLayer(Layer.buildOutputLayer(10))

batchSize=50; print "Batchsize=",batchSize
cnn = CNN(builder, batchSize)

# last value in data is label!
ftrain = "mnist/train.format" 
dataset = Dataset.load(ftrain, ",", 784)

print "Check 2 inputs.."
for i in range(2):
      print "Event=",i, "Nr of inputs=",len(dataset.getAttrs(i)) 
      print "Attributes=",dataset.getAttrs(i)
      print "Label=",dataset.getLable(i)

cnn.train(dataset, 10) # number of iteration 10 (increase for larger precison)  
modelName = "model.ser"
cnn.saveModel(modelName)
dataset.clear()

print "Read trained network.."
cnn = CNN.loadModel(modelName) 
test="mnist/test.format"
testset = Dataset.load(test, ",", -1)
print "Use "+test+" to make ",test+".predict file with predictions"
cnn.predict(testset, test+".predict")
ConcurenceRunner.stop()


