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.backpropagation_descenso_gradiente [2023/04/20 13:58] admin [Ejercicios] |
clase:iabd:pia:2eval:tema07.backpropagation_descenso_gradiente [2024/02/22 11:51] admin [Ejercicios] |
||
---|---|---|---|
Línea 658: | Línea 658: | ||
Más información: | Más información: | ||
* [[https:// | * [[https:// | ||
+ | * {{ : | ||
Línea 684: | Línea 685: | ||
Más información: | Más información: | ||
* [[https:// | * [[https:// | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | En nuestros proyectos, solemos necesitar mostrar por pantalla el optimizador que estamos usando y normalmente pasa ésto: | ||
+ | |||
+ | <sxh python> | ||
+ | print(tf.keras.optimizers.Adam(learning_rate=0.001)) | ||
+ | print(tf.keras.optimizers.Adamax(learning_rate=0.00000001)) | ||
+ | </ | ||
+ | |||
+ | <sxh base> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | Pero hay un truco para que se muestre de forma más amigable, que es sobre escribir la función '' | ||
+ | |||
+ | <sxh python> | ||
+ | tf.keras.optimizers.Optimizer.__str__=lambda self: f' | ||
+ | </ | ||
+ | |||
+ | Y si volvemos a ejecutar de nuevo el código: | ||
+ | |||
+ | <sxh python> | ||
+ | print(tf.keras.optimizers.Adam(learning_rate=0.001)) | ||
+ | print(tf.keras.optimizers.Adamax(learning_rate=0.00000001)) | ||
+ | </ | ||
+ | |||
+ | <sxh base> | ||
+ | Adam lr=0.001 | ||
+ | Adamax lr=0.00000001 | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
Línea 761: | Línea 797: | ||
- | Indica para cada parámetro | + | Indica para cada parámetro: Si la función crece o decrece, el valor de su derivada (positiva o negativa) |
==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
Línea 779: | Línea 815: | ||
<sxh python> | <sxh python> | ||
#Código base de varios ejercicios. | #Código base de varios ejercicios. | ||
+ | |||
import numpy as np | import numpy as np | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
Línea 785: | Línea 821: | ||
from matplotlib.ticker import MaxNLocator | from matplotlib.ticker import MaxNLocator | ||
from matplotlib.ticker import MultipleLocator | from matplotlib.ticker import MultipleLocator | ||
+ | |||
def sigmoid(z): | def sigmoid(z): | ||
return 1/(1 + np.exp(-z)) | return 1/(1 + np.exp(-z)) | ||
- | + | | |
def predict_formula(x, | def predict_formula(x, | ||
return sigmoid(w*x+b) | return sigmoid(w*x+b) | ||
- | + | ||
+ | |||
def loss_mae(y_true, | def loss_mae(y_true, | ||
error=np.abs(np.subtract(y_true, | error=np.abs(np.subtract(y_true, | ||
mean_error=np.sum(error)/ | mean_error=np.sum(error)/ | ||
- | + | | |
return mean_error | return mean_error | ||
- | + | ||
- | + | ||
- | + | ||
def loss(x, | def loss(x, | ||
y_pred=predict_formula(x, | y_pred=predict_formula(x, | ||
- | | + | |
return loss_mae(y_true, | return loss_mae(y_true, | ||
- | + | ||
+ | |||
def plot_loss(x, | def plot_loss(x, | ||
axes.set_ylim(ymin=0.0, | axes.set_ylim(ymin=0.0, | ||
Línea 813: | Línea 849: | ||
axes.set_xlabel(xlabel) | axes.set_xlabel(xlabel) | ||
axes.set_ylabel(' | axes.set_ylabel(' | ||
+ | |||
axes.vlines(x = valor_parametro_inicial, | axes.vlines(x = valor_parametro_inicial, | ||
axes.text(valor_parametro_inicial+0.1, | axes.text(valor_parametro_inicial+0.1, | ||
- | + | ||
+ | |||
min_x=rango[np.argmin(perdidas)] | min_x=rango[np.argmin(perdidas)] | ||
min_y=np.min(perdidas) | min_y=np.min(perdidas) | ||
axes.vlines(x = min_x, ymin = 0, ymax = min_y, | axes.vlines(x = min_x, ymin = 0, ymax = min_y, | ||
axes.text(min_x+0.1, | axes.text(min_x+0.1, | ||
- | + | ||
- | + | | |
def plot_simple_metrics(axes, | def plot_simple_metrics(axes, | ||
+ | |||
axes.plot(history, | axes.plot(history, | ||
+ | |||
axes.set_xlabel(' | axes.set_xlabel(' | ||
axes.xaxis.set_major_locator(MaxNLocator(integer=True)) | axes.xaxis.set_major_locator(MaxNLocator(integer=True)) | ||
+ | |||
axes.set_ylabel(' | axes.set_ylabel(' | ||
axes.set_ylim(ymin=0, | axes.set_ylim(ymin=0, | ||
axes.yaxis.set_major_locator(MultipleLocator(0.1)) | axes.yaxis.set_major_locator(MultipleLocator(0.1)) | ||
+ | |||
axes.set_title(title) | axes.set_title(title) | ||
axes.set_facecolor("# | axes.set_facecolor("# | ||
axes.grid(visible=True, | axes.grid(visible=True, | ||
axes.legend() | axes.legend() | ||
- | + | ||
+ | |||
def plot_losses(x, | def plot_losses(x, | ||
perdida_original=loss(x, | perdida_original=loss(x, | ||
- | + | ||
+ | | ||
subfigure.suptitle(f' | subfigure.suptitle(f' | ||
+ | |||
axes_w=subfigure.add_subplot(1, | axes_w=subfigure.add_subplot(1, | ||
axes_b=subfigure.add_subplot(1, | axes_b=subfigure.add_subplot(1, | ||
- | + | ||
- | rango=np.linspace(-4,4,400) | + | rango=np.linspace(-5,5,400) |
perdidas_w=[] | perdidas_w=[] | ||
perdidas_b=[] | perdidas_b=[] | ||
+ | |||
for parametro in rango: | for parametro in rango: | ||
perdidas_w.append(loss(x, | perdidas_w.append(loss(x, | ||
perdidas_b.append(loss(x, | perdidas_b.append(loss(x, | ||
- | + | ||
+ | |||
plot_loss(x, | plot_loss(x, | ||
plot_loss(x, | plot_loss(x, | ||
+ | |||
return perdida_original | return perdida_original | ||
+ | |||
+ | def plot_evolucion_parametros(axes, | ||
+ | axes.plot(ws, | ||
+ | axes.plot(bs, | ||
+ | |||
+ | axes.set_xlabel(' | ||
+ | axes.xaxis.set_major_locator(MaxNLocator(integer=True)) | ||
+ | |||
+ | axes.set_ylabel(' | ||
+ | axes.set_ylim(ymin=-5, | ||
+ | axes.yaxis.set_major_locator(MultipleLocator(1)) | ||
+ | |||
+ | axes.set_title(" | ||
+ | axes.set_facecolor("# | ||
+ | axes.grid(visible=True, | ||
+ | axes.legend() | ||
+ | |||
def plot_parametros(x, | def plot_parametros(x, | ||
- | figure=plt.figure(figsize=(8, | + | figure=plt.figure(figsize=(8, |
figure.suptitle(" | figure.suptitle(" | ||
subfigures = figure.subfigures(nrows=len(parametros)+1, | subfigures = figure.subfigures(nrows=len(parametros)+1, | ||
+ | ws=[] | ||
+ | bs=[] | ||
history=[] | history=[] | ||
for index,(w,b) in enumerate(parametros): | for index,(w,b) in enumerate(parametros): | ||
- | | + | subfigure=subfigures[index] |
- | | + | |
- | else: | + | |
- | subfigure=subfigures | + | |
loss=plot_losses(x, | loss=plot_losses(x, | ||
+ | ws.append(w) | ||
+ | bs.append(b) | ||
history.append(loss) | history.append(loss) | ||
+ | |||
axes=subfigures[-1].add_subplot(1, | axes=subfigures[-1].add_subplot(1, | ||
plot_simple_metrics(axes, | plot_simple_metrics(axes, | ||
- | + | axes=subfigures[-1].add_subplot(1, | |
+ | plot_evolucion_parametros(axes, | ||
+ | |||
def descenso_gradiente(x, | def descenso_gradiente(x, | ||
h=0.000003 | h=0.000003 | ||
- | + | | |
gradiente_w =(loss(x, | gradiente_w =(loss(x, | ||
gradiente_b =(loss(x, | gradiente_b =(loss(x, | ||
+ | |||
w=w-learning_rate*gradiente_w | w=w-learning_rate*gradiente_w | ||
b=b-learning_rate*gradiente_b | b=b-learning_rate*gradiente_b | ||
return w,b | return w,b | ||
- | + | ||
+ | |||
def plot_descenso_gradiente(x, | def plot_descenso_gradiente(x, | ||
figure=plt.figure(figsize=(8, | figure=plt.figure(figsize=(8, | ||
figure.suptitle(" | figure.suptitle(" | ||
+ | |||
subfigures = figure.subfigures(nrows=epochs+1, | subfigures = figure.subfigures(nrows=epochs+1, | ||
w=w_inicial | w=w_inicial | ||
b=b_inicial | b=b_inicial | ||
+ | |||
+ | ws=[] | ||
+ | bs=[] | ||
history=[] | history=[] | ||
for epoch in range(epochs): | for epoch in range(epochs): | ||
Línea 908: | Línea 966: | ||
else: | else: | ||
subfigure=subfigures | subfigure=subfigures | ||
+ | |||
loss=plot_losses(x, | loss=plot_losses(x, | ||
+ | ws.append(w) | ||
+ | bs.append(b) | ||
history.append(loss) | history.append(loss) | ||
w, | w, | ||
+ | |||
axes=subfigures[-1].add_subplot(1, | axes=subfigures[-1].add_subplot(1, | ||
plot_simple_metrics(axes, | plot_simple_metrics(axes, | ||
+ | axes=subfigures[-1].add_subplot(1, | ||
+ | plot_evolucion_parametros(axes, | ||
</ | </ | ||
Línea 1038: | Línea 1100: | ||
* 0.01 | * 0.01 | ||
* 0.001 | * 0.001 | ||
+ | * 0.0005 | ||
Línea 1046: | Línea 1109: | ||
==== Ejercicio 6.B ==== | ==== Ejercicio 6.B ==== | ||
- | Siguiendo con el ejercicio anterior, entrena ahora la red con 500 épocas pero ahora solo con los optimizadores/ | + | Siguiendo con el ejercicio anterior, entrena ahora la red con 300 épocas pero ahora solo con los optimizadores/ |
==== Ejercicio 6.C ==== | ==== Ejercicio 6.C ==== | ||
- | Repite el ejercicio anterior pero ahora con **TODAS** las combinaciones de optimizadores y tasas de aprendizaje. ¿Fue adecuada la selección que hiciste | + | Repite el ejercicio anterior pero ahora con **TODAS** las combinaciones de optimizadores y tasas de aprendizaje. |
+ | |||
+ | ¿Fue adecuada la selección que hiciste | ||