Training and veryfing a neural net using Joone
Source code name: "joone_XORMemory2.py"
Programming language: Python
Topic: Artificial Intelligence/neural net
DMelt Version 1.4. Last modified: 05/26/2018. License: Pro
https://datamelt.org/code/cache/joone_XORMemory2_8152.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 MemoryOutputSynapse,MemoryInputSynapse
from org.joone.engine.learning import TeachingSynapse
from org.joone.net import NeuralNet
from java.lang import System
from jhplot  import *

class joone(NeuralNetListener):

  mills=0
  nnet = NeuralNet()
  epochs=1000
  c1 = SPlot()
  c1.visible()
  c1.setAutoRange()
  c1.setMarksStyle('various')
  c1.setConnected(1, 0)
  c1.setNameY('Global Error')
  c1.setNameX('Epoch') 

  def Go(self,epochs,inputArray,desiredOutput):
     self.epochs=epochs
     print "Running NN for ", epochs, " epochs"
     # First, creates the three Layers
     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() # input -> hidden conn. 
     synapse_HO = FullSynapse() # hidden -> output conn. 
     synapse_IH.setName("IH")
     synapse_HO.setName("HO")

     # Connect the input layer with the hidden layer
     input.addOutputSynapse(synapse_IH)
     hidden.addInputSynapse(synapse_IH)

     # Connect the hidden layer with the output layer
     hidden.addOutputSynapse(synapse_HO)
     output.addInputSynapse(synapse_HO)

     inputStream = MemoryInputSynapse() # input array 
     inputStream.setInputArray(inputArray)
     inputStream.setAdvancedColumnSelector("1-2") # The first two columns contain the input 

     desiredOutputSynapse = MemoryInputSynapse() # desired  
     desiredOutputSynapse.setInputArray(desiredOutput)
     desiredOutputSynapse.setAdvancedColumnSelector("1")

     # set the input data
     input.addInputSynapse(inputStream)

     trainer = TeachingSynapse()
     trainer.setDesired(desiredOutputSynapse)
     output.addOutputSynapse(trainer) # Connects the Teacher to the last layer 

     # Creates a new NeuralNet. All the layers must be inserted 
     self.nnet.addLayer(input, NeuralNet.INPUT_LAYER)
     self.nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER)
     self.nnet.addLayer(output, NeuralNet.OUTPUT_LAYER)
     mon = self.nnet.getMonitor()
     mon.setTrainingPatterns(len(inputArray))  # of rows (patterns) contained in the input file
     mon.setTotCicles(self.epochs)             # How many times the net must be trained on the input patterns        
     mon.setLearningRate(0.7)
     mon.setMomentum(0.6)
     mon.setLearning(True)          #  The net must be trained
     mon.setSingleThreadMode(True)  #  Set to false for multi-thread mode
     #The application registers itself as monitor's listener so it can receive
     #the notifications of termination from the net. */
     mon.addNeuralNetListener(self)
     self.mills = System.currentTimeMillis()
     self.nnet.randomize(0.5)
     self.nnet.go(True)  #  The net starts in non async mode

  def netStopped(self,e):
      delay = System.currentTimeMillis() - self.mills
      print "Training finished after ",delay," ms"

  def cicleTerminated(self,e):
      pass 

  def netStarted(self,e):
      pass 
    
  def errorChanged(self,e):
       mon = e.getSource() 
       c = self.epochs-mon.getCurrentCicle()
       cl = c / 1000
       if ((cl * 1000) == c): 
           err=mon.getGlobalError()
           print c," epoch RMSE = ", err 
           self.c1.addPoint(0,c,err,1)
           self.c1.update()
 
  def netStoppedError(self,e):
       pass 

  def getPredict(self,inputArray):
      input = self.nnet.getInputLayer()
      input.removeAllInputs()
      nsize=len(inputArray)
      memInp =  MemoryInputSynapse()
      memInp.setFirstRow(1)
      memInp.setAdvancedColumnSelector("1,2")
      input.addInputSynapse(memInp)
      memInp.setInputArray(inputArray)
      output = self.nnet.getOutputLayer()
      output.removeAllOutputs()
      memOut = MemoryOutputSynapse()
      output.addOutputSynapse(memOut)
      self.nnet.getMonitor().setTotCicles(1)
      self.nnet.getMonitor().setTrainingPatterns(nsize)
      self.nnet.getMonitor().setLearning(False)
      self.nnet.go(True)  #  The net starts in non async mode
      pred=[]
      for i in range(nsize):
           pattern = memOut.getNextPattern()
           # print "Predicted Pattern #",(i+1)," = ",pattern[0]
           pred.append(pattern[0])
      return pred
 
inputArray=[[0.0, 0.0],[0.0, 1.0],[1.0, 0.0],[1.0, 1.0]]
desiredOutput=[[0],[1],[1],[0]]

xor=joone()
xor.Go(20000,inputArray,desiredOutput)
print "Stop. Get predictions"
pred=xor.getPredict(inputArray)
for i in range(len(inputArray)):
    print inputArray[i],"predicted=",pred[i], " expected=",desiredOutput[i] 




You see the box below because you did not login.