Figura 4.18 Ingreso al Neuroshell
Luego del ingreso elija FILE, NEW e ingrese un nombre de archivo, como en la figura 4.19 (no escriba ninguna extensión para el archivo).
Figura 4.19.
Figura 4.20
Seleccione Data Entry (figura 4.21) e ingrese los datos de la tabla 4.4, para entrenar la red neuronal (figura 4.22). Se sugiere para el entrenamiento duplicar estos datos dos veces salvo el titulo de cada columna.
Figura 4.22
Luego de ingresar los datos cierre la ventana después de haber grabado estos con File, Save File.
Ahora elija el icono en la figura 4.21, en la lista desplegable variable type selection elija input y haga clic debajo del nombre de cada entrada, este quedará marcado con I, luego elija Actual Output en la lista desplegable anterior y haga clic en el nombre de cada salida para la red neuronal. Ahora elija Settings y Compute mins/maxs. Cierre la ventana.
Las figuras 4.23 al 4.29 muestran el procedimiento a seguir hasta generar el código fuente en C o Visual Basic.
En la figura 4.26 elija examinar datos para analizar los datos y los errores generados a la salida.
El procedimiento de la figura 4.27 al 4.29 permite generar el código fuente en C. Para nuestro caso elegiremos Visual Basic source code.
Figura 4.23
Figura 4.25
Figura 4.27
Figura 4.29
El codigo generado en Visual Basic se genera en un archivo que tiene la extensión .VB y es un procedimiento en Visual Basic; que contiene el conocimiento en una red neuronal. Para nuestro caso el archivo es ROBOT.VB y se encuentra en la carpeta APLICACIÓN ROBOT del CD que acompaña al libro, cuyo contenido es:
' Insert this code into your VB program to fire the D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network
' This code is designed to be simple and fast for porting to any machine. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers.
Sub Fire_ROBOT (inarray(), outarray())
Dim netsum as double Static feature2(3) as double ' inarray(1) is S1 ' inarray(2) is S2 ' inarray(3) is S3 ' inarray(4) is S4 ' outarray(1) is M1 ' outarray(2) is M2
if (inarray(1)<-1) then inarray(1) = -1 if (inarray(1)> 1) then inarray(1) = 1 inarray(1) = (inarray(1) + 1) / 2
if (inarray(2)<-1) then inarray(2) = -1 if (inarray(2)> 1) then inarray(2) = 1 inarray(2) = (inarray(2) + 1) / 2
if (inarray(3)<-1) then inarray(3) = -1 if (inarray(3)> 1) then inarray(3) = 1 inarray(3) = (inarray(3) + 1) / 2
if (inarray(4)<-1) then inarray(4) = -1 if (inarray(4)> 1) then inarray(4) = 1 inarray(4) = (inarray(4) + 1) / 2
netsum = -.7532668
netsum = netsum + inarray(1) * 7.551737 netsum = netsum + inarray(2) * .2998328 netsum = netsum + inarray(3) * 7.341322 netsum = netsum + inarray(4) * -6.852577 feature2(1) = 1 / (1 + exp(-netsum))
netsum = -2.495483
netsum = netsum + inarray(1) * -5.648689 netsum = netsum + inarray(2) * 1.05053 netsum = netsum + inarray(3) * -5.979871 netsum = netsum + inarray(4) * 6.870361 feature2(2) = 1 / (1 + exp(-netsum))
netsum = -4.198974E-02
netsum = netsum + inarray(1) * 4.999131 netsum = netsum + inarray(2) * -3.897346 netsum = netsum + inarray(3) * 2.603323E-05 netsum = netsum + inarray(4) * -3.897321 feature2(3) = 1 / (1 + exp(-netsum))
netsum = .1287855
netsum = netsum + feature2(1) * -2.675452 netsum = netsum + feature2(2) * -2.65109 netsum = netsum + feature2(3) * 6.387748 outarray(1) = 1 / (1 + exp(-netsum))
netsum = 3.821959
netsum = netsum + feature2(1) * -6.030695 netsum = netsum + feature2(2) * 3.957484 netsum = netsum + feature2(3) * 8.61486E-03 outarray(2) = 1 / (1 + exp(-netsum))
outarray(1) = 2 * (outarray(1) - .1) / .8 + -1 if (outarray(1)<-1) then outarray(1) = -1 if (outarray(1)> 1) then outarray(1) = 1
outarray(2) = 2 * (outarray(2) - .1) / .8 + -1 if (outarray(2)<-1) then outarray(2) = -1 if (outarray(2)> 1) then outarray(2) = 1
End Sub
Ahora debemos generar una aplicación en Visual Basic 6.0, que nos permita utilizar el código que contiene a la red neuronal.
Iniciamos creando un formulario que permita manipular las entradas y salidas que tiene la red neuronal (figura 4.30).
Figura 4.30. Formulario en Visual Basic que manipula las entradas y salidas de la red neuronal.
Luego modificamos el código por defecto que tiene el formulario. El código modificado debe quedar tal como se muestra en el listado siguiente:
Private Sub Command1_Click() Dim e(4) As Double
Dim s(2) As Double ' Asignacion de entradas e(1) = Val(Text1.Text) e(2) = Val(Text2.Text) e(3) = Val(Text3.Text) e(4) = Val(Text4.Text)
' llamada a la red neuronal Call Fire_ROBOT(e, s)
' mostrar salida
If (s(1) >= 0.9 And s(1) <= 1) Then
Text5.Text = " motor gira hacia adelante" End If
If (s(1) >= -1 And s(1) <= -0.9) Then Text5.Text = " motor gira hacia atrás" End If
If (s(2) >= 0.9 And s(2) <= 1) Then
Text6.Text = " motor gira hacia adelante" End If
If (s(2) >= -1 And s(2) <= -0.9) Then Text6.Text = " motor gira hacia atrás" End If
End Sub
' Insert this code into your VB program to fire the D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network
' This code is designed to be simple and fast for porting to any machine. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers.
Sub Fire_ROBOT(inarray() As Double, outarray() As Double)
Dim netsum As Double Static feature2(3) As Double ' inarray(1) is S1 ' inarray(2) is S2 ' inarray(3) is S3 ' inarray(4) is S4 ' outarray(1) is M1 ' outarray(2) is M2
If (inarray(1) < -1) Then inarray(1) = -1 If (inarray(1) > 1) Then inarray(1) = 1 inarray(1) = (inarray(1) + 1) / 2
If (inarray(2) < -1) Then inarray(2) = -1 If (inarray(2) > 1) Then inarray(2) = 1 inarray(2) = (inarray(2) + 1) / 2
If (inarray(3) < -1) Then inarray(3) = -1 If (inarray(3) > 1) Then inarray(3) = 1 inarray(3) = (inarray(3) + 1) / 2
If (inarray(4) < -1) Then inarray(4) = -1 If (inarray(4) > 1) Then inarray(4) = 1 inarray(4) = (inarray(4) + 1) / 2
netsum = -0.7532668
netsum = netsum + inarray(1) * 7.551737 netsum = netsum + inarray(2) * 0.2998328 netsum = netsum + inarray(3) * 7.341322 netsum = netsum + inarray(4) * -6.852577 feature2(1) = 1 / (1 + Exp(-netsum))
netsum = -2.495483
netsum = netsum + inarray(1) * -5.648689 netsum = netsum + inarray(2) * 1.05053 netsum = netsum + inarray(3) * -5.979871 netsum = netsum + inarray(4) * 6.870361 feature2(2) = 1 / (1 + Exp(-netsum))
netsum = -0.04198974
netsum = netsum + inarray(1) * 4.999131 netsum = netsum + inarray(2) * -3.897346 netsum = netsum + inarray(3) * 0.00002603323 netsum = netsum + inarray(4) * -3.897321 feature2(3) = 1 / (1 + Exp(-netsum))
netsum = netsum + feature2(1) * -2.675452 netsum = netsum + feature2(2) * -2.65109 netsum = netsum + feature2(3) * 6.387748 outarray(1) = 1 / (1 + Exp(-netsum))
netsum = 3.821959
netsum = netsum + feature2(1) * -6.030695 netsum = netsum + feature2(2) * 3.957484 netsum = netsum + feature2(3) * 0.00861486 outarray(2) = 1 / (1 + Exp(-netsum))
outarray(1) = 2 * (outarray(1) - 0.1) / 0.8 + -1 If (outarray(1) < -1) Then outarray(1) = -1 If (outarray(1) > 1) Then outarray(1) = 1
outarray(2) = 2 * (outarray(2) - 0.1) / 0.8 + -1 If (outarray(2) < -1) Then outarray(2) = -1 If (outarray(2) > 1) Then outarray(2) = 1
End Sub
Private Sub Command2_Click() End
End Sub
Notese que también se ha agregado el código generado por el Neuroshell (contenido del archivo ROBOT.VB)
Una vez modificado el código ejecutamos el programa e ingresamos las entradas de la red neuronal y al presionar el boton “Determinar la accion de los motores del robot con una red neuronal” se debe obtener la salida que ofrece la red neuronal. Para nuestro caso se ha realizado la ejecución con las entradas del último patrón de entrenamiento de la tabla 4.4, esta ejecución se muestra en la figura 4.31.
Cabe mencionar que las salidas de la red neuronal son cercanas o iguales a 1 ó -1 y se debe aproximar estas salidas a estos valores. Esta aproximación se realiza a través del siguiente código:
If (s(1) >= 0.9 And s(1) <= 1) Then Text5.Text = " motor gira hacia adelante" End If
If (s(1) >= -1 And s(1) <= -0.9) Then Text5.Text = " motor gira hacia atrás" End If
If (s(2) >= 0.9 And s(2) <= 1) Then
Text6.Text = " motor gira hacia adelante" End If
If (s(2) >= -1 And s(2) <= -0.9) Then Text6.Text = " motor gira hacia atrás" End If
4.9.2. APLICACIÓN PARA SÍNTOMAS Y DIAGNÓSTICOS DE