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 | ||
clase:iabd:pia:2eval:tema07 [2023/04/10 15:36] admin [Ejercicios] |
clase:iabd:pia:2eval:tema07 [2025/01/02 18:13] (actual) admin |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== 7. Entrenamiento de redes neuronales | + | ====== 7 Entrenamiento de redes neuronales ====== |
Hasta ahora hemos visto como funciona una red neuronal cuando le pasamos los parámetros de entrada y ella calcula la salida. En este tema vamos a ver como se calculan los parámetros de la red neuronal. | Hasta ahora hemos visto como funciona una red neuronal cuando le pasamos los parámetros de entrada y ella calcula la salida. En este tema vamos a ver como se calculan los parámetros de la red neuronal. | ||
- | Para poder calcular los mejores parámetros de la red neuronal primero debemos saber como es de buena la salida que genera nuestra red neuronal. Para ello vamos a comparar la salida | + | Debido |
- | + | * [[tema07.funciones_coste]] | |
- | $$y= Salida \: verdadera. \: La \: que \: debería \: haber \: generado \: la \: red \: neuronal. Son \: datos \: que \: tenemos \: reales \: de \: salida$$ | + | * [[tema07.backpropagation_descenso_gradiente]] |
- | $$\hat{y}= Salida \: predicha. \: La \: que \: ha \: generado \: la \: red \: neuronal$$ | + | * [[tema07-codigo]] |
- | + | ||
- | + | ||
- | Por lo tanto la red neuronal debería ser así: | + | |
- | + | ||
- | $$y=f(x)$$ | + | |
- | + | ||
- | pero lo que realmente va a hacer es: | + | |
- | + | ||
- | $$\hat{y}=\hat{f}(x)$$ | + | |
- | + | ||
- | En keras se suele usar la siguiente nomenclatura | + | |
- | + | ||
- | <sxh python> | + | |
- | y_true | + | |
- | y_pred | + | |
- | </ | + | |
- | + | ||
- | ¿como de buena es nuestra red neuronal? Pues no hay mas que comprar $y$ con $\hat{y}$. Cuanto más se parezcan, mejor será la red. | + | |
- | + | ||
- | 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_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): | + | |
- | + | ||
- | <note tip>A las funciones de coste también se les llama funciones de pérdida o //loss// en inglés.</ | + | |
- | + | ||
- | $$loss=error \: medio=\frac{1}{N} \sum_{i=1}^{N} | + | |
- | error_i =\frac{1}{N} \sum_{i=1}^{N} (y_i-\hat{y}_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. | + | |
- | + | ||
- | La primera función de coste sería entonces hacer el valor absoluto de los errores. | + | |
- | + | ||
- | $$loss \: con \: MAE=error \: medio \: con \: MAE=\frac{1}{N} \sum_{i=1}^{N}|y_i-\hat{y}_i|$$ | + | |
- | + | ||
- | Siguiendo con nuestro ejemplo de: | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | $$\hat{y}=\frac{1}{1 + e^{-( w_{5,2}\frac{1}{1 + e^{-( w_{2}x+b_{2} | + | |
- | + | ||
- | Nos queda que el coste es: | + | |
- | + | ||
- | $$ | + | |
- | \large loss(x, | + | |
- | $$ | + | |
- | + | ||
- | La formula completa no es importante pero si saber que el error depende tanto de los $parámetros$, | + | |
- | + | ||
- | 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: | + | |
- | * Problemas de regresión | + | |
- | * Mean Absolute | + | |
- | * Mean Square Error (MSE). Error cuadrático medio | + | |
- | * Huber | + | |
- | * Distancia del coseno. | + | |
- | * Problemas de clasificación: | + | |
- | * Binary Cross Entropy | + | |
- | * Categorical Cross Entropy | + | |
- | + | ||
- | Hay mas funciones de coste que se usan en otros problemas como por ejemplo en imágenes pero aquí solo vamos a ver lo básico. | + | |
- | + | ||
- | + | ||
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | ===== Uso en Keras ===== | + | |
- | Al igual que pasaba con las funciones de activación, | + | |
- | + | ||
- | <sxh python> | + | |
- | # Mediante un String | + | |
- | model.compile(loss=' | + | |
- | # Mediante la función | + | |
- | model.compile(loss=tf.keras.losses.mean_squared_error) | + | |
- | # Mediante una clase que retorna la función | + | |
- | model.compile(loss=tf.keras.losses.MeanSquaredError()) | + | |
- | </ | + | |
- | + | ||
- | La ventaja de usar la clase es podremos parametrizar la función. Por ejemplo, la función de perdida //Huber// tiene un parámetro llamado delta $\delta$. | + | |
- | + | ||
- | <sxh python> | + | |
- | model.compile(loss=tf.keras.losses.Huber(delta=1.2)) | + | |
- | </ | + | |
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | Veamos ahora las distintas funciones de coste | + | |
- | + | ||
- | ===== MAE ===== | + | |
- | El error absoluto medio o en inglés Mean Absolute Error (MAE) suma el valor absoluto de los errores. Al hacer el valor absoluto de cada error, no se cancelarán si hay errores positivos y negativos. | + | |
- | + | ||
- | Su fórmula es: | + | |
- | + | ||
- | $$MAE = \frac{1}{N} \sum_{i=1}^{N}|y_{i} - \hat{y_{i}}|$$ | + | |
- | + | ||
- | Su uso en Keras es: | + | |
- | <sxh python> | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=tf.keras.losses.mean_absolute_error) | + | |
- | model.compile(loss=tf.keras.losses.MeanAbsoluteError()) | + | |
- | </ | + | |
- | + | ||
- | <note tip> | + | |
- | **MAE vs MSE** | + | |
- | + | ||
- | Con el algoritmo de descenso de gradiente nunca nos interesa usar MAE como función de coste ya que el valor de su derivada siempre es constante por lo que al llegar cerca del mínimo es muy fácil que no lo alcance al ser los pasos demasiado largos para llegar al mínimo y pasará sobre él. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Mas información: | + | |
- | * {{: | + | |
- | Prediction}} | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | + | ||
- | ===== MSE ===== | + | |
- | El error cuadrático medio o en inglés Mean Square Error (MSE) es similar al anterior solo que eleva al cuadrado cada uno de los errores. | + | |
- | + | ||
- | Su fórmula es: | + | |
- | + | ||
- | $$MSE = \frac{1}{N} \sum_{i=1}^{N}|y_{i} - \hat{y_{i}}|^2$$ | + | |
- | + | ||
- | Al elevar al cuadrado ocurre que no hace falta calcular el valor absoluto por lo que la fórmula es más común verla de la siguiente forma: | + | |
- | + | ||
- | $$MSE = \frac{1}{N} \sum_{i=1}^{N}(y_{i} - \hat{y_{i}})^2$$ | + | |
- | + | ||
- | Su uso en Keras es: | + | |
- | <sxh python> | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=tf.keras.losses.mean_squared_error) | + | |
- | model.compile(loss=tf.keras.losses.MeanSquaredError()) | + | |
- | </ | + | |
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | + | ||
- | ===== Distancia del coseno ===== | + | |
- | La distancia del coseno lo que calcula es en vez de la distancia entre 2 puntos, lo que hace es obtener el coseno de la diferencia entre sus ángulos. | + | |
- | + | ||
- | Es decir que obtiene el ángulo que tiene cada vectos, resta esos ángulos y calcula el coseno. | + | |
- | + | ||
- | Veamos ahora valores del coseno de algunos ángulos: | + | |
- | * $cos(0 ^o )=1$ | + | |
- | * $cos(45 ^o )=0, | + | |
- | * $cos(90 ^o )=0$ | + | |
- | * $cos(135 ^o )=-0, | + | |
- | * $cos(180 ^o )=-1$ | + | |
- | * $cos(225 ^o )=-0, | + | |
- | * $cos(270 ^o )=0$ | + | |
- | * $cos(315 ^o )=0, | + | |
- | + | ||
- | Si nos fijamos en la siguiente imagen en la que en la parte superior de cada par de vectores está el resultado de la distancia del coseno: | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | + | ||
- | + | ||
- | con un poco de ojo, podremos ver que los ángulos que forman y sus cosenos coinciden exactamente con la distancia entre los vectores. | + | |
- | + | ||
- | Notar que si la resta de los ángulos es 0, es decir que son iguales, el resultado de 1, pero si forman un ángulo de 180° la diferencia es máxima, y su valor es -1. Por lo tanto la distancia del coseno está en el rango [-1,1]. | + | |
- | + | ||
- | Para hacer el cálculo matemáticamente podríamos usar algo de trigonometría, | + | |
- | + | ||
- | $$ | + | |
- | distancia \: del \: coseno=\frac{y \cdot \hat{y}}{ \| y \| \cdot \| \hat{y} \|}= | + | |
- | \frac{\sum\limits_{i=1}^{N} y_{i} \cdot \hat{y_{i}}}{\sqrt{\sum\limits_{i=1}^{N}y_{i}^2} \cdot \sqrt{\sum\limits_{i=1}^{N}\hat{y_{i}}^2}} | + | |
- | $$ | + | |
- | + | ||
- | + | ||
- | En Python se hace de la siguiente forma: | + | |
- | <sxh python> | + | |
- | y_true=np.array([ 1.0, 0.0]) | + | |
- | y_pred=np.array([ 1.0, 0.2]) | + | |
- | + | ||
- | #Usando la fórmula con lo básico de numpy | + | |
- | distancia_coseno_formula=np.sum(y_true*y_pred)/ | + | |
- | print(distancia_coseno_formula) | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | Y el resultado es éste: | + | |
- | <sxh base> | + | |
- | 0.9805806756909201 | + | |
- | </ | + | |
- | + | ||
- | sin embargo si usamos la función de coste de Keras: | + | |
- | + | ||
- | <sxh python> | + | |
- | #Usando la función de coste de Keras | + | |
- | distancia_coseno_keras=tf.keras.losses.cosine_similarity([y_true], | + | |
- | print(distancia_coseno_keras) | + | |
- | </ | + | |
- | + | ||
- | <sxh base> | + | |
- | -0.9805806756909201 | + | |
- | </ | + | |
- | + | ||
- | Vemos que el resultado sale con el signo al revés. **Esto es así porque las funciones de coste deben ser de forma que cuanto mayor es el valor, mayor es la diferencia entre $y$ e $\hat{y}$ **. Así que simplemente la función de coste de '' | + | |
- | + | ||
- | * Su uso en es Keras | + | |
- | + | ||
- | <sxh python> | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=tf.keras.losses.cosine_similarity) | + | |
- | model.compile(loss=tf.keras.losses.CosineSimilarity()) | + | |
- | </ | + | |
- | + | ||
- | ==== Utilidad de la distancia del coseno ==== | + | |
- | Acabamos de ver como funciona matemáticamente la distancia del coseno pero , ¿cual es su utilidad? | + | |
- | + | ||
- | Primero veamos un posible problema de la distancia del coseno. Imaginemos los siguientes 2 vectores A y B | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Los 2 vectores no son iguales pero la distancia del coseno nos dirá que son iguales ya que ambos tienen el mismo ángulo. Así que esta función de coste lo que le interesa es la dirección del vector y no el tamaño del vector. Pero, ¿donde puede eso ser últil? Veamos un ejemplo. | + | |
- | + | ||
- | [[https:// | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Podemos definir la posición como un conjunto de vectores de cada una de las extremidades. El angulo de cada vector nos dice la posición de cada extremidad pero el tamaño del vector no dice el tamaño de la extremidad. Ahora veamos la siguiente imagen. | + | |
- | + | ||
- | + | ||
- | {{ : | + | |
- | + | ||
- | Son 3 personas distintas cada una con tamaños de extremidades distintas además que dependiendo de si están en la imagen más hacia el fondo, sus tamaños serán distintos. Para saber si las 3 están haciendo los mismos movimientos, | + | |
- | + | ||
- | Otro ejemplo sería para catalogar películas de géneros semejantes. Veamos la siguiente gráfica: | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | En ángulo nos dice si la película tiene mas porcentaje de aventura o de comedia y la longitud como es de buena la película. Para buscar películas con géneros similares, ¿nos interesa que el tamaño del vector sea el mismo o nos interesa que el ángulo del vector sea el mismo? Como en el caso de antes nos interesa es que el ángulo sea el mismo y no si el tamaño es el mismo. | + | |
- | + | ||
- | Otro uso común de la distancia del coseno el comprar si dos documentos se parecen según el Nº de palabras que tiene cada uno. Cada palabra es un vector n-dimensional y palabras similares tienen orientaciones similares. En este caso es necesario previamente tener una "base de datos" con todas las palabras codificadas como vectores. Podemos ver distintas bases de datos aquí: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | Una explicación esto está en: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | ===== Binary Cross Entropy ===== | + | |
- | Las funciones de coste que hemos visto hasta ahora se usan en problemas de regresión, las siguientes funciones de coste que vamos a ver ahora se usan en problemas de clasificación. | + | |
- | + | ||
- | La función de coste " | + | |
- | + | ||
- | La fórmula es la siguiente: | + | |
- | + | ||
- | $$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, | + | |
- | + | ||
- | Su uso en Keras es: | + | |
- | <sxh python> | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=tf.keras.losses.binary_crossentropy) | + | |
- | model.compile(loss=tf.keras.losses.BinaryCrossentropy()) | + | |
- | </ | + | |
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | ===== Categorical Cross Entropy ===== | + | |
- | La función de coste " | + | |
- | + | ||
- | Esta función de coste se suele usar junto a la función de activación " | + | |
- | + | ||
- | Su uso en Keras es: | + | |
- | <sxh python> | + | |
- | model.compile(loss=" | + | |
- | model.compile(loss=tf.keras.losses.categorical_crossentropy) | + | |
- | model.compile(loss=tf.keras.losses.CategoricalCrossentropy()) | + | |
- | </ | + | |
- | + | ||
- | Mas información: | + | |
- | * [[https:// | + | |
- | + | ||
- | + | ||
- | Para acabar vamos a ver una tabla con la relación entre las funciones de activación usadas en la salida de una red neuronal y la función de coste que se podría usar. | + | |
- | + | ||
- | ^ Problema ^ Función de Activación a la salida | + | |
- | | Regresión | + | |
- | | Clasificación con 2 posibles valores | Sigmoide | + | |
- | | Clasificación con más de 2 posibles valores | Softmax | + | |
- | + | ||
- | + | ||
- | Para terminar este apartado seguimos con nuestro ejemplo de red neuronal ahora incluyendo la función de coste: | + | |
- | + | ||
- | <sxh python> | + | |
- | iris=load_iris() | + | |
- | x=iris.data[0: | + | |
- | y_true=iris.target[0: | + | |
- | + | ||
- | + | ||
- | 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=" | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ===== Ejercicios ===== | + | |
- | + | ||
- | ==== Ejercicio 1.A ==== | + | |
- | En una red neuronal | + | |
- | * Estos son los valores que debería haber sacado la red | + | |
- | <sxh python> | + | |
- | y_true=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | + | |
- | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | + | |
- | 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | + | |
- | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | + | |
- | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] | + | |
- | </ | + | |
- | * Estos son los valores que realmente ha generado la red | + | |
- | <sxh python> | + | |
- | y_pred=[0.18395704, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | 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 ==== | + | |
- | Tenemos dos redes neuronales, que deberían haber sacado los siguientes datos. | + | |
- | + | ||
- | <sxh python> | + | |
- | y_true=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | + | |
- | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | + | |
- | 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | + | |
- | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | + | |
- | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] | + | |
- | </ | + | |
- | + | ||
- | * La red **A** ha sacado los siguientes datos: | + | |
- | <sxh python> | + | |
- | y_pred_red_a=[0.18395704, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | </ | + | |
- | + | ||
- | * La red **B**, ha sacado los siguientes datos: | + | |
- | <sxh python> | + | |
- | y_pred_red_b=[0.1359098 , 0.1359098 , 0.13724494, 0.1496709 , 0.1359098 , | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | Calcula la pérdida de las 2 redes con '' | + | |
- | + | ||
- | ^ ^ MAE ^ MSE ^ | + | |
- | ^ Red A | | | | + | |
- | ^ Red B | | | | + | |
- | + | ||
- | ¿cual es mejor red? Explica porqué | + | |
- | + | ||
- | + | ||
- | ==== Ejercicio 3 ==== | + | |
- | Usando los siguientes datos: | + | |
- | <sxh python> | + | |
- | iris=load_iris() | + | |
- | x=np.array(iris.data[0: | + | |
- | y_true=np.array(iris.target[0: | + | |
- | </ | + | |
- | + | ||
- | Y con la siguiente red neuronal: | + | |
- | <sxh python> | + | |
- | model=Sequential() | + | |
- | model.add(Dense(2, | + | |
- | model.add(Dense(4, | + | |
- | model.add(Dense(8, | + | |
- | model.add(Dense(16, | + | |
- | model.add(Dense(8, | + | |
- | model.add(Dense(4, | + | |
- | model.add(Dense(1, | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | Entrena la red durante **80** épocas, usando '' | + | |
- | + | ||
- | Muestra una gráfica similar a la siguiente: | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <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 ==== | + | |
- | Usando los siguientes datos: | + | |
- | <sxh python> | + | |
- | iris=load_iris() | + | |
- | x=np.array(iris.data[0: | + | |
- | y_true=np.array(iris.target[0: | + | |
- | </ | + | |
- | + | ||
- | Y con la siguiente red neuronal: | + | |
- | <sxh python> | + | |
- | model=Sequential() | + | |
- | model.add(Dense(3, | + | |
- | model.add(Dense(1, | + | |
- | model.compile(loss=" | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | Entrena la red durante **80** épocas, usando '' | + | |
- | * La pérdida de '' | + | |
- | * Obtén el array '' | + | |
- | * Calcula manualmente mediante las fórmulas la pérdida de '' | + | |
- | * Calcula mediante las funciones de Keras la pérdida de '' | + | |
- | + | ||
- | 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 ==== | + | |
- | Vamos a comprobar como funciona la distancia del coseno para textos. Para ello vamos a obtener una base de datos con 1.692.025 palabras organizadas en vectores de 300 dimensiones. | + | |
- | + | ||
- | Para prepararlo todo, antes hay que hacer lo siguiente | + | |
- | + | ||
- | * Descarga el fichero [[http:// | + | |
- | * Descomprime el fichero y obtendrás el nuevo fichero llamado '' | + | |
- | * Instala el paquete de python llamado '' | + | |
- | + | ||
- | Ahora desde python vamos a usarlo: | + | |
- | + | ||
- | * Importa el siguiente código: | + | |
- | <sxh python> | + | |
- | from gensim.models import KeyedVectors | + | |
- | from gensim.test.utils import datapath | + | |
- | </ | + | |
- | + | ||
- | * Carga el fichero | + | |
- | <sxh python> | + | |
- | wv = KeyedVectors.load_word2vec_format(datapath(" | + | |
- | </ | + | |
- | + | ||
- | * Muestra el número exacto de palabras que tiene | + | |
- | <sxh python> | + | |
- | len(wv) | + | |
- | </ | + | |
- | + | ||
- | * El método '' | + | |
- | <sxh python> | + | |
- | wv.similarity(' | + | |
- | </ | + | |
- | <sxh base> | + | |
- | 0.85508734 | + | |
- | </ | + | |
- | + | ||
- | ==== Ejercicio 5.B ==== | + | |
- | Siguiendo con el ejercicio anterior. Muestra la distancia del coseno entre los siguientes pares de palabras: | + | |
- | * verdura , lechuga | + | |
- | * tigre , gato | + | |
- | * movil , android | + | |
- | * tiburón , libro | + | |
- | * matemáticas , hijo | + | |
- | + | ||
- | ==== Ejercicio 5.C ==== | + | |
- | Siguiendo con el ejercicio anterior. Crea un heatmap usando **Seaborn** con la distancia del coseno de todas las anteriores palabras. | + | |
- | + | ||
- | Deberás crear un dataframe con las columnas: | + | |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | + | ||
- | y ejecutar la siguiente línea para que transforme el DataFrame en una matriz válida para hacer el heatmap: | + | |
- | <sxh python> | + | |
- | df = df.pivot(index=' | + | |
- | </ | + | |
- | + | ||
- | muestra el heatmap | + | |
- | <sxh python> | + | |
- | sns.heatmap(df, | + | |
- | </ | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | ==== Ejercicio 5.D ==== | + | |
- | Siguiendo con el ejercicio anterior. | + | |
- | + | ||
- | * Ejecuta la siguiente línea. ¿que crees que hace? | + | |
- | + | ||
- | <sxh python> | + | |
- | wv.most_similar_cosmul(positive=[' | + | |
- | </ | + | |
- | + | ||
- | * Ejecuta la siguiente línea. ¿Como se ha modificado el resultado? | + | |
- | <sxh python> | + | |
- | wv.most_similar_cosmul(positive=[' | + | |
- | </ | + | |
- | + | ||
- | * Ejecuta la siguiente línea. ¿Como se ha modificado el resultado? | + | |
- | <sxh python> | + | |
- | wv.most_similar_cosmul(positive=[' | + | |
- | </ | + | |
- | + | ||
- | ==== Ejercicio 5.E ==== | + | |
- | ¿Le has visto alguna utilidad a tener las palabras como vectores y que se puedan relacionar entre ellas? Piensa algún proyecto donde se pudiera usar. | + | |
- | + | ||
- | ==== Ejercicio 6 ==== | + | |
- | Dado los siguientes problemas de redes neuronales, indica la función (o funciones) de pérdida que usarías: | + | |
- | + | ||
- | * Obtener el consumo de un coche según las distintas condiciones climáticas, | + | |
- | * Averiguar si un paciente tendrá diabetes en el futuro según una serie de analíticas que se han ido haciendo a lo largo de su vida. | + | |
- | * Distinguir entre 5 tipos de vino según distintas características del vino | + | |
- | * Indicar las variedades de olivas que lleva un aceite y su proporción según el análisis químico que se le hace al aceite. | + | |
- | * Indicar si una compra con tarjeta es fraudulenta | + | |
- | * Averiguar a que partido político ha votado una persona | + | |
- | * Averiguar la distancia a la que se encuentra una estrella según diversas fotos que se van sacando de ella con telescopios. | + | |
- | * Entre 8 tipos distintos de canceres y dada la foto de las células de una persona averiguar los cánceres que puede tener | + | |
- | * Saber el tipo de tiburón según el sonido que hace bajo el agua al desplazarse | + | |
- | * Calcular la ubicación de los objetivos a destruir por un tanque | + | |
- | * Averiguar la cifra que se ha escrito una persona a mano. | + | |
- | + | ||
- | ==== 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 '' | + | |
- | + | ||
- | <sxh python> | + | |
- | from sklearn.datasets import load_diabetes | + | |
- | </ | + | |
- | + | ||
- | 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 | + | |
- | + | ||
- | ==== Ejercicio 8.B ==== | + | |
- | 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 '' | + | |
- | + | ||
- | + | ||
- | <sxh python> | + | |
- | from sklearn.datasets import load_digits | + | |
- | </ | + | |
- | + | ||
- | 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 | + | |
- | + | ||
- | ==== Ejercicio 8.C ==== | + | |
- | Crea y entrena una red neuronal que averigüe el tipo de un vino. Los datos los obtendrás con la función '' | + | |
- | + | ||
- | + | ||
- | <sxh python> | + | |
- | from sklearn.datasets import load_wine | + | |
- | </ | + | |
- | + | ||
- | 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 | + | |
- | + | ||
- | ==== Ejercicio 8.D ==== | + | |
- | Crea y entrena una red neuronal que averigüe si tiene cáncer de mama. Los datos los obtendrás con la función '' | + | |
- | + | ||
- | + | ||
- | <sxh python> | + | |
- | from sklearn.datasets import load_breast_cancer | + | |
- | </ | + | |
- | + | ||
- | 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 | + |