Building a neural net in memory for XOR problem using Joone
Code: "joone_XORMemory1.py". Programming language: Python
DMelt Version 1.4. Last modified: 07/29/2017. License: Free
https://datamelt.org/code/cache/joone_XORMemory1_8744.py
To run this script using the DMelt IDE,
copy the above URL link to the menu [File]→[Read script from URL] of the DMelt IDE.
from org.joone.engine import NeuralNetListener
from org.joone.engine import SigmoidLayer,FullSynapse,Monitor
from org.joone.io import MemoryInputSynapse
from org.joone.engine.learning import TeachingSynapse
from org.joone.net import NeuralNet
from java.lang import System
class joone(NeuralNetListener):
mills=0
err=-1
def Go(self,epochs,inputArray):
print "Running NN for ", epochs, " epochs"
input=SigmoidLayer()
hidden=SigmoidLayer()
output=SigmoidLayer()
input.setLayerName("input")
hidden.setLayerName("hidden")
output.setLayerName("output")
input.setRows(2); hidden.setRows(3); output.setRows(1)
synapse_IH = FullSynapse()
synapse_HO = FullSynapse()
synapse_IH.setName("IH")
synapse_HO.setName("HO")
input.addOutputSynapse(synapse_IH)
hidden.addInputSynapse(synapse_IH)
hidden.addOutputSynapse(synapse_HO)
output.addInputSynapse(synapse_HO)
inputStream = MemoryInputSynapse()
inputStream.setInputArray(inputArray)
inputStream.setAdvancedColumnSelector("1,2")
input.addInputSynapse(inputStream)
trainer = TeachingSynapse()
samples = MemoryInputSynapse()
samples.setInputArray(inputArray)
samples.setAdvancedColumnSelector("3")
trainer.setDesired(samples)
output.addOutputSynapse(trainer)
nnet = NeuralNet()
nnet.addLayer(input, NeuralNet.INPUT_LAYER)
nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER)
nnet.addLayer(output, NeuralNet.OUTPUT_LAYER)
monitor = nnet.getMonitor()
monitor.setTrainingPatterns(4)
monitor.setTotCicles(epochs)
monitor.setLearningRate(0.7)
monitor.setMomentum(0.6)
monitor.setLearning(True)
monitor.setSingleThreadMode(True)
monitor.addNeuralNetListener(self)
self.mills = System.currentTimeMillis()
nnet.randomize(0.5)
nnet.go(True)
def netStopped(self,e):
delay = System.currentTimeMillis() - self.mills
print "Training finished after ",delay," ms"
mon = e.getSource()
self.err=mon.getGlobalError()
def cicleTerminated(self,e): pass
def netStarted(self,e): pass
def errorChanged(self,e):
mon = e.getSource()
c = mon.getCurrentCicle()
cl = c / 1000
if ((cl * 1000) == c): print c," cycles remaining - Error = ", mon.getGlobalError()
def getError(self): return self.err
def netStoppedError(self,e): pass
inputArray=[[0.0, 0.0, 0.0],[0.0, 1.0, 1.0],[1.0, 0.0, 1.0],[1.0, 1.0, 0.0]]
xor=joone()
xor.Go(20000,inputArray)
print "Global RMSE after training=", xor.getError()