Código de Python - Red Neuronal sólo con Numpy.

Imágen de perfil

Red Neuronal sólo con Numpy.gráfica de visualizaciones


Python

Publicado el 16 de Mayo del 2024 por Hilario (127 códigos)
243 visualizaciones desde el 16 de Mayo del 2024
Aula_28_Recordatorio_Mayo.py
************************************

Bien, dada una matriz, con 8 característica, y 20 muestras.
Como la siguiente:

[[1.234 0.567 2.345 1.890 0.123 3.456 2.345 1.234]
[0.987 1.234 1.890 0.345 2.567 0.890 1.234 2.345]
[3.456 1.890 0.567 2.345 1.234 0.890 2.567 1.890]
[2.567 1.890 0.123 1.234 2.345 0.567 1.890 3.456]
[0.890 1.890 2.345 0.567 1.234 3.456 0.890 1.234]
[1.890 2.345 1.234 0.567 2.345 0.123 1.234 0.567]
[1.234 2.345 0.567 1.890 0.123 2.567 0.890 1.234]
[2.345 1.890 3.456 0.890 1.234 0.567 1.890 2.567]
[0.567 1.234 1.890 0.567 1.234 0.890 2.345 0.123]
[0.890 1.890 0.123 1.234 0.567 3.456 1.234 1.890]
[1.890 0.567 1.234 0.890 2.567 1.234 2.345 0.567]
[1.234 2.567 0.890 1.890 0.123 1.890 0.567 1.234]
[0.567 1.234 2.345 1.890 0.567 2.345 1.234 0.890]
[1.890 0.123 1.234 0.567 2.345 1.890 0.567 1.234]
[0.890 1.234 0.567 1.890 1.234 2.345 3.456 0.890]
[1.234 0.567 2.345 0.890 2.345 1.234 0.567 1.890]
[2.567 1.890 0.890 1.234 0.567 1.890 2.345 0.123]
[0.567 2.345 1.234 0.567 1.890 0.123 1.890 0.567]
[1.234 1.890 0.567 3.456 2.567 1.234 0.890 1.234]
[0.567 2.345 1.234 0.890 1.890 0.567 1.234 2.567]]


Planteamos una red neuronal sin utilizar ni keras ni tensorflow. Que entrena la red con esos valores, de 8 características, y 20 muestras o ejemplos.
Y que haga una prediccion de salida de la caracteristica correspondientes, a esta muestra dada:[1.345 2.890 0.456 1.890 12.234 10.567 1.890 12.567].

El ejercicio, tendría básicamente estos pasos:

1-Definición de funciones de activación y pérdida:
*******************************************************
Se define la función de activación ReLU (relu) y su derivada (relu_derivative).
ReLU es una función de activación comúnmente utilizada en redes neuronales debido a su simplicidad y buen desempeño en muchas tareas.
Se define la función de pérdida de error cuadrático medio (mean_squared_error).
Esta función calcula la diferencia cuadrática media entre las predicciones y las etiquetas verdaderas.

2-Implementación de la red neuronal:
*****************************************
Se crea una clase NeuralNetwork que representa una red neuronal de dos capas (una capa oculta y una capa de salida).
En el método __init__, se inicializan los pesos y sesgos de la red neuronal de manera aleatoria.
En el método forward, se realiza la propagación hacia adelante, calculando las salidas de la red neuronal.
En el método backward, se realiza la retropropagación del error, calculando los gradientes de los pesos y sesgos y actualizándolos utilizando el algoritmo de descenso de gradiente.
El método train entrena la red neuronal utilizando los datos de entrada y las etiquetas verdaderas durante un número específico de épocas.
El método predict realiza predicciones utilizando la red neuronal entrenada.

3-Entrenamiento de la red neuronal:
********************************
Se definen los datos de entrada (X_train) y las etiquetas verdaderas (y_train).
Los datos se normalizan dividiéndolos por su máximo valor para asegurar que estén en el rango [0, 1].
Se crea una instancia de la red neuronal con el tamaño de entrada, tamaño oculto y tamaño de salida dados.
La red neuronal se entrena utilizando los datos de entrenamiento durante 10000 épocas con una tasa de aprendizaje de 0.01.

4-Predicción:
*****************
Se define un nuevo conjunto de datos de entrada (X_new) para realizar una predicción.
Los datos de entrada se normalizan de la misma manera que los datos de entrenamiento.
Se realiza una predicción utilizando la red neuronal entrenada.
El resultado de la predicción se desnormaliza multiplicándolo por el máximo valor de las etiquetas verdaderas.
Se muestra el resultado de la predicción.

Según vemos su desarrollo podemos decir, que este ejercicio muestra cómo implementar una red neuronal básica desde cero en Python sin utilizar bibliotecas como Keras o TensorFlow. La red neuronal se entrena utilizando el algoritmo de retropropagación y se prueba haciendo una predicción sobre nuevos datos de entrada.

El alumno podrá interactuar con el ejercicio, modificando parametros como
valores de entrada, caracteristicas y muestras, para su mejor comprensión.



UNA SALIDA DEL EJERCICIO, PODRÍA SER LA SIGUIENTE:
****************************************************************************
Epoch 0, Loss: 11.7756050562224
Epoch 1000, Loss: 0.012417106163412383
Epoch 2000, Loss: 0.004855440981664029
Epoch 3000, Loss: 0.002804630823301262
Epoch 4000, Loss: 0.0019105925868362645
Epoch 5000, Loss: 0.0013765944597636112
Epoch 6000, Loss: 0.0010168157428455883
Epoch 7000, Loss: 0.0007730551039343544
Epoch 8000, Loss: 0.0006225694864747496
Epoch 9000, Loss: 0.0005176777148262488
Predicción de salida: [[-0.55685326 -0.9034264 -1.02152184 0.87943007 0.40507882 1.91684935
0.28005875 2.23286946]]
[Finished in 701ms]

***********************************************************************
El ejercicio fue realizado bajo plataforma linux.
Ubuntu 20.04.6 LTS.
Editado con Sublime text.
Ejecución:
python3 Aula_28_Recordatorio_Mayo.py
***********************************************************************

Requerimientos

***********************************************************************
El ejercicio fue realizado bajo plataforma linux.
Ubuntu 20.04.6 LTS.
Editado con Sublime text.
Ejecución:
python3 Aula_28_Recordatorio_Mayo.py
***********************************************************************

V-0

Publicado el 16 de Mayo del 2024gráfica de visualizaciones de la versión: V-0
243 visualizaciones desde el 16 de Mayo del 2024
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#Ejecución bajo consola linux
#python3 Aula_28_Recordatorio_Mayo.py
 
import numpy as np
 
def relu(x):
    return np.maximum(0, x)
 
def relu_derivative(x):
    return np.where(x > 0, 1, 0)
 
def mean_squared_error(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)
class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
 
        # Inicialización de pesos y sesgos
        self.W1 = np.random.randn(self.input_size, self.hidden_size)
        self.b1 = np.zeros((1, self.hidden_size))
        self.W2 = np.random.randn(self.hidden_size, self.output_size)
        self.b2 = np.zeros((1, self.output_size))
 
    def forward(self, X):
        # Propagación hacia adelante
        self.z1 = np.dot(X, self.W1) + self.b1
        self.a1 = relu(self.z1)
        self.z2 = np.dot(self.a1, self.W2) + self.b2
        self.output = self.z2
 
        return self.output
 
    def backward(self, X, y, learning_rate):
        # Retropropagación
        m = X.shape[0]
 
        # Gradiente de la capa de salida
        dL_dz2 = (1/m) * (self.output - y)
        dL_dW2 = np.dot(self.a1.T, dL_dz2)
        dL_db2 = np.sum(dL_dz2, axis=0, keepdims=True)
 
        # Gradiente de la capa oculta
        dL_da1 = np.dot(dL_dz2, self.W2.T)
        dL_dz1 = dL_da1 * relu_derivative(self.z1)
        dL_dW1 = np.dot(X.T, dL_dz1)
        dL_db1 = np.sum(dL_dz1, axis=0, keepdims=True)
 
        # Actualización de pesos y sesgos
        self.W1 -= learning_rate * dL_dW1
        self.b1 -= learning_rate * dL_db1
        self.W2 -= learning_rate * dL_dW2
        self.b2 -= learning_rate * dL_db2
 
    def train(self, X, y, epochs, learning_rate):
        for epoch in range(epochs):
            output = self.forward(X)
            loss = mean_squared_error(y, output)
            self.backward(X, y, learning_rate)
 
            if epoch % 1000 == 0:
                print(f'Epoch {epoch}, Loss: {loss}')
 
    def predict(self, X):
        return self.forward(X)
# Datos de entrada y salida
X_train = np.array([[ 1.234,  0.567,  2.345,  1.890,  0.123,  3.456,  2.345,  1.234],
                    [ 0.987,  1.234,  1.890,  0.345,  2.567,  0.890,  1.234,  2.345],
                    [ 3.456,  1.890,  0.567,  2.345,  1.234,  0.890,  2.567,  1.890],
                    [ 2.567,  1.890,  0.123,  1.234,  2.345,  0.567,  1.890,  3.456],
                    [ 0.890,  1.890,  2.345,  0.567,  1.234,  3.456,  0.890,  1.234],
                    [ 1.890,  2.345,  1.234,  0.567,  2.345,  0.123,  1.234,  0.567],
                    [ 1.234,  2.345,  0.567,  1.890,  0.123,  2.567,  0.890,  1.234],
                    [ 2.345,  1.890,  3.456,  0.890,  1.234,  0.567,  1.890,  2.567],
                    [ 0.567,  1.234,  1.890,  0.567,  1.234,  0.890,  2.345,  0.123],
                    [ 0.890,  1.890,  0.123,  1.234,  0.567,  3.456,  1.234,  1.890],
                    [ 1.890,  0.567,  1.234,  0.890,  2.567,  1.234,  2.345,  0.567],
                    [ 1.234,  2.567,  0.890,  1.890,  0.123,  1.890,  0.567,  1.234],
                    [ 0.567,  1.234,  2.345,  1.890,  0.567,  2.345,  1.234,  0.890],
                    [ 1.890,  0.123,  1.234,  0.567,  2.345,  1.890,  0.567,  1.234],
                    [ 0.890,  1.234,  0.567,  1.890,  1.234,  2.345,  3.456,  0.890],
                    [ 1.234,  0.567,  2.345,  0.890,  2.345,  1.234,  0.567,  1.890],
                    [ 2.567,  1.890,  0.890,  1.234,  0.567,  1.890,  2.345,  0.123],
                    [ 0.567,  2.345,  1.234,  0.567,  1.890,  0.123,  1.890,  0.567],
                    [ 1.234,  1.890,  0.567,  3.456,  2.567,  1.234,  0.890,  1.234],
                    [ 0.567,  2.345,  1.234,  0.890,  1.890,  0.567,  1.234,  2.567]])
 
y_train = np.array([[1.345, 2.890, 0.456, 1.890, 12.234, 10.567, 1.890, 12.567]])
 
# Normalización de los datos
X_train /= np.max(X_train)
y_train /= np.max(y_train)
 
# Creación y entrenamiento de la red neuronal
input_size = X_train.shape[1]
hidden_size = 10
output_size = y_train.shape[1]
 
nn = NeuralNetwork(input_size, hidden_size, output_size)
nn.train(X_train, y_train, epochs=10000, learning_rate=0.01)
 
# Realizar la predicción
X_new = np.array([[1.345, 2.890, 0.456, 1.890, 12.234, 10.567, 1.890, 12.567]])
X_new /= np.max(X_new)
prediction = nn.predict(X_new)
prediction *= np.max(y_train)
 
print("Predicción de salida:", prediction)



Comentarios sobre la versión: V-0 (0)


No hay comentarios
 

Comentar la versión: V-0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s7509