Class TNeuralNetwork for Harbour

User avatar
jnavas
Posts: 479
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Class TNeuralNetwork for Harbour

Post by jnavas »

Saludos,
Antonio gracias por excelente trabajo, he estado gogleando, por ahora solo tengo fantasías y expongo una de ellas:

La IA para la integración contable, debemos entrenarla de manera similar en la que capacitamos a un auxiliar contable,
cuando te llega esta factura debes aplicar estos principios o criterio, debemos tomar una foto de la factura de compra y entrenar la IA mediante tensorflow, ¿esto debemos hacerlo proveedor por proveedor?, la IA ira aprendiendo que es una factura de compra y las próximas facturas de compra será facil, hasta que puede hacerlo totalmente autónomo.
¿Cómo le indico a tensorflow las partes de la factura. Item, Codigo, descripción, monto, IVA, ID_FISCAL?,
User avatar
Antonio Linares
Site Admin
Posts: 42273
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Class TNeuralNetwork for Harbour

Post by Antonio Linares »

Querido Juan,

Tienes que pensar en cual van a ser los "inputs" que le vas a dar a la red neuronal y cuales son los "outputs" esperados.

Por ejemplo, imagina que le vas a dar 12 valores diferentes a la vez (en cada sesión de entrenamiento), y que esperas 7 valores diferentes de retorno

En ese caso la red neuronal usaría 12 perceptrones de entrada y 7 perceptrones de salida. Por lo general se usa una capa intermedia, por lo menos, entre la capa de entrada y la de salida. Esa capa intermedia podria usar, por ejemplo, 10 perceptrones.

Conforme se entrena, la red neuronal va ajustándose más y más a los valores esperados, disminuyendo así el error cometido y mejorando su nivel de acierto.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42273
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Class TNeuralNetwork for Harbour

Post by Antonio Linares »

Aquí tienes el código en Harbour escrito por chatGPT para el ejemplo anterior:

Code: Select all | Expand

#define EPOCHS         100
#define LEARNING_RATE  0.1

function Main()

   LOCAL input_data := {0.5, 0.3, 0.2, 0.7, 0.9, 0.1, 0.4, 0.6, 0.8, 0.2, 0.5, 0.7}
   LOCAL true_output := {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7}

   train_neural_network( input_data, true_output)

return nil 

FUNCTION sigmoid(x)
    RETURN 1 / (1 + EXP(-x))
   
FUNCTION sigmoid_derivative(x)
    RETURN x * (1 - x)

PROCEDURE initialize_parameters( weights_input_hidden, weights_hidden_output, bias_hidden, bias_output)
    FOR i := 1 TO 12
        FOR j := 1 TO 10
            weights_input_hidden[i, j] := hb_Random( 0, 1 ) / 1
        NEXT
    NEXT
   
    FOR i := 1 TO 10
        FOR j := 1 TO 7
            weights_hidden_output[i, j] := hb_Random( 0, 1 ) / 1
        NEXT
        bias_hidden[i] := 0.0
    NEXT

    FOR i := 1 TO 7
        bias_output[i] := 0.0
    NEXT

PROCEDURE forward_propagation( inputs, weights_input_hidden, weights_hidden_output, bias_hidden, bias_output, hidden_output, predicted_output)
    LOCAL hidden_input[10]

    FOR i := 1 TO 10
        hidden_input[i] := 0.0
        FOR j := 1 TO 12
            hidden_input[i] := hidden_input[i] + inputs[j] * weights_input_hidden[j, i]
        NEXT
        hidden_input[i] := hidden_input[i] + bias_hidden[i]
        hidden_output[i] := sigmoid(hidden_input[i])
    NEXT

    FOR i := 1 TO 7
        predicted_output[i] := 0.0
        FOR j := 1 TO 10
            predicted_output[i] := predicted_output[i] + hidden_output[j] * weights_hidden_output[j, i]
        NEXT
        predicted_output[i] := predicted_output[i] + bias_output[i]
        predicted_output[i] := sigmoid(predicted_output[i])
    NEXT

PROCEDURE calculate_loss( predicted_output, true_output )
    LOCAL loss := 0.0

    FOR i := 1 TO 7
        loss := loss + 0.5 * ((predicted_output[i] - true_output[i]) ^ 2)
    NEXT

    RETURN loss

