|
|||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
Contents1. Overview
2. What is Neural XML?In this part, we will discuss what exactly is Neural XML, and how to use it. As you already know, a neural network consists of various layers, and each layer has a number of neurons in it. Initially, we will train the neural network, by providing the inputs to the input neurons, and by providing the output to the output neurons. Once the neural network is trained, you can run it. 2.A) How To BeginLet us see how to begin with neural xml. Step 1: Get Neural XMLWhere to get Neural XML? The binaries for nxml, and images and other files required for this article, is available. The full source code of Neural XML, and BrainNet Neural Network library is available.
Download the project, and build it. Add Neural XML bin folder to your path, so that you can run nxml in command prompt from any where. Step 2: Run NXML and have a look at it.Run nxml tool from the command prompt. If you run nxml with out any parameters, it will give you the following message.
I think this will give you a fair understanding regarding how to use nxml command line tool. Anyway, let us dig in to the matter a little deeper. 2.B) Illustration 1 - A Simple NXML Application - Creating Digital GatesNow, an interesting example. Let us see how we can create a 2-2-1 neural network (2 neurons in input layer, 2 neurons in hidden layer, and 1 neuron in output layer) to represent a digital gate (like and AND gate, or OR gate), using NXML. Then, we will train our 2-2-1 network to perform functions like AND, OR, XOR etc. See the previous articles for more information about neural networks (read them here Part I and Part II). If you examine my previous article, you can see that how we did this earlier, but using .NET code. This time we are doing the same - but using our own language, that is NXML.
Fig: A Simple 2-2-1 Network What We Are Going To Do:Training and running an application using NXML involves,
Let us see how to do this. Step 1: Creating A 2-2-1 Neural NetworkTo create a 2-2-1 neural network. You can use the -gen switch of nxml. The syntax is, Syntax: nxml -gen NeuronsInLayer1,NeuronsInLayer2,NeuronsInLayerN filename Run nxml with the following arguments to create a 2-2-1 network and store it in gate.xml
<html> <head> </head> If you open and examine the gate.xml file generated by nxml, you will see the following information. Under the root tag 'Network', there are various 'Layer' tags. As you can see, the network consists of three layers, Layer0, Layer1 and Layer2. Layer0 consists of two neurons L0N0 (0th neuron in 0th layer) and L0N1 (1st neuron in 0th layer) and so on. Now, just have the look at the neuron L1N0 (0th Neuron in Layer1). You can see a tag 'Connections' - which define which all neurons in previous layer is connected to this neuron.<html> Please note that each connection input holds a 'weight'. Also, each neuron has a Bias, Output a<html>nd Delta value, which holds these parameters of the neuron.<html> File: Gate.xml<html> <code><?xml version="1.0" encoding="utf-8"?> <Network> <Layer Name="Layer0"> <Neuron Name="L0N0"> <Bias>0.7982105016708374</Bias> <Output>0</Output> <Delta>0</Delta> </Neuron> <Neuron Name="L0N1"> <Bias>-0.3051917552947998</Bias> <Output>0</Output> <Delta>0</Delta> </Neuron> </Layer> <Layer Name="Layer1"> <Neuron Name="L1N0"> <Bias>-0.74571740627288818</Bias> <Output>0</Output> <Delta>0</Delta> <Connections> <Input Layer="0" Neuron="1" Weight="0.25023746490478516" /> <Input Layer="0" Neuron="0" Weight="-0.68162941932678223" /> </Connections> </Neuron> <Neuron Name="L1N1"> <Bias>0.044701099395751953</Bias> <Output>0</Output> <Delta>0</Delta> <Connections> <Input Layer="0" Neuron="1" Weight="-0.41200506687164307" /> <Input Layer="0" Neuron="0" Weight="-0.14756286144256592" /> </Connections> </Neuron> </Layer> <Layer Name="Layer2"> <Neuron Name="L2N0"> <Bias>-0.32655441761016846</Bias> <Output>0</Output> <Delta>0</Delta> <Connections> <Input Layer="1" Neuron="1" Weight="-0.9166187047958374" /> <Input Layer="1" Neuron="0" Weight="-0.4252774715423584" /> </Connections> </Neuron> </Layer> </Network> Step 2: Training the Neural NetworkNow, let us train gate.xml to perform three functions - AND, OR and XOR. To train the network, we'll
File: trainGate.n.xml <code><?xml version="1.0" encoding="utf-8"?> <NXML> <Network LoadPath="gate.xml" SaveOnFinish="true" SavePath="OR.xml"> <DataBlock Type="Train" TrainCount="2000"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern" OutputValue="1" /> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern" OutputValue="1" /> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern" OutputValue="1" /> </DataBlock> </Network> <Network LoadPath="gate.xml" SaveOnFinish="true" SavePath="AND.xml"> <DataBlock Type="Train" TrainCount="2000"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern" OutputValue="1" /> </DataBlock> </Network> <Network LoadPath="gate.xml" SaveOnFinish="true" SavePath="XOR.xml"> <DataBlock Type="Train" TrainCount="4000"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern" OutputValue="1" /> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern" OutputValue="1" /> </DataBlock> </Network> </NXML> The above code, to train the network, is written according to the nxml specifications. Kindly see this brief introduction to NXML language.
Now, to train the neural network, we can invoke the nxml interpreter using the following command, in the command prompt.
This causes the nxml interpreter to process trainGate.n.xml. This will interpret the three 'Network' tags, and the following files are generated - i.e, OR.xml, AND.xml and XOR.xml, (as specified in trainGate.n.xml). Have a look at these XML files, and see the change of values in connection weights, bias etc. Step 3: Running the Neural NetworkNow we have three trained neural networks. OR.xml which can perform functions of an OR gate, AND.xml which can perform functions of an AND gate and XOR.xml which can perform functions of an XOR gate. Let us see how to 'run' these networks. Let us create a file, runGate.n.xml, to run these networks. The only change is that, the Type of Datablock is changed to 'Run' from 'Train'. Also, we are not providing any OutputValues - because we expect the network to predict and write these output values. Kindly note that the network xml files (like or.xml, and.xml and xor.xml) are not undergoing any changes - because we are running the network, and not training it. File: runGate.n.xml before running it with nxml interpreter <code><?xml version="1.0" encoding="utf-8"?> <NXML> <Network LoadPath="or.xml" SaveOnFinish="true" SavePath="or.xml"> <DataBlock Type="Run"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern"/> </DataBlock> </Network> <Network LoadPath="AND.xml" SaveOnFinish="true" SavePath="AND.xml"> <DataBlock Type="Run"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern"/> </DataBlock> </Network> <Network LoadPath="xor.xml" SaveOnFinish="true" SavePath="xor.xml"> <DataBlock Type="Run"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern"/> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern"/> </DataBlock> </Network> </NXML> Now, to run the neural network, we can invoke the nxml interpreter using the following command, in the command prompt.
Again, open runGate.n.xml to see the outputs. File: runGate.n.xml after running it with nxml interpreter. Kindly see that OutputValues are predicted correctly. <code><?xml version="1.0" encoding="utf-8"?> <NXML> <Network LoadPath="or.xml" SaveOnFinish="true" SavePath="or.xml"> <DataBlock Type="Run"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern" OutputValue="1" /> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern" OutputValue="1" /> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern" OutputValue="1" /> </DataBlock> </Network> <Network LoadPath="AND.xml" SaveOnFinish="true" SavePath="AND.xml"> <DataBlock Type="Run"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern" OutputValue="1" /> </DataBlock> </Network> <Network LoadPath="xor.xml" SaveOnFinish="true" SavePath="xor.xml"> <DataBlock Type="Run"> <PatternData InputType="Pattern" InputValue="00" OutputType="Pattern" OutputValue="1" /> <PatternData InputType="Pattern" InputValue="01" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="10" OutputType="Pattern" OutputValue="0" /> <PatternData InputType="Pattern" InputValue="11" OutputType="Pattern" OutputValue="1" /> </DataBlock> </Network> </NXML> Now, change the Output Type from Pattern to Array, and see what happens. You will get the exact output values in comma separated decimals if there are more than one neuron in the output layer (in this case, there is only one neuron in the output layer). Pattern data type always rounds the output to 1 or 0. 2.C) Illustration 2 - How To Use NXML for 'Brain Tumor Detection'Now, let us see how you can create a neural network, train it and run it to detect brain tumors from the image of brain, using Neural XML. I'm just trying to make things interesting. Of course, please understand that the samples used in this illustration are not 'real' images of the brain - they are just some 'virtual' images, and is meant purely for demonstration. What We Are Going To Do:Assume that we have the following images, and assume that each image is an x-ray of the brain. Each image has a size of 16 x 16 = 256 pixels. We are using 13 images to train the network. According to the density of white pixels on a corner, we are assigning a value or condition (0,1,2 or 3) to each image, starting counter clockwise from the bottom left corner. The value of each image is shown below. (1) (7) We are using the density of white pixels on a particular corner, to detect the possibility of Brain Tumor. For example, see the first image. It has more white pixels at bottom left. We assume that,
Let us define the following possibilities.
I.e, for example, image 1 and 2 has no problem, image 3 and 4 is some what infected, image 5 and 6 is infected, image 7 and 8 is critically infected and so on. Once samples are selected and conditions defined, we will,
Let us see how we can do this using Neural XML. Step 1: Create A Neural NetworkTo create a network, we should determine
Let us see how to decide this
Now, let us generate the network, and save it to a file named DensityDetect.xml
This will create a file named DensityDetect.xml Step 2: Training The Neural NetworkFor training the neural network, let us create an nxml file, train.n.xml. All images are in the samples folder, relative to the folder where train.n.xml resides. <code><?xml version="1.0" encoding="utf-8"?> <NXML> <Network LoadPath="DensityDetect.xml" SaveOnFinish="true" SavePath="DensityDetect.xml"> <DataBlock Type="Train" TrainCount="3000"> <ImageData InputFile="samples\img1.jpg" InputWidth="16" InputHeight="16" OutputValue="0" OutputType="Number" /> <ImageData InputFile="samples\img2.jpg" InputWidth="16" InputHeight="16" OutputValue="0" OutputType="Number" /> <ImageData InputFile="samples\img3.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="samples\img4.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="samples\img5.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="samples\img6.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="samples\img7.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="samples\img8.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="samples\img9.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="samples\img11.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="samples\img12.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="samples\img13.jpg" InputWidth="16" InputHeight="16" OutputValue="0" OutputType="Number" /> </DataBlock> </Network> </NXML> Kindly note that, we used Image Data tag instead of Pattern Data tag. For Image Data tag, you can specify the InputFile attribute, which specifies the image. Along with the image path, you should specify the input image's width and height. If the image size is greater than this, the image will be resized to this size. For each image, we specified the OutputValue as the number corresponding to the condition we discussed earlier. Now, let us start training. For example, for Image 1, the output value we provided to train the network is zero.
This will start the training. We are training the network 3000 times. It will take some time, so go and have a cup of coffee ;) Step 3: Running The Neural NetworkOnce the network is trained, you can use it to check image samples. To illustrate this, let us create an nxml file to run the network. We are going to detect the following images. (1) The run.n.xml file is given below. All files are in test folder, relative to the folder where run.n.xml resides. Please note that any of these images are not among the list of images we used for training. File: run.n.xml before executing it using nxml <code><?xml version="1.0" encoding="utf-8"?> <NXML> <Network LoadPath="DensityDetect.xml" SaveOnFinish="true" SavePath="DensityDetect.xml"> <DataBlock Type="Run"> <ImageData InputFile="test\testimg1.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="test\testimg2.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="test\testimg3.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="test\testimg4.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="test\testimg5.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="test\testimg6.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="test\testimg7.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="test\testimg8.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> </DataBlock> </Network> </NXML> Now, let us run the network by issuing the following command.
Now, have a look at the run.n.xml again. File: run.n.xml after executing it using nxml. You can find that the neural network wrote all the output values correctly, by detecting each image properly. <code><?xml version="1.0" encoding="utf-8"?> <NXML> <Network LoadPath="DensityDetect.xml" SaveOnFinish="true" SavePath="DensityDetect.xml"> <DataBlock Type="Run"> <ImageData InputFile="test\testimg1.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="test\testimg2.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="test\testimg3.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="test\testimg4.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="test\testimg5.jpg" InputWidth="16" InputHeight="16" OutputValue="2" OutputType="Number" /> <ImageData InputFile="test\testimg6.jpg" InputWidth="16" InputHeight="16" OutputValue="3" OutputType="Number" /> <ImageData InputFile="test\testimg7.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> <ImageData InputFile="test\testimg8.jpg" InputWidth="16" InputHeight="16" OutputValue="1" OutputType="Number" /> </DataBlock> </Network> </NXML> ConclusionThat is it for now. As I mentioned earlier,
just if you haven't done that yet. In the mean time, have a look at my website, Amazed Saint Blogs, here at http://amazedsaint.blogspot.com/ . You can download a lot of source code and this kind of articles there, and subscribe to the news letter to get information regarding new project releases, new article releases etc. In my next article, we will discuss how NXML is formulated, but even before that, have a look at the source code and see how nxml actually works (just if you are smart enough). Post your comments, not only for this article, but also for my previous articles. And let me know what kind of topics you are more interested in. Genetic Algorithms? Cellular Automata? Meta Coding? or something else. NXML and BrainNet is just in its beta stage, and frankly, it hasn't fully undergone unit testing it. So, found any bugs? Please report it. Want to support Amazed Saint Articles, Brian Net or nxml? Consider a small donation here. Have a nice time, enjoy (if you can't enjoy due to work stress, or to improve your mental and physical health, practice some yoga, take some Ayurveda medicines etc. And, better, please do the Art Of Living healing breath workshop here http://www.artofliving.org/ to uplift your intellect, mind and soul.)
| ||||||||||||||||||||||||||||||||||||||||||||||||