Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa Próxima revisión Ambos lados, revisión siguiente | ||
clase:iabd:pia:2eval:tema07-apendices [2022/03/17 19:31] admin |
clase:iabd:pia:2eval:tema07-apendices [2024/03/19 13:56] admin [Creación de los gráficos del descenso de gradiente] |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== 7. Entrenamiento de redes neuronales | + | ====== 7. Entrenamiento de redes neuronales |
===== Tipos de funciones de coste ===== | ===== Tipos de funciones de coste ===== | ||
Línea 53: | Línea 53: | ||
Con backpropagation acabamos de ver el orden en el que se calculan los parámetros de cada neurona y a continuación vamos a ver con el descenso de gradiente como calculamos los parámetros de una neurona. | Con backpropagation acabamos de ver el orden en el que se calculan los parámetros de cada neurona y a continuación vamos a ver con el descenso de gradiente como calculamos los parámetros de una neurona. | ||
- | Mas información: | + | Junto con el backpropagation |
+ | |||
+ | En los siguientes videos está explicado perfectamente el backpropagation y la //chain rule//: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | ===== Creación de los gráficos del descenso de gradiente ===== | ||
+ | Durante el tema hemos visto los gráficos que explican el descenso de gradiente. Veamos ahora como se pueden hacer dichos gráficos en Python. | ||
+ | |||
+ | La función que coste que hemos usado es la siguiente | ||
+ | |||
+ | $$ | ||
+ | loss(w_0, | ||
+ | $$ | ||
+ | |||
+ | cuya gráfica es la siguiente: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | En python la función $loss(w_0, | ||
+ | |||
+ | <sxh python> | ||
+ | def loss(w_0, | ||
+ | return | ||
+ | </ | ||
+ | |||
+ | Y el algoritmo que calcula cada uno de los $w_0,w_1$ del descenso de gradiente es el siguiente: | ||
+ | |||
+ | <sxh python> | ||
+ | def get_puntos_descenso_gradiente(epochs, | ||
+ | |||
+ | w_0=w_0_original | ||
+ | w_1=w_1_original | ||
+ | |||
+ | puntos_descenso_gradiente=np.array([[w_0, | ||
+ | | ||
+ | for epoch in range(epochs): | ||
+ | h=0.00001 | ||
+ | | ||
+ | gradiente_w_0=(loss(w_0+h, | ||
+ | gradiente_w_1=(loss(w_0, | ||
+ | |||
+ | #Nuevos valores de los pesos | ||
+ | w_0=w_0-learning_rate*gradiente_w_0 | ||
+ | w_1=w_1-learning_rate*gradiente_w_1 | ||
+ | |||
+ | puntos_descenso_gradiente=np.append(puntos_descenso_gradiente, | ||
+ | |||
+ | return puntos_descenso_gradiente | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Si ejecutamos lo siguiente: | ||
+ | <sxh python> | ||
+ | get_puntos_descenso_gradiente(5, | ||
+ | </ | ||
+ | |||
+ | El resultado es: | ||
+ | <sxh base> | ||
+ | array([[-0.35 | ||
+ | | ||
+ | | ||
+ | [ 0.0654496 , -1.06459902], | ||
+ | [ 0.24087009, -1.40749396], | ||
+ | [ 0.2657862 , -1.59573582]]) | ||
+ | </ | ||
+ | |||
+ | Que son cada uno de los valores de $w_0,w_1$ que empiezan en '' | ||
+ | |||
+ | Pasamos ahora a mostrar los valores dentro de la gráfica de la función, para ello hemos creado 2 funciones: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | <sxh python> | ||
+ | def plot_loss_function(axes, | ||
+ | rango_w_0=np.linspace(-3, | ||
+ | rango_w_1=np.linspace(-3, | ||
+ | rango_w_0, | ||
+ | loss=loss_function(rango_w_0, | ||
+ | |||
+ | axes.contourf(rango_w_0, | ||
+ | axes.set_xlabel(' | ||
+ | axes.set_ylabel(' | ||
+ | axes.set_title(title) | ||
+ | |||
+ | |||
+ | def plot_descenso_gradiente(axes, | ||
+ | axes.scatter(puntos_descenso_gradiente[1: | ||
+ | axes.plot(puntos_descenso_gradiente[:, | ||
+ | axes.plot(puntos_descenso_gradiente[0, | ||
+ | axes.plot(puntos_descenso_gradiente[-1, | ||
+ | |||
+ | </ | ||
+ | |||
+ | Si ejecutamos el código: | ||
+ | |||
+ | <sxh python> | ||
+ | figure=plt.figure(figsize=(16, | ||
+ | axes = figure.add_subplot() | ||
+ | plot_loss_function(axes) | ||
+ | |||
+ | plot_descenso_gradiente(axes, | ||
+ | </ | ||
+ | |||
+ | Vemos la siguiente gráfica donde se muestran los puntos que hemos obtenido de la función '' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | < | ||
+ | * La estrella roja es desde donde empieza el algoritmo.Es decir, el valor inicial de los parámetros $w_0,w_1$ | ||
+ | * La estrella azul es donde acaba el algoritmo.Es decir, el valor tras el entrenamiento de los parámetros $w_0,w_1$ | ||
+ | * Los puntos amarillo son los //pasos// por lo que se va moviendo el algoritmo. Cada uno de los valores intermedios de los parámetros durante el entrenamiento. | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Optimizadores de Keras ==== | ||
+ | | ||
+ | |||
+ | |||
+ | <sxh python> | ||
+ | def loss_tf(w_0, | ||
+ | return | ||
+ | |||
+ | def get_puntos_descenso_gradiente_optimizer(epochs, | ||
+ | |||
+ | puntos_descenso_gradiente=np.array([[w_0_init, | ||
+ | |||
+ | w_0=w_0_init | ||
+ | w_1=w_1_init | ||
+ | for epoch in range(epochs): | ||
+ | var_w_0=tf.Variable(w_0) | ||
+ | var_w_1=tf.Variable(w_1) | ||
+ | |||
+ | optimizer_function.minimize(lambda: | ||
+ | optimizer_function.minimize(lambda: | ||
+ | |||
+ | w_0=var_w_0.numpy() | ||
+ | w_1=var_w_1.numpy() | ||
+ | |||
+ | puntos_descenso_gradiente=np.append(puntos_descenso_gradiente, | ||
+ | |||
+ | return puntos_descenso_gradiente | ||
+ | </ | ||
+ | |||
+ | Lo que ha cambiado principalmente es la función '' | ||
+ | |||
+ | |||
+ | Si usamos '' | ||
+ | <sxh python> | ||
+ | get_puntos_descenso_gradiente_optimizer(5, | ||
+ | </ | ||
+ | <sxh base> | ||
+ | array([[-0.35 | ||
+ | | ||
+ | | ||
+ | [ 0.06544246, -1.06462073], | ||
+ | [ 0.24086528, -1.40752137], | ||
+ | [ 0.26578248, -1.59573841]]) | ||
+ | </ | ||
+ | Vamos que el resultado es prácticamente el mismo que cuando lo hicimos manualmente. | ||
+ | |||
+ | Y podemos generar de la misma forma el gráfico: | ||
+ | <sxh python> | ||
+ | figure=plt.figure(figsize=(16, | ||
+ | axes = figure.add_subplot() | ||
+ | plot_loss_function(axes) | ||
+ | |||
+ | plot_descenso_gradiente(axes, | ||
+ | </ | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | Y obviamente el resultado es el mismo | ||
+ | |||
+ | ===== Otras métricas ===== | ||