PROCEDURE backward_propagation( inputs, true_output, hidden_output, predicted_output, weights_hidden_output, weights_input_hidden, bias_hidden, bias_output)
    LOCAL output_error[7], output_delta[7]
    LOCAL hidden_error, hidden_delta
    
    FOR i := 1 TO 7
        output_error[i] := true_output[i] - predicted_output[i]
        output_delta[i] := output_error[i] * sigmoid_derivative(predicted_output[i])
    NEXT

    FOR i := 1 TO 10
        hidden_error := 0.0
        FOR j := 1 TO 7
            hidden_error := hidden_error + output_delta[j] * weights_hidden_output[i, j]
        NEXT

        hidden_delta := hidden_error * sigmoid_derivative(hidden_output[i])

        FOR j := 1 TO 12
            weights_input_hidden[j, i] := weights_input_hidden[j, i] + inputs[j] * hidden_delta * LEARNING_RATE
        NEXT
        bias_hidden[i] := bias_hidden[i] + hidden_delta * LEARNING_RATE

        FOR j := 1 TO 7
            weights_hidden_output[i, j] := weights_hidden_output[i, j] + hidden_output[i] * output_delta[j] * LEARNING_RATE
        NEXT
        bias_output[i] := bias_output[i] + output_delta[i] * LEARNING_RATE
    NEXT

PROCEDURE train_neural_network( inputs, true_output )
    LOCAL weights_input_hidden[12, 10], weights_hidden_output[10, 7], bias_hidden[10], bias_output[7]
    LOCAL hidden_output[10], predicted_output[7], loss

    initialize_parameters(weights_input_hidden, weights_hidden_output, bias_hidden, bias_output)

    FOR epoch := 1 TO EPOCHS
        hidden_output = Array( 10 )
        predicted_output = Array( 7 )
       
        forward_propagation(inputs, weights_input_hidden, weights_hidden_output, bias_hidden, bias_output, @hidden_output, @predicted_output)

        loss := calculate_loss(predicted_output, true_output)

        backward_propagation(inputs, true_output, hidden_output, predicted_output, weights_hidden_output, weights_input_hidden, bias_hidden, bias_output)

        IF Mod(epoch, 100) == 0
            ? "Epoch", epoch, "Loss:", loss
        ENDIF
    NEXT

    ? "Training complete!"

RETURN

 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
jnavas
Posts: 479
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Class TNeuralNetwork for Harbour

Post by jnavas »

La IA para la integración contable, debemos entrenarla de manera similar en que capacitamos a un auxiliar contable, cuando te llega esta factura debes aplicar estos principios, debemos tomar una foto de la factura de compra y entrenar la IA mediante tensorflow, ¿esto debemos hacerlo proveedor por proveedor?, la IA irá aprendiendo que es una factura de compra y las próximas facturas de compra será facil, hasta que puede hacerlo totalmente autónomo.
¿Cómo podemos aplicarlo con tensorflow?
User avatar
jnavas
Posts: 479
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Class TNeuralNetwork for Harbour

Post by jnavas »

Antonio,
Gracias
primero debe mostrarle la foto , method ImportGraph( cFileName ) // no devuelve un valor. , Primero voy a compilarlo y asignarle la imagen.
Antonio Linares wrote:Querido Juan,

Tienes que pensar en cual van a ser los "inputs" que le vas a dar a la red neuronal y cuales son los "outputs" esperados.

Por ejemplo, imagina que le vas a dar 12 valores diferentes a la vez (en cada sesión de entrenamiento), y que esperas 7 valores diferentes de retorno

En ese caso la red neuronal usaría 12 perceptrones de entrada y 7 perceptrones de salida. Por lo general se usa una capa intermedia, por lo menos, entre la capa de entrada y la de salida. Esa capa intermedia podria usar, por ejemplo, 10 perceptrones.

Conforme se entrena, la red neuronal va ajustándose más y más a los valores esperados, disminuyendo así el error cometido y mejorando su nivel de acierto.
User avatar
Antonio Linares
Site Admin
Posts: 42273
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Class TNeuralNetwork for Harbour

Post by Antonio Linares »

Para llegar a ese nivel tendrias que usar a todos tus usuarios de tus aplicaciones para retro alimentar la red neuronal

Harian falta miles de entrenamientos

Piensalo en un nivel mas simple. Lo entrenas tu, o lo entrenan ellos. Lo ideal seria ambos

Entiende la esencia, luego escala esa idea tanto como te permita la imaginación :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42273
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Class TNeuralNetwork for Harbour

Post by Antonio Linares »

hay librerías open source para el reconocimiento de imágenes basadas en inteligencia artificial

Si lo que quieres es automatizar el proceso de lectura de unas facturas o documentos, tendrias que usar la libreria OpenCV

https://fivetechsupport.com/forums/view ... lit=opencv
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42273
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Class TNeuralNetwork for Harbour

Post by Antonio Linares »

Ejemplo corregido y resultado:

Code: Select all | Expand

#define EPOCHS         1000
#define LEARNING_RATE  0.1

function Main()

   LOCAL input_data := {0.5, 0.3, 0.2, 0.7, 0.9, 0.1, 0.4, 0.6, 0.8, 0.2, 0.5, 0.7}
   LOCAL true_output := {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7}

   train_neural_network( input_data, true_output)

return nil 

