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 [2022/02/27 19:50] admin |
clase:iabd:pia:2eval:tema07 [2024/01/25 19:05] admin [Ejercicios] |
||
---|---|---|---|
Línea 27: | Línea 27: | ||
La forma mas fácil de ver las diferencias que hay entre $y$ e $\hat{y}$ es simplemente restarlas y eso nos dará lo que llamamos el error: | La forma mas fácil de ver las diferencias que hay entre $y$ e $\hat{y}$ es simplemente restarlas y eso nos dará lo que llamamos el error: | ||
- | $$error=y-\hat{y}$$ | + | $$error_i=y_i-\hat{y}_i$$ |
Pero como tenemos muchas $y$ e $\hat{y}$ así que deberemos sumar todos los errores y hacer la media (dividirlo entre el número de datos): | Pero como tenemos muchas $y$ e $\hat{y}$ así que deberemos sumar todos los errores y hacer la media (dividirlo entre el número de datos): | ||
Línea 33: | Línea 33: | ||
<note tip>A las funciones de coste también se les llama funciones de pérdida o //loss// en inglés.</ | <note tip>A las funciones de coste también se les llama funciones de pérdida o //loss// en inglés.</ | ||
- | $$loss=\frac{1}{N} \sum_{i=1}^{N} (y_i-\hat{y}_i)$$ | + | $$loss=error \: medio=\frac{1}{N} \sum_{i=1}^{N} |
+ | error_i | ||
sin embargo este primer intento no es muy adecuado ya que la suma de los errores positivos mas los errores negativos se podrían cancelar y obtener que no hay coste. | sin embargo este primer intento no es muy adecuado ya que la suma de los errores positivos mas los errores negativos se podrían cancelar y obtener que no hay coste. | ||
Línea 39: | Línea 40: | ||
La primera función de coste sería entonces hacer el valor absoluto de los errores. | La primera función de coste sería entonces hacer el valor absoluto de los errores. | ||
- | $$loss=\frac{1}{N} \sum_{i=1}^{N}|y_i-\hat{y}_i|$$ | + | $$loss |
- | pero sabiendo que: | + | Siguiendo con nuestro ejemplo de: |
+ | |||
+ | {{ : | ||
$$\hat{y}=\frac{1}{1 + e^{-( w_{5, | $$\hat{y}=\frac{1}{1 + e^{-( w_{5, | ||
Línea 48: | Línea 51: | ||
$$ | $$ | ||
- | \large loss=loss\_function(x, | + | \large loss(x, |
$$ | $$ | ||
- | La formula completa no es importante pero si sabe que el error depende tanto de los $parámetros$ | + | La formula completa no es importante pero si saber que el error depende tanto de los $parámetros$, de la $x$ y de la $y$ verdadera. |
+ | |||
+ | Veamos el código en Python: | ||
+ | |||
+ | Teníamos del tema anterior la creación de la red en Keras y hemos usado como '' | ||
+ | <sxh python> | ||
+ | import numpy as np | ||
+ | import pandas as pd | ||
+ | import tensorflow as tf | ||
+ | from tensorflow.keras.models import Sequential | ||
+ | from tensorflow.keras.layers import Dense | ||
+ | from sklearn.datasets import load_iris | ||
+ | |||
+ | |||
+ | def get_model(loss): | ||
+ | np.random.seed(5) | ||
+ | tf.random.set_seed(5) | ||
+ | random.seed(5) | ||
+ | |||
+ | model=Sequential() | ||
+ | model.add(Dense(3, | ||
+ | model.add(Dense(1, | ||
+ | model.compile(loss=loss) | ||
+ | |||
+ | return model | ||
+ | |||
+ | </ | ||
+ | |||
+ | Ahora creamos la función '' | ||
+ | <sxh python> | ||
+ | def get_w(model, | ||
+ | layer=model.layers[layer] | ||
+ | return layer.get_weights()[0][index, | ||
+ | |||
+ | |||
+ | |||
+ | def get_b(model, | ||
+ | layer=model.layers[layer] | ||
+ | return layer.get_weights()[1][neuron] | ||
+ | |||
+ | |||
+ | def get_parameters_from_model(model): | ||
+ | w_2 =get_w(model, | ||
+ | w_3 =get_w(model, | ||
+ | w_4 =get_w(model, | ||
+ | w_52=get_w(model, | ||
+ | w_53=get_w(model, | ||
+ | w_54=get_w(model, | ||
+ | b_2 =get_b(model, | ||
+ | b_3 =get_b(model, | ||
+ | b_4 =get_b(model, | ||
+ | b_5 =get_b(model, | ||
+ | |||
+ | return w_2, | ||
+ | </ | ||
+ | |||
+ | La creación de la red neuronal mediante la fórmula es: | ||
+ | <sxh python> | ||
+ | def sigmoid(z): | ||
+ | return 1/(1 + np.exp(-z)) | ||
+ | |||
+ | def predict_formula(x, | ||
+ | part1=w_52*sigmoid(w_2*x+b_2) | ||
+ | part2=w_53*sigmoid(w_3*x+b_3) | ||
+ | part3=w_54*sigmoid(w_4*x+b_4) | ||
+ | part4=b_5 | ||
+ | z=part1+part2+part3+part4 | ||
+ | |||
+ | return sigmoid(z) | ||
+ | </ | ||
+ | |||
+ | Hasta aquí todo es prácticamente igual que el tema anterior. Ahora pasemos a definir la función de coste de '' | ||
+ | |||
+ | <sxh python> | ||
+ | def loss_mae(y_true, | ||
+ | error=np.abs(np.subtract(y_true, | ||
+ | mean_error=np.sum(error)/ | ||
+ | |||
+ | return mean_error | ||
+ | </ | ||
+ | |||
+ | Y por último vamos a calcular el '' | ||
+ | |||
+ | <sxh python> | ||
+ | iris=load_iris() | ||
+ | x=iris.data[0: | ||
+ | y_true=iris.target[0: | ||
+ | |||
+ | model=get_model(" | ||
+ | history=model.fit(x, | ||
+ | |||
+ | w_2, | ||
+ | y_pred=predict_formula(x, | ||
+ | |||
+ | print(" | ||
+ | print(" | ||
+ | </ | ||
+ | <sxh base> | ||
+ | loss con la formula: | ||
+ | loss con Keras : | ||
+ | </ | ||
En redes neuronales se suelen usar entre otras las siguientes funciones de coste: | En redes neuronales se suelen usar entre otras las siguientes funciones de coste: | ||
Línea 292: | Línea 395: | ||
$$Binary \: Cross \: Entropy = - \frac{1}{N} \sum_{i=1}^{N} y_{i} \cdot log(\hat{y_i}) + (1-y_{i}) \cdot log(1-\hat{y_i}) $$ | $$Binary \: Cross \: Entropy = - \frac{1}{N} \sum_{i=1}^{N} y_{i} \cdot log(\hat{y_i}) + (1-y_{i}) \cdot log(1-\hat{y_i}) $$ | ||
- | Se ha puesto la fórmula para explicar que su valor va de $[0,\infty[$. Ya que por un lado el logaritmo de un número cercano a cero es menos infinito, de ahí que se ponga el signo menos al principio. Y que los datos de $y_i$ e $\hat{y_i}$ | + | Los valores |
+ | |||
+ | Veamos ahora graficamente como es la fórmula según si $y=0$ o $y=1$ | ||
+ | {{: | ||
+ | |||
Su uso en Keras es: | Su uso en Keras es: | ||
Línea 303: | Línea 411: | ||
Mas información: | Mas información: | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
* [[https:// | * [[https:// | ||
Línea 326: | Línea 436: | ||
| Regresión | | Regresión | ||
| Clasificación con 2 posibles valores | Sigmoide | | Clasificación con 2 posibles valores | Sigmoide | ||
- | | Clasificación con más de 2 posibles valores | Softmax | + | | Clasificación con más de 2 posibles valores |
+ | | Clasificación con más de 2 posibles valores SI excluyentes entre si | Softmax | ||
Línea 339: | Línea 450: | ||
np.random.seed(5) | np.random.seed(5) | ||
tf.random.set_seed(5) | tf.random.set_seed(5) | ||
- | + | random.seed(5) | |
model=Sequential() | model=Sequential() | ||
Línea 353: | Línea 464: | ||
===== Ejercicios ===== | ===== Ejercicios ===== | ||
- | ==== Ejercicio 1 ==== | + | ==== Ejercicio 1.A ==== |
En una red neuronal | En una red neuronal | ||
* Estos son los valores que debería haber sacado la red | * Estos son los valores que debería haber sacado la red | ||
Línea 388: | Línea 499: | ||
- | Haz un programa en python que calcule **mediante las fórmulas** la pérdida de la red con '' | + | Haz un programa en python que calcule **mediante las fórmulas** la pérdida de la red con '' |
+ | |||
+ | ==== Ejercicio 1.B ==== | ||
+ | Repita el ejercicio anterior pero ahora en vez de usar su código en python, usan las funciones de coste de keras: | ||
+ | * '' | ||
+ | * '' | ||
==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
Línea 486: | Línea 602: | ||
{{ : | {{ : | ||
+ | <note warning> | ||
+ | En este tema ya hemos aprendido que la función de perdida para este ejemplo debe ser **Binary Cross Entropy** pero seguimos usando '' | ||
+ | </ | ||
==== Ejercicio 4 ==== | ==== Ejercicio 4 ==== | ||
Línea 512: | Línea 630: | ||
Comprueba si las 3 pérdidas tienen el mismo valor. | Comprueba si las 3 pérdidas tienen el mismo valor. | ||
+ | |||
+ | <note warning> | ||
+ | En este tema ya hemos aprendido que la función de perdida para este ejemplo debe ser **Binary Cross Entropy** pero seguimos usando '' | ||
+ | </ | ||
==== Ejercicio 5.A ==== | ==== Ejercicio 5.A ==== | ||
Línea 567: | Línea 689: | ||
<sxh python> | <sxh python> | ||
df = df.pivot(index=' | df = df.pivot(index=' | ||
+ | </ | ||
+ | |||
+ | muestra el heatmap | ||
+ | <sxh python> | ||
+ | sns.heatmap(df, | ||
</ | </ | ||
Línea 608: | Línea 735: | ||
* Averiguar la cifra que se ha escrito una persona a mano. | * Averiguar la cifra que se ha escrito una persona a mano. | ||
- | ==== Ejercicio 7.A ==== | + | ==== Ejercicio 7 ==== |
+ | Crea una red neuronal para entrenar las flores. Tienes que entrenarla durante 300 épocas con todas las combinaciones de: | ||
+ | * Estructura de la red: | ||
+ | * [3] | ||
+ | * [4, 3] | ||
+ | * [4, 8, 3] | ||
+ | * [4, 8, 16, 8, 3] | ||
+ | * [4, 8, 16, 32, 16, 8, 4, 3] | ||
+ | * [4, 8, 16, 32, 64, 32, 16, 8, 4, 3] | ||
+ | * [4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 3] | ||
+ | * Funciones de activación: | ||
+ | * Sigmoid | ||
+ | * Tanh | ||
+ | * ReLU | ||
+ | * LeakyReLU | ||
+ | * SeLU | ||
+ | * ELU | ||
+ | |||
+ | |||
+ | |||
+ | Responde las siguientes cuestiones: | ||
+ | * ¿Cual ha resultado ser la mejor estructura de red? | ||
+ | * ¿Cual ha sido la mejor función de activación para la mejor estructura de red? | ||
+ | |||
+ | ==== Ejercicio 8.A ==== | ||
Crea y entrena una red neuronal que averigüe si un paciente tendrá diabetes. Los datos los obtendrás con la función '' | Crea y entrena una red neuronal que averigüe si un paciente tendrá diabetes. Los datos los obtendrás con la función '' | ||
Línea 620: | Línea 771: | ||
* Elegir adecuadamente la función de coste a usar | * Elegir adecuadamente la función de coste a usar | ||
- | ==== Ejercicio | + | ==== Ejercicio |
Crea y entrena una red neuronal que averigüe el dígito que ha escrito una persona. Los datos los obtendrás con la función '' | Crea y entrena una red neuronal que averigüe el dígito que ha escrito una persona. Los datos los obtendrás con la función '' | ||
Línea 633: | Línea 784: | ||
* Elegir adecuadamente la función de coste a usar | * Elegir adecuadamente la función de coste a usar | ||
- | ==== Ejercicio | + | ==== Ejercicio |
Crea y entrena una red neuronal que averigüe el tipo de un vino. Los datos los obtendrás con la función '' | Crea y entrena una red neuronal que averigüe el tipo de un vino. Los datos los obtendrás con la función '' | ||
Línea 646: | Línea 797: | ||
* Elegir adecuadamente la función de coste a usar | * Elegir adecuadamente la función de coste a usar | ||
- | ==== Ejercicio | + | ==== Ejercicio |
- | Crea y entrena una red neuronal que averigüe si una transacción es fraudulenta. Los datos los obtendrás | + | Crea y entrena una red neuronal que averigüe si tiene cáncer de mama. Los datos los obtendrás |
- | Deberás: | ||
- | * Probar con varias funciones de activación en las capas ocultas para ver cual es la mejor. | ||
- | * Elegir adecuadamente la función de activación de la capa de salida | ||
- | * Elegir adecuadamente la función de coste a usar | ||
- | + | <sxh python> | |
- | ==== Ejercicio 7.E ==== | + | from sklearn.datasets import load_breast_cancer |
- | Crea y entrena una red neuronal con los datos de las flores pero ahora ya deberás tener en cuenta los 3 tipos de flor. | + | </ |
Deberás: | Deberás: |