Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema07-codigo

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
clase:iabd:pia:2eval:tema07-codigo [2024/10/12 12:31]
admin creado
clase:iabd:pia:2eval:tema07-codigo [2024/12/23 10:23] (actual)
admin
Línea 1: Línea 1:
-====== 7.Código ======+====== 7.Código ======
 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. 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.
  
Línea 102: Línea 102:
 Vemos la siguiente gráfica donde se muestran los puntos que hemos obtenido de la función ''get_puntos_descenso_gradiente'' Vemos la siguiente gráfica donde se muestran los puntos que hemos obtenido de la función ''get_puntos_descenso_gradiente''
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_1.png?direct |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_1.png?direct&500 |}}
  
  
Línea 112: Línea 112:
  
  
-==== Optimizadores de Keras ==== 
- Podemos mejorar nuestro código en Python haciendo que podamos usar directamente los [[https://keras.io/api/optimizers/|Optimizers]] de Keras y de esa forma ver como funciona cada uno de ellos. Para poder usarlos directamente vamos a creas las nuevas funciones ''loss_tf'' y ''get_puntos_descenso_gradiente_optimizer'' adecuadas a TensorFlow y Keras. 
  
- 
-<sxh python> 
-def loss_tf(w_0,w_1): 
-    return  3*(1 - w_0)**2 * tf.exp(-w_0**2 - (w_1 + 1)**2)  - 10*(w_0/5 - w_0**3 - w_1**5)*tf.exp(-w_0**2 - w_1**2) - 1./3*tf.exp(-(w_0 + 1)**2 - w_1**2)  
- 
-def get_puntos_descenso_gradiente_optimizer(epochs,optimizer_function,w_0_init,w_1_init): 
- 
-    puntos_descenso_gradiente=np.array([[w_0_init,w_1_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: loss_tf(var_w_0,w_1),  var_list=[var_w_0]) 
-        optimizer_function.minimize(lambda: loss_tf(w_0,var_w_1),  var_list=[var_w_1]) 
- 
-        w_0=var_w_0.numpy() 
-        w_1=var_w_1.numpy()       
- 
-        puntos_descenso_gradiente=np.append(puntos_descenso_gradiente,[[w_0,w_1]], axis=0)            
- 
-    return puntos_descenso_gradiente 
-</sxh> 
- 
-Lo que ha cambiado principalmente es la función ''get_puntos_descenso_gradiente_optimizer''  no hace cálculo  del gradiente (derivada) ni actualiza los parámetros, sino que llama a la función de Keras de optimización. 
- 
- 
-Si usamos ''get_puntos_descenso_gradiente_optimizer'' ahora con ''tf.keras.optimizers.SGD'' 
-<sxh python> 
-get_puntos_descenso_gradiente_optimizer(5,tf.keras.optimizers.SGD(learning_rate=0.03),-0.35,-0.67) 
-</sxh> 
-<sxh base> 
-array([[-0.35      , -0.67      ], 
-       [-0.269319  , -0.72470832], 
-       [-0.13292952, -0.83883744], 
-       [ 0.06544246, -1.06462073], 
-       [ 0.24086528, -1.40752137], 
-       [ 0.26578248, -1.59573841]]) 
-</sxh> 
-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,15)) 
-axes = figure.add_subplot() 
-plot_loss_function(axes) 
- 
-plot_descenso_gradiente(axes,get_puntos_descenso_gradiente_optimizer(5,tf.keras.optimizers.SGD(learning_rate=0.03),-0.35,-0.67)) 
-</sxh> 
- 
- 
-{{ :clase:iabd:pia:2eval:optimizer_sgd.png?direct |}} 
- 
-Y obviamente el resultado es el mismo 
  
clase/iabd/pia/2eval/tema07-codigo.1728729079.txt.gz · Última modificación: 2024/10/12 12:31 por admin