home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 6_2008-2009.ISO / data / zips / a_Simply_G215187582009.psc / Class / NNparasChopra.cls next >
Text File  |  2009-04-29  |  14KB  |  446 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "NNparasChopra"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'Don't forget to write option base 1 into the code
  15. ' or else this net will not work
  16. '
  17. 'Coded by Paras Chopra
  18. 'paraschopra@lycos.com
  19. 'http://paraschopra.com/
  20. '
  21.  
  22.  
  23. 'reexre@gmail.com
  24. 'Made   MY_SETneuronBIAS    and
  25. '       MY_SETSinapsWEIGHT  to integrate this class with (reexre) Genetic Algorithm Class "SimplyGA"
  26. '       GetTotalNofNeurons
  27. '       GetTotalNofSinaps
  28.  
  29.  
  30.  
  31. Option Base 1
  32. Option Explicit
  33.  
  34. Const E = 2.7183 'Mathematical const, used in sigmod function
  35.  
  36. Private Type tSinapse ' Sinapse connects one neuron to another and allows signal to pass from it
  37.     Weight As Double 'Weight it has
  38.     WeightChange As Double 'The change in weight during learning
  39. End Type
  40.  
  41. Private Type tNeuron 'The main thing
  42.     Sinapses() As tSinapse 'Array of Denrites
  43.     SinapseCount As Long 'Number of Sinapses
  44.     Bias As Double 'The bias
  45.     BiasChange As Double 'The change in bias during learning
  46.     Value As Double 'The value to be passed to next layer of neurons
  47.     Delta As Double 'The delta of neuron (used while learning)
  48. End Type
  49.  
  50.  
  51.  
  52. Private Type tLayer 'Layer contaning number of neurons
  53.     Neurons() As tNeuron 'Neurons in the layer
  54.     NeuronCount As Long 'Number of neurons
  55. End Type
  56.  
  57. Private Type tNeuralNetwork
  58.     Layers() As tLayer 'Layers in the network
  59.     LayerCount As Long 'Number of layers
  60.     LearningRate As Double 'The learning rateof the network
  61. End Type
  62.  
  63. Dim Network As tNeuralNetwork ' Our main network
  64.  
  65.  
  66.  
  67.  
  68. ''reexre
  69. Dim fast_N_toLayer()
  70. Dim fast_N_toNeuron()
  71.  
  72. Dim fast_S_toLayer()
  73. Dim fast_S_toNeuron()
  74. Dim fast_S_toSinap()
  75. ''
  76.  
  77.  
  78.  
  79. Function CreateNet(LearningRate As Double, ArrayOFlyers As Variant) As Integer '0 = Unsuccesful and 1 = Successful
  80. Dim I, j, k As Integer
  81. Network.LayerCount = UBound(ArrayOFlyers) 'Init number of layers
  82. If Network.LayerCount < 2 Then 'Input and output layers must be there
  83.     CreateNet = 0 'Unsuccessful
  84.     Exit Function
  85. End If
  86. Network.LearningRate = LearningRate 'The learning rate
  87. ReDim Network.Layers(Network.LayerCount) As tLayer 'Redim the layers variable
  88. For I = 1 To UBound(ArrayOFlyers) ' Initialize all layers
  89.     DoEvents
  90.     Network.Layers(I).NeuronCount = ArrayOFlyers(I)
  91.     ReDim Network.Layers(I).Neurons(Network.Layers(I).NeuronCount) As tNeuron
  92.     For j = 1 To ArrayOFlyers(I) 'Initialize all neurons
  93.         DoEvents
  94.         If I = UBound(ArrayOFlyers) Then 'We will not init Sinapses for it because output layers doesn't have any
  95.             Network.Layers(I).Neurons(j).Bias = GetRand 'Set the bias to random value
  96.             Network.Layers(I).Neurons(j).SinapseCount = ArrayOFlyers(I - 1)
  97.             ReDim Network.Layers(I).Neurons(j).Sinapses(Network.Layers(I).Neurons(j).SinapseCount) As tSinapse 'Redim the Sinapse var
  98.             For k = 1 To ArrayOFlyers(I - 1)
  99.                 DoEvents
  100.                 Network.Layers(I).Neurons(j).Sinapses(k).Weight = GetRand 'Set the weight of each Sinapse
  101.             Next k
  102.         ElseIf I = 1 Then 'Only init Sinapses not bias
  103.             DoEvents 'Do nothing coz it is input layer
  104.         Else
  105.             Network.Layers(I).Neurons(j).Bias = GetRand 'Set the bias to random value
  106.             Network.Layers(I).Neurons(j).SinapseCount = ArrayOFlyers(I - 1)
  107.             ReDim Network.Layers(I).Neurons(j).Sinapses(Network.Layers(I).Neurons(j).SinapseCount) As tSinapse 'Redim the Sinapse var
  108.             For k = 1 To ArrayOFlyers(I - 1)
  109.                 DoEvents
  110.                 Network.Layers(I).Neurons(j).Sinapses(k).Weight = GetRand 'Set the weight of each Sinapse
  111.             Next k
  112.         End If
  113.     Next j
  114. Next I
  115. CreateNet = 1
  116.  
  117.  
  118.  
  119. ''reexre
  120. ReDim fast_N_toLayer(GetTotalNofSinaps)
  121. ReDim fast_N_toNeuron(GetTotalNofSinaps)
  122.  
  123. ReDim fast_S_toLayer(GetTotalNofSinaps)
  124. ReDim fast_S_toNeuron(GetTotalNofSinaps)
  125. ReDim fast_S_toSinap(GetTotalNofSinaps)
  126.  
  127.  
  128. MY_InitFAST
  129. ''reexre
  130.  
  131.  
  132. End Function
  133.  
  134.  
  135. Function RUN(ArrayOfInputs As Variant) As Variant 'It returns the output inf form of array
  136. Dim I, j, k As Integer
  137. If UBound(ArrayOfInputs) <> Network.Layers(1).NeuronCount Then
  138.     RUN = 0
  139.     Exit Function
  140. End If
  141. For I = 1 To Network.LayerCount
  142.     DoEvents
  143.     For j = 1 To Network.Layers(I).NeuronCount
  144.         DoEvents
  145.         If I = 1 Then
  146.             Network.Layers(I).Neurons(j).Value = ArrayOfInputs(j) 'Set the value of input layer
  147.         Else
  148.             Network.Layers(I).Neurons(j).Value = 0 'First set the value to zero
  149.             For k = 1 To Network.Layers(I - 1).NeuronCount
  150.                 'DoEvents
  151.                 Network.Layers(I).Neurons(j).Value = Network.Layers(I).Neurons(j).Value + Network.Layers(I - 1).Neurons(k).Value * Network.Layers(I).Neurons(j).Sinapses(k).Weight 'Calculating the value
  152.             Next k
  153.             Network.Layers(I).Neurons(j).Value = Activation(Network.Layers(I).Neurons(j).Value + Network.Layers(I).Neurons(j).Bias) 'Calculating the real value of neuron
  154.         End If
  155.     Next j
  156. Next I
  157. ReDim OutputResult(Network.Layers(Network.LayerCount).NeuronCount) As Double
  158. For I = 1 To (Network.Layers(Network.LayerCount).NeuronCount)
  159.     DoEvents
  160.     OutputResult(I) = (Network.Layers(Network.LayerCount).Neurons(I).Value) 'The array of output result
  161. Next I
  162. RUN = OutputResult
  163. End Function
  164.  
  165. Function Train(inputdata As Variant, outputdata As Variant) As Integer '0=unsuccessful and 1 = sucessful
  166. Dim I, j, k As Integer
  167. If UBound(inputdata) <> Network.Layers(1).NeuronCount Then 'Check if correct amount of input is given
  168.     Train = 0
  169.     Exit Function
  170. End If
  171. If UBound(outputdata) <> Network.Layers(Network.LayerCount).NeuronCount Then 'Check if correct amount of output is given
  172.     Train = 0
  173.     Exit Function
  174. End If
  175. Call RUN(inputdata) 'Calculate values of all neurons and set the input
  176. 'Calculate delta's
  177. For I = 1 To Network.Layers(Network.LayerCount).NeuronCount
  178.     DoEvents
  179.     Network.Layers(Network.LayerCount).Neurons(I).Delta = Network.Layers(Network.LayerCount).Neurons(I).Value * (1 - Network.Layers(Network.LayerCount).Neurons(I).Value) * (outputdata(I) - Network.Layers(Network.LayerCount).Neurons(I).Value) 'Deltas of Output layer
  180.     For j = Network.LayerCount - 1 To 2 Step -1
  181.         DoEvents
  182.         For k = 1 To Network.Layers(j).NeuronCount
  183.             DoEvents
  184.             Network.Layers(j).Neurons(k).Delta = Network.Layers(j).Neurons(k).Value * (1 - Network.Layers(j).Neurons(k).Value) * Network.Layers(j + 1).Neurons(I).Sinapses(k).Weight * Network.Layers(j + 1).Neurons(I).Delta 'Deltas of Hidden Layers
  185.         Next k
  186.     Next j
  187. Next I
  188. For I = Network.LayerCount To 2 Step -1
  189.     DoEvents
  190.     For j = 1 To Network.Layers(I).NeuronCount
  191.         DoEvents
  192.         Network.Layers(I).Neurons(j).Bias = Network.Layers(I).Neurons(j).Bias + (Network.LearningRate * 1 * Network.Layers(I).Neurons(j).Delta) 'Calculate new bias
  193.         For k = 1 To Network.Layers(I).Neurons(j).SinapseCount
  194.             DoEvents
  195.             Network.Layers(I).Neurons(j).Sinapses(k).Weight = Network.Layers(I).Neurons(j).Sinapses(k).Weight + (Network.LearningRate * Network.Layers(I - 1).Neurons(k).Value * Network.Layers(I).Neurons(j).Delta) 'Calculate new weights
  196.         Next k
  197.     Next j
  198. Next I
  199. Train = 1
  200. End Function
  201.  
  202.  
  203. 'Function Sigmod(Value As Double, Threshold As Double)
  204. 'Sigmod = 1 / (1 + e ^ (-(Value - Threshold)))
  205. 'End Function
  206.  
  207.  
  208. Private Function Activation(Value As Double)
  209. 'If Value < -50 Then Activation = 0: Exit Function
  210. 'If Value > 50 Then Activation = 1: Exit Function
  211.  
  212. 'To crunch a number between 0 and 1
  213. Activation = (1 / (1 + Exp(Value * -1)))
  214. End Function
  215.  
  216. Function GetRand() As Double 'Produces a number between -1 and 1
  217. Randomize
  218. GetRand = 2 - (1 + Rnd + Rnd)
  219. 'GetRand = Rnd
  220. End Function
  221.  
  222. Sub EraseNetwork()
  223. Erase Network.Layers
  224. End Sub
  225.  
  226. Function SaveNet(FilePath As String) As Integer ' 1 = successful, 0 =unsucessful
  227. Dim I, j, k As Integer
  228. Open FilePath For Output As #1
  229. Print #1, "START Learning Rate"
  230. Print #1, Network.LearningRate
  231. Print #1, "END Learning Rate"
  232. Print #1, "START Layer Count"
  233. Print #1, Network.LayerCount
  234. Print #1, "END Layer Count"
  235. Print #1, "START Input Layer Neuron Count"
  236. Print #1, Network.Layers(1).NeuronCount
  237. Print #1, "END Input Layer Neuron Count"
  238. For I = 2 To Network.LayerCount
  239.     Print #1, "START Next Layer"
  240.     Print #1, "START Neuron Count"
  241.     Print #1, Network.Layers(I).NeuronCount
  242.     Print #1, "END Neuron Count"
  243.     For j = 1 To Network.Layers(I).NeuronCount
  244.         Print #1, "START Neuron"
  245.         Print #1, "START Bias"
  246.         Print #1, Network.Layers(I).Neurons(j).Bias
  247.         Print #1, "END Bias"
  248.         Print #1, "START Sinapses"
  249.         For k = 1 To Network.Layers(I).Neurons(j).SinapseCount
  250.             Print #1, Network.Layers(I).Neurons(j).Sinapses(k).Weight
  251.         Next k
  252.         Print #1, "END Sinapses"
  253.         Print #1, "END Neuron"
  254.     Next j
  255.     Print #1, "END Layer"
  256. Next I
  257. Close #1
  258. SaveNet = 1
  259. End Function
  260.  
  261. Function LoadNet(FilePath As String) As Integer ' 1 = successful, 0 =unsucessful
  262. Dim Data, DataMain As String
  263. Dim LayerTrack, NeuronTrack As Long 'The variable which tracks the current layer and current neuron
  264. Dim I As Long
  265. If FileExists(FilePath) = 0 Then
  266.     LoadNet = 0 'File doest not exists
  267.     Exit Function
  268. End If
  269. Open FilePath For Input As #1
  270. Do While Not EOF(1)
  271.     DoEvents
  272.     Line Input #1, Data
  273.     Select Case Data
  274.         Case "START Learning Rate":
  275.             Line Input #1, DataMain
  276.             Network.LearningRate = CDbl(DataMain)
  277.         Case "START Layer Count":
  278.             Line Input #1, DataMain
  279.             Network.LayerCount = CLng(DataMain)
  280.             ReDim Network.Layers(Network.LayerCount) As tLayer
  281.         Case "START Input Layer Neuron Count": 'Input layer
  282.             LayerTrack = 1
  283.             Line Input #1, DataMain
  284.             Network.Layers(1).NeuronCount = CLng(DataMain)
  285.             ReDim Network.Layers(1).Neurons(Network.Layers(1).NeuronCount) As tNeuron
  286.         Case "START Neuron Count":
  287.             LayerTrack = LayerTrack + 1
  288.             Line Input #1, DataMain
  289.             Network.Layers(LayerTrack).NeuronCount = CLng(DataMain)
  290.             ReDim Network.Layers(LayerTrack).Neurons(Network.Layers(LayerTrack).NeuronCount) As tNeuron
  291.         Case "START Bias":
  292.             NeuronTrack = NeuronTrack + 1
  293.             Line Input #1, DataMain
  294.             Network.Layers(LayerTrack).Neurons(NeuronTrack).Bias = CDbl(DataMain)
  295.             Network.Layers(LayerTrack).Neurons(NeuronTrack).SinapseCount = Network.Layers(LayerTrack - 1).NeuronCount
  296.             ReDim Network.Layers(LayerTrack).Neurons(NeuronTrack).Sinapses(Network.Layers(LayerTrack).Neurons(NeuronTrack).SinapseCount) As tSinapse
  297.         Case "START Sinapses":
  298.             For I = 1 To Network.Layers(LayerTrack).Neurons(NeuronTrack).SinapseCount 'All the Sinapses
  299.                 DoEvents
  300.                 Line Input #1, DataMain
  301.                 Network.Layers(LayerTrack).Neurons(NeuronTrack).Sinapses(I).Weight = CDbl(DataMain)
  302.             Next I
  303.         Case "END Layer":
  304.             NeuronTrack = 0
  305.         Case Else
  306.             DoEvents
  307. End Select
  308. Loop
  309. Close #1
  310. LayerTrack = 0
  311. NeuronTrack = 0
  312. LoadNet = 1
  313. End Function
  314.  
  315. ' FUNCTION: FileExists
  316. ' Determines whether the specified file exists
  317. '
  318. ' IN: [strPathName] - file to check for
  319. '
  320. ' Returns: True if file exists, False otherwise
  321. '-----------------------------------------------------------
  322. '
  323. Private Function FileExists(ByVal strPathName As String) As Integer
  324. Dim intFileNum As Integer
  325.  
  326. On Error Resume Next
  327.  
  328. '
  329. 'Remove any trailing directory separator character
  330. '
  331. If Right$(strPathName, 1) = "\" Then
  332.     strPathName = Left$(strPathName, Len(strPathName) - 1)
  333. End If
  334.  
  335. '
  336. 'Attempt to open the file, return value of this function is False
  337. 'if an error occurs on open, True otherwise
  338. '
  339. intFileNum = FreeFile
  340. Open strPathName For Input As intFileNum
  341.  
  342. FileExists = IIf(Err, False, True)
  343.  
  344. Close intFileNum
  345.  
  346. Err = 0
  347. End Function
  348.  
  349.  
  350. Public Function GetTotalNofNeurons() As Long
  351. Dim NN As Long
  352. Dim L
  353.  
  354. NN = 0
  355.  
  356. For L = 1 To Network.LayerCount
  357.     NN = NN + Network.Layers(L).NeuronCount
  358.     
  359.     
  360. Next
  361. GetTotalNofNeurons = NN
  362.  
  363. End Function
  364.  
  365. Public Function GetTotalNofSinaps() As Long
  366. Dim SS As Long
  367. Dim L
  368. Dim N
  369.  
  370. SS = 0
  371. For L = 1 To Network.LayerCount
  372.     For N = 1 To Network.Layers(L).NeuronCount
  373.         SS = SS + Network.Layers(L).Neurons(N).SinapseCount
  374.     Next
  375. Next
  376. GetTotalNofSinaps = SS
  377.  
  378. End Function
  379.  
  380. Public Property Get NofInputs()
  381. NofInputs = Network.Layers(1).NeuronCount
  382. End Property
  383. Public Property Get NofOutputs()
  384. NofOutputs = Network.Layers(Network.LayerCount).NeuronCount
  385. End Property
  386.  
  387.  
  388. Private Sub MY_InitFAST()
  389. 'Stop
  390. Dim SS
  391. Dim L
  392. Dim N
  393. Dim S
  394. Dim NN
  395.  
  396. SS = 0
  397. NN = 0
  398. For L = 1 To Network.LayerCount
  399.     For N = 1 To Network.Layers(L).NeuronCount
  400.         NN = NN + 1
  401.         
  402.         fast_N_toLayer(NN) = L
  403.         fast_N_toNeuron(NN) = N
  404.         
  405.         For S = 1 To Network.Layers(L).Neurons(N).SinapseCount
  406.             
  407.             SS = SS + 1
  408.             
  409.             fast_S_toLayer(SS) = L
  410.             fast_S_toNeuron(SS) = N
  411.             fast_S_toSinap(SS) = S
  412.             
  413.         Next
  414.     Next
  415. Next
  416.  
  417.  
  418. End Sub
  419.  
  420.  
  421. Public Property Let MY_SETneuronBIAS(wGlobalNeuron, vBIAS)
  422.  
  423. Dim L
  424. Dim N
  425. L = fast_N_toLayer(wGlobalNeuron)
  426. N = fast_N_toNeuron(wGlobalNeuron)
  427. Network.Layers(L).Neurons(N).Bias = vBIAS
  428.  
  429. End Property
  430.  
  431.  
  432. Public Property Let MY_SETSinapsWEIGHT(wGlobalSinap, vWEI)
  433. Dim L
  434. Dim N
  435. Dim S
  436.  
  437.  
  438. L = fast_S_toLayer(wGlobalSinap)
  439. N = fast_S_toNeuron(wGlobalSinap)
  440. S = fast_S_toSinap(wGlobalSinap)
  441.  
  442. Network.Layers(L).Neurons(N).Sinapses(S).Weight = vWEI
  443.  
  444.  
  445. End Property
  446.