FUNCTION sigmoid(x)
    RETURN 1 / (1 + EXP(-x))
   
FUNCTION sigmoid_derivative(x)
    RETURN x * (1 - x)

PROCEDURE initialize_parameters( weights_input_hidden, weights_hidden_output, bias_hidden, bias_output)
    FOR i := 1 TO 12
        FOR j := 1 TO 10
            weights_input_hidden[i, j] := hb_Random( 0, 1 ) / 1
        NEXT
    NEXT
   
    FOR i := 1 TO 10
        FOR j := 1 TO 7
            weights_hidden_output[i, j] := hb_Random( 0, 1 ) / 1
        NEXT
        bias_hidden[i] := 0.0
    NEXT

    FOR i := 1 TO 7
        bias_output[i] := 0.0
    NEXT

PROCEDURE forward_propagation( inputs, weights_input_hidden, weights_hidden_output, bias_hidden, bias_output, hidden_output, predicted_output)
    LOCAL hidden_input[10]

    FOR i := 1 TO 10
        hidden_input[i] := 0.0
        FOR j := 1 TO 12
            hidden_input[i] := hidden_input[i] + inputs[j] * weights_input_hidden[j, i]
        NEXT
        hidden_input[i] := hidden_input[i] + bias_hidden[i]
        hidden_output[i] := sigmoid(hidden_input[i])
    NEXT

    FOR i := 1 TO 7
        predicted_output[i] := 0.0
        FOR j := 1 TO 10
            predicted_output[i] := predicted_output[i] + hidden_output[j] * weights_hidden_output[j, i]
        NEXT
        predicted_output[i] := predicted_output[i] + bias_output[i]
        predicted_output[i] := sigmoid(predicted_output[i])
    NEXT

PROCEDURE calculate_loss( predicted_output, true_output )
    LOCAL loss := 0.0

    FOR i := 1 TO 7
        loss := loss + 0.5 * ((predicted_output[i] - true_output[i]) ^ 2)
    NEXT

    RETURN loss

PROCEDURE backward_propagation( inputs, true_output, hidden_output, predicted_output, weights_hidden_output, weights_input_hidden, bias_hidden, bias_output)
    LOCAL output_error[7], output_delta[7]
    LOCAL hidden_error, hidden_delta
    
    FOR i := 1 TO 7
        output_error[i] := true_output[i] - predicted_output[i]
        output_delta[i] := output_error[i] * sigmoid_derivative(predicted_output[i])
    NEXT

    FOR i := 1 TO 10
        hidden_error := 0.0
        FOR j := 1 TO 7
            hidden_error := hidden_error + output_delta[j] * weights_hidden_output[i, j]
        NEXT

        hidden_delta := hidden_error * sigmoid_derivative(hidden_output[i])

        FOR j := 1 TO 12
            weights_input_hidden[j, i] := weights_input_hidden[j, i] + inputs[j] * hidden_delta * LEARNING_RATE
        NEXT
        bias_hidden[i] := bias_hidden[i] + hidden_delta * LEARNING_RATE

        FOR j := 1 TO 7
            weights_hidden_output[i, j] := weights_hidden_output[i, j] + hidden_output[i] * output_delta[j] * LEARNING_RATE
        NEXT
        // bias_output[i-1] := bias_output[i-1] + output_delta[i-1] * LEARNING_RATE
    NEXT

PROCEDURE train_neural_network( inputs, true_output )
    LOCAL weights_input_hidden[12, 10], weights_hidden_output[10, 7], bias_hidden[10], bias_output[7]
    LOCAL hidden_output[10], predicted_output[7], loss

    initialize_parameters(weights_input_hidden, weights_hidden_output, bias_hidden, bias_output)

    FOR epoch := 1 TO EPOCHS
        hidden_output = Array( 10 )
        predicted_output = Array( 7 )
       
        forward_propagation(inputs, weights_input_hidden, weights_hidden_output, bias_hidden, bias_output, @hidden_output, @predicted_output)

        loss := calculate_loss(predicted_output, true_output)

        backward_propagation(inputs, true_output, hidden_output, predicted_output, weights_hidden_output, weights_input_hidden, bias_hidden, bias_output)

        IF Mod(epoch, 100) == 0
            ? "Epoch", epoch, "Loss:", loss
        ENDIF
    NEXT

    ? "Training complete!"

RETURN

 
Epoch 100 Loss: 1.035
Epoch 200 Loss: 1.003
Epoch 300 Loss: 0.947
Epoch 400 Loss: 0.258
Epoch 500 Loss: 0.173
Epoch 600 Loss: 0.163
Epoch 700 Loss: 0.010
Epoch 800 Loss: 0.000
Epoch 900 Loss: 0.000
Epoch 1000 Loss: 0.000
Training complete!
Como se ve, el error va disminuyendo hasta hacerse cero
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply