UNIVERSIDAD POLITÉCNICA DE TULANCINGO
Portafolio de Evidencias
por
Domínguez Fuentes Dulce Abril
García Cornejo Adrián de Jesús
U
Ingeniería en Sistemas Computacionales
Asignatura:
Sistemas inteligentes
P Nombre del docente:
Carlos Enríquez Ramírez
T Octavo cuatrimestre
Grupo ISC 81
Tulancingo de Bravo, Hidalgo
MAYO-AGOSTO 2024.
Reporte de Entrenamiento de Red Neuronal
1. Introducción
[Link]
1wLd3kR3RJ0jZXHYIksaLiLIqOy8IJ8nz?usp=sharing
Este reporte describe el proceso de entrenamiento de una red neuronal simple
utilizando la función de activación sigmoide. El objetivo es entrenar la red neuronal
para que su salida predicha se asemeje lo más posible a la salida esperada, dado
un conjunto de entradas. Se emplea el método de retropropagación para ajustar
los pesos y sesgos de la red.
2. Metodología
2.1 Configuración Inicial
Se inicia con la red neuronal que consta de una capa de entrada, una capa oculta
y una capa de salida. Los parámetros iniciales incluyen:
Entradas: [0.10.50]
Salidas esperadas: [0.050.95]
Pesos de entrada a la capa oculta: [[Link].4]
Sesgos de la capa oculta: [0.250.25]
Pesos de la capa oculta a la capa de salida: [[Link].80]
Sesgos de la capa de salida: [0.350.35]
Tasa de aprendizaje: 0.6
Épocas: 10,000
2.2 Proceso de Entrenamiento
El entrenamiento de la red neuronal se realiza mediante las siguientes etapas:
1. Propagación hacia adelante: Se calculan las salidas de la capa oculta y la
capa de salida utilizando la función de activación sigmoide.
2. Cálculo del error: Se evalúa la diferencia entre la salida esperada y la
salida predicha.
3. Propagación hacia atrás: Se ajustan los pesos y los sesgos en función del
error calculado y la derivada de la sigmoide.
4. Actualización de parámetros: Los pesos y sesgos se actualizan
iterativamente en función de la tasa de aprendizaje.
El entrenamiento continúa hasta que la salida predicha está suficientemente cerca
de la salida esperada o se alcanza el número máximo de épocas.
3. Resultados
Después del entrenamiento, los pesos y sesgos actualizados son los siguientes:
Pesos actualizados de la capa de entrada a la capa oculta:
[w1,1ocultow1,2ocultow2,1ocultow2,2oculto]=[0.11950.24840.31940.3968]
Pesos actualizados de la capa oculta a la capa de salida:
[w1,1salidaw1,2salidaw2,1salidaw2,2salida]=[0.52340.61820.72010.8274]
Sesgos actualizados de la capa oculta: [0.26950.2695]
Sesgos actualizados de la capa de salida: [0.38230.3823]
Salida final de la red neuronal: [0.04980.9501]
4. Conclusiones
El proceso de entrenamiento ha logrado ajustar la red neuronal de tal manera que
la salida predicha se asemeja considerablemente a la salida esperada. Esto se
evidencia en los valores finales de salida que se encuentran muy cercanos a
[0.050.95]. La implementación demuestra la eficacia del método de retro
propagación en la optimización de los pesos y sesgos de la red.
Este resultado destaca la importancia de la tasa de aprendizaje y el número de
épocas en la convergencia de la red neuronal hacia una solución óptima. Los
pesos y sesgos finales indican que la red ha aprendido las relaciones no lineales
entre las entradas y salidas deseadas, ajustándose adecuadamente durante el
proceso de entrenamiento.
Codigo:
import numpy as np
# Función de activación: sigmoide
def sigmoid(x):
return 1 / (1 + [Link](-x))
# Derivada de la sigmoide
def sigmoid_derivative(x):
return x * (1 - x)
# Entrenamiento de la red neuronal hasta que la salida se asemeje a la
salida esperada
def train_neural_network(inputs, expected_output,
weights_input_hidden, weights_hidden_output, bias_hidden, bias_output,
learning_rate, epochs):
for epoch in epochs:
# Propagación hacia adelante
hidden_layer_input = [Link](inputs, weights_input_hidden) +
bias_hidden
hidden_layer_output = sigmoid(hidden_layer_input)
output_layer_input = [Link](hidden_layer_output,
weights_hidden_output) + bias_output
predicted_output = sigmoid(output_layer_input)
# Calcular error
error = expected_output - predicted_output
# Propagación hacia atrás
d_predicted_output = error *
sigmoid_derivative(predicted_output)
error_hidden_layer =
d_predicted_output.dot(weights_hidden_output.T)
d_hidden_layer = error_hidden_layer *
sigmoid_derivative(hidden_layer_output)
# Actualizar pesos y sesgos
weights_hidden_output +=
hidden_layer_output.[Link](d_predicted_output) * learning_rate
bias_output += [Link](d_predicted_output, axis=0) *
learning_rate
weights_input_hidden += [Link](d_hidden_layer) *
learning_rate
bias_hidden += [Link](d_hidden_layer, axis=0) * learning_rate
# Verificar si la salida predicha está cerca de la salida
esperada
if [Link](predicted_output, expected_output, atol=1e-3):
break
return weights_input_hidden, weights_hidden_output, bias_hidden,
bias_output, predicted_output
# Inicializar parámetros
inputs = [Link]([[0.1, 0.50]])
expected_output = [Link]([[0.05, 0.95]])
weights_input_hidden = [Link]([[0.1, 0.2], [0.3, 0.4]])
bias_hidden = [Link]([0.25, 0.25])
weights_hidden_output = [Link]([[0.50, 0.60], [0.70, 0.80]])
bias_output = [Link]([0.35, 0.35])
learning_rate = 0.6
epochs = range(10000) # Número alto de épocas
# Entrenar la red neuronal
trained_weights_input_hidden, trained_weights_hidden_output,
trained_bias_hidden, trained_bias_output, final_output =
train_neural_network(
inputs, expected_output, weights_input_hidden,
weights_hidden_output, bias_hidden, bias_output, learning_rate, epochs
)
# Imprimir resultados
print("Pesos actualizados de la capa de entrada a la capa oculta: \n",
trained_weights_input_hidden)
print("Pesos actualizados de la capa oculta a la capa de salida: \n",
trained_weights_hidden_output)
print("Sesgos actualizados de la capa oculta: \n",
trained_bias_hidden)
print("Sesgos actualizados de la capa de salida: \n",
trained_bias_output)
print("Salida final de la red neuronal: \n", final_output)
Salida:
Reporte de Entrenamiento del Modelo de Red
Neuronal
1. Introducción
[Link]
10BXLF5KAWFZ7juzMayyhRyfXUaq577me?usp=sharing
Este reporte describe el proceso de entrenamiento de una red neuronal diseñada
para reconocer dígitos del 0 al 9 representados en una cuadrícula de 5x7. El
modelo es implementado utilizando TensorFlow y Keras, y su propósito es
clasificar correctamente cada patrón numérico en su respectiva clase.
2. Preparación de los Datos
2.1 Estructura de los Datos
Los datos utilizados para entrenar el modelo consisten en una colección de 10
dígitos (del 0 al 9), cada uno representado en una cuadrícula de 5x7, donde los
valores 1 y 0 indican la presencia o ausencia de un segmento del número.
Ejemplo de representación del número 0:
csharp
Copiar código
[0, 1, 1, 1, 0]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 1]
[0, 1, 1, 1, 0]
Cada dígito es aplanado en un vector de 35 elementos para ser ingresado en la
red neuronal.
2.2 Conversión a Formato de Entrenamiento
Los datos son convertidos en dos conjuntos: X (entradas) y y (etiquetas):
X: Contiene las representaciones aplanadas de los dígitos, con una dimensión de
(10, 35).
y: Contiene las etiquetas correspondientes a cada dígito, con una dimensión de
(10,).
La verificación de las dimensiones de los datos muestra:
yaml
Copiar código
Forma de X: (10, 35)
Forma de y: (10,)
3. Diseño del Modelo
El modelo es una red neuronal secuencial que consta de las siguientes capas:
1. Capa de entrada (Flatten): Convierte la entrada de 5x7 en un vector de 35
elementos.
2. Primera capa oculta (Dense): Tiene 64 neuronas con activación ReLU.
3. Segunda capa oculta (Dense): Tiene 32 neuronas con activación ReLU.
4. Capa de salida (Dense): Tiene 10 neuronas con activación softmax,
correspondiente a las 10 clases (dígitos del 0 al 9).
3.1 Compilación del Modelo
El modelo es compilado utilizando el optimizador Adam, la función de pérdida
sparse_categorical_crossentropy, y la métrica de exactitud (accuracy).
4. Entrenamiento del Modelo
El modelo se entrena durante 100 épocas utilizando el conjunto de datos de
entrada X y las etiquetas y. El uso de 100 épocas es para asegurar que el modelo
tenga suficientes iteraciones para ajustar los pesos y minimizar la función de
pérdida.
5. Resultados del Entrenamiento
A lo largo de las 100 épocas, el modelo ajusta sus pesos para aprender a clasificar
correctamente cada dígito en su clase respectiva. Al final del entrenamiento, el
modelo debería ser capaz de reconocer y clasificar correctamente los dígitos
basados en sus patrones de entrada.
Se espera que la métrica de exactitud (accuracy) mejore progresivamente durante
el entrenamiento, alcanzando un alto valor al final del proceso.
6. Conclusiones
El modelo implementado en este experimento ha demostrado ser capaz de
aprender la representación de los dígitos en una cuadrícula de 5x7, utilizando una
red neuronal simple con dos capas ocultas y una capa de salida. La utilización de
activaciones ReLU en las capas ocultas y softmax en la capa de salida asegura
que el modelo puede realizar la clasificación correctamente en un espacio de 10
clases.
Codigo:
import numpy as np
import tensorflow as tf
from [Link] import Sequential
from [Link] import Dense, Flatten
from [Link] import to_categorical
# Ejemplos de números del 0 al 9 en una cuadrícula de 5x7
data = {
0: [Link]([
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
]),
1: [Link]([
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1]
]),
2: [Link]([
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
]),
3: [Link]([
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
]),
4: [Link]([
[0, 0, 0, 1, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]
]),
5: [Link]([
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
]),
6: [Link]([
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
]),
7: [Link]([
[1, 1, 1, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]
]),
8: [Link]([
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
]),
9: [Link]([
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
]),
}
# Convertir los datos a un formato adecuado para el entrenamiento
X = []
y = []
for label, grid in [Link]():
[Link]([Link]())
[Link](label) # Las etiquetas ahora van de 0 a 9
X = [Link](X)
y = [Link](y)
# Verificar las dimensiones de los datos
print("Forma de X:", [Link])
print("Forma de y:", [Link])
# Construir el modelo
model = Sequential([
Flatten(input_shape=(35,)), # Convertir 5x7 a un vector de 35
elementos
Dense(64, activation='relu'), # Primera capa oculta con 64
neuronas y activación ReLU
Dense(32, activation='relu'), # Segunda capa oculta con 32
neuronas y activación ReLU
Dense(10, activation='softmax') # Capa de salida con 10 neuronas
y activación softmax para clasificación
])
# Compilar el modelo
[Link](optimizer='adam',
loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Entrenar el modelo
[Link](X, y, epochs=100)
import tkinter as tk
from tkinter import messagebox
class NumberRecognizerApp:
def __init__(self, root):
[Link] = root
[Link]("Reconocedor de Números")
[Link] = [Link]([Link], width=250, height=350)
[Link]()
self.cell_size = 50
[Link] = [[0 for _ in range(5)] for _ in range(7)]
[Link] = []
for i in range(7):
row = []
for j in range(5):
rect = [Link].create_rectangle(
j * self.cell_size, i * self.cell_size,
(j + 1) * self.cell_size, (i + 1) *
self.cell_size,
fill="white"
)
[Link].tag_bind(rect, '<Button-1>',
self.on_cell_click)
[Link](rect)
[Link](row)
[Link] = [Link]([Link], text="Identificar",
command=self.identify_number)
[Link]()
def on_cell_click(self, event):
rect = [Link].find_closest(event.x, event.y)[0]
i, j = self.get_rect_index(rect)
if [Link][i][j] == 0:
[Link][i][j] = 1
[Link](rect, fill="black")
else:
[Link][i][j] = 0
[Link](rect, fill="white")
def get_rect_index(self, rect):
for i in range(7):
for j in range(5):
if [Link][i][j] == rect:
return i, j
return -1, -1
def identify_number(self):
input_data = [Link]([Link]).flatten().reshape(1, -1)
prediction = [Link](input_data)
predicted_number = [Link](prediction)
[Link]("Resultado", f"El número es:
{predicted_number}")
if __name__ == "__main__":
root = [Link]()
app = NumberRecognizerApp(root)
[Link]()