I made the transfer function check a lookup table to find the output. It is not much faster at all, but I may have opened new possibilities that will allow it to become a lot faster. I have not gotten it perfect yet; the transfer functions keep on trying to look up a number for an index that doesn’t exist.
I discovered all sorts of bugs in the neural network program. That’s very strange, since it’s been working for a long time. In the NewNet sub, it made it so that the number of inputs that each neuron had was the same as the number of neurons in that neuron’s layer. It should be the same as the number of neurons in the previous layer. How has it been working so perfectly with such huge problems? Maybe now it will work even better.
I finished the rough draft for the research paper.
I made it so that the neural network program has user interface settings that can be set by the user. Doing things such as un-checking the option to draw the network can speed the process up. I also made it so that one of the options is to calculate and tell how many frames per second the program is processing. I used the computer’s query performance counter to do this. As a test, I made a four-layer network. The input layer had fifty neurons, the hidden layers had thirty neurons, and the output layer had ten neurons. I made the input resolution 50 x 50, and turned autopic on. It said that the frames per second was about 1.5. This is not fast enough. One interesting observation I made is that changing the resolution makes almost no difference to the speed unless it is equal to the camera’s resolution. Another problem is that the numbers of frames per second goes down the more neural networks are running, and I want to have at least three going. I think that most of the time is spent converting the camera image to grayscale and pixelizing it. Maybe if I did this in a separate program, and then gave the results to the neural network programs, the speed would decrease less when I added more networks. Another thing that I can try to do to make it faster is to use reference tables for the transfer (activation) function.
I changed the transfer function so that the average of all of the inputs multiplied by their weights is used instead of the total. This slowed the program down from 1.5 frames per second to 0.8 frames per second, but it will go way up when I use a lookup table later. I then sped it up to 0.9 frames per second by making it use a local variable defined as a neuron instead of reading from a collection of neurons.
I have been writing a research paper about artificial neural networks for school. I finished the outline today.
I got the information set problem to work. In a sub called CreateGrayscaleBitmap, where it made the grayscale device context, it recorded the number of bytes in the bitmap. It was multiplying by three, which it shouldn’t have because it was grayscale instead of a 24 bit image. (three bytes) I also made it so that the paste button works. I made it so that the paste button and the snapshot button only show the picture on the InputPic and put it in the hCompatibleDC, but the user has to click the GO button to give it to the network and convert it to grayscale.
Instead of using InfoPic(), an array of IpictureDisps, for storing information, I made a collection of byte arrays. When an image is added to memory it takes all of the bytes and adds them to the collection. I used CopyMemoryLPForByte to get the bytes back into the DIBSection used for storing the grayscale image. For some reason, it only works when the resolution is low, otherwise the computer freezes and has to be restarted. It’s worked at and below 10 x 10, but it doesn’t work at or above 20 x 20. So far, while trying to get it to work, I have had to restart it about seven times.
made it so that ANN software uses BitBLT and StretchBLT to get a grayscale pixilated image to use for an input to the neural network
This sped up the process a lot. I can now get at least three frames a second. I used to do this manually, using Point to read the value of every pixel on a picture box. Now I use BitBLT to get the camera’s image into a DIBSection, and then StretchBLT to get it from there into a second one that is grayscale and has a lower resolution. I can then transfer this information into an array of bytes to use for the input. Making these changes caused one major problem; the pictures put into the information set cannot be brought back for learning anymore. I should be able to fix this easily enough. Two more problems that it caused were that the paste button doesn’t work anymore, and the user can no longer draw an input. I will have to fix this.
finished the first thing in the project plans; I made it so that in neural network software the Video Portal control does not need to be visible.
finished the first version of project plans. I will be busier than I thought!
got some ideas from reading part of a report on neural networks that I found on the internet.
This is interesting! http://www.dacs.dtic.mil/techs/neural/neural3.html. I think that I am going to implement lateral inhibition on the output layer of my networks, instead of using a threshold level (currently the threshold level is zero) to get the outputs. I have also thought about using feedback ever since I started making the software. I’m still thinking about it.
I changed the learning process. How it used to be: First, a random neuron’s random weight would be chosen. Second, it would be changed so that the output would be closer to the correct output, and third it would check if the output was close enough to the correct output to start over. If it wasn’t, it would start over. If it was, it moved on to the next part of the information. I made it so that it would go through every neuron and choose and change a random weight, and then move on to the next part of the information. Later I changed it back to how it used to be.
There are many different constants that make up the program, each of which could be changed. This might make the network work better, and it might make it work worse. As I typed that, it reminded me of the weights of neurons, back-propagation, and the whole learning process. What if I made a program that would change the different constants, and then it would test the neural network by trying to teach it information and then testing it? Just like adjusting the weights on a neuron, if the change resulted in something bad, it would undo it and make an opposite change. Maybe I don’t have to build neural network software; the computer can.
decided not to use the E-MAXX for the test-vehicle.
The E-MAXX is bigger, stronger, and faster than I need the test vehicle to be. As soon as I fix it I am going to try to sell it on e-bay. I will use a smaller RC car that I have owned for years as the test vehicle. It can go somewhere from 10 - 15 MPH, and will have one or two X10 cameras on it. These will broadcast to the computer, which will use the parallel port to control the test vehicle. This will be done using the original controller. The computer should be able to control it from up to 300 ft. away. There is one problem though: I have no way to interface two X10 cameras to the computer. At first, when I was only thinking of using one camera, I came up with the solution to just broadcast the video signal to the TV, and set up the QuickCam so that it watched the TV. This won’t work with two cameras; I only have one TV.
started making the software superstructure (can’t think of a better name; the neural networks are just a part of the structure)