clase:iabd:pia:1eval:tema01
Diferencias
Muestra las diferencias entre dos versiones de la página.
| — | clase:iabd:pia:1eval:tema01 [2025/11/03 11:37] (actual) – creado - editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | ====== 1. Introducción a las redes neuronales ====== | ||
| + | Es este tema vamos a ver un ejemplo concreto de una red neuronal. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Definición del problema ===== | ||
| + | Vamos a ver un ejemplo muy sencillo de red neuronal que averigüe el tipo de una flor. Para ello vamos a usar un conjunto de datos que se llaman el [[https:// | ||
| + | |||
| + | Para ello vamos a usar las siguientes variables de entrada: | ||
| + | * El largo de su pétalo: Medido en cm | ||
| + | * El ancho de su pétalo: Medido en cm | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | Este conjunto de datos pretende distinguir entre los siguientes tres tipos de flores: | ||
| + | * Setosa | ||
| + | * Versicolor | ||
| + | * Virginica' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | En la siguiente figura se muestra los valores del largo y ancho del pétalo según el tipo de flor: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ¿Serías capaz con tu inteligencia " | ||
| + | |||
| + | |||
| + | Si longitud_petalo < 2.5 → Setosa | ||
| + | Si longitud_petalo ≥ 2.5: | ||
| + | Si ancho_petalo < 1.7 → Versicolor | ||
| + | Si ancho_petalo ≥ 1.7 → Virginica | ||
| + | |||
| + | Este " | ||
| + | |||
| + | <sxh python> | ||
| + | def predict(longitud_petalo, | ||
| + | if longitud_petalo< | ||
| + | return 0 | ||
| + | else: | ||
| + | if ancho_petalo> | ||
| + | return 2 | ||
| + | else: | ||
| + | return 1 | ||
| + | </ | ||
| + | |||
| + | Y se puede mostrar en la siguiente figura | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | las IAs realmente son algoritmos, solo que el algoritmo se crea casi automáticamente a partir de los datos. | ||
| + | |||
| + | Una figura con el mismo problema pero creado por una IA sería el siguiente: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | < | ||
| + | Realmente el Conjunto de datos flor iris tiene 4 datos de entrada: | ||
| + | * El largo de su sépalo | ||
| + | * El largo de su pétalo | ||
| + | * El ancho de su sépalo | ||
| + | * El ancho de su pétalo | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== La red neuronal ===== | ||
| + | Como es el primer tema, solo vamos a usar 2 tipos de flor para hacer más fácil el problema. | ||
| + | |||
| + | Veamos ahora algunos datos: | ||
| + | |||
| + | | **X** || **Y** || | ||
| + | | **Largo Pétalo** | ||
| + | | 1.4 | 0.2 | 0 | Setosa | ||
| + | | 1.3 | 0.2 | 0 | Setosa | ||
| + | | 1.3 | 0.3 | 0 | Setosa | ||
| + | | 1.5 | 0.4 | 0 | Setosa | ||
| + | | 1.4 | 0.2 | 0 | Setosa | ||
| + | | 1.2 | 0.2 | 0 | Setosa | ||
| + | | 1.7 | 0.4 | 0 | Setosa | ||
| + | | 1.6 | 0.2 | 0 | Setosa | ||
| + | | 1.3 | 0.2 | 0 | Setosa | ||
| + | | 1.2 | 0.2 | 0 | Setosa | ||
| + | | 3.5 | 1.0 | 1 | Versicolor | ||
| + | | 4.5 | 1.5 | 1 | Versicolor | ||
| + | | 3.5 | 1.0 | 1 | Versicolor | ||
| + | | 4.4 | 1.4 | 1 | Versicolor | ||
| + | | 3.5 | 1.0 | 1 | Versicolor | ||
| + | | 4.1 | 1.3 | 1 | Versicolor | ||
| + | | 4.8 | 1.8 | 1 | Versicolor | ||
| + | | 4.4 | 1.3 | 1 | Versicolor | ||
| + | | 3.9 | 1.2 | 1 | Versicolor | ||
| + | | 4.5 | 1.3 | 1 | Versicolor | ||
| + | |||
| + | |||
| + | |||
| + | La red neuronal lo único que va a hacer es " | ||
| + | |||
| + | $$ tipo \: flor=f(largo \: petalo, | ||
| + | |||
| + | <note tip> | ||
| + | * **0**: | ||
| + | * **1**: | ||
| + | </ | ||
| + | |||
| + | |||
| + | Vamos a hacer la siguiente red neuronal: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | Esta red neuronal, consta de una serie de neuronas (ya contaremos mas adelante que es una neurona) que se pasan valores de unas a otras. Son cada uno de los círculos. Las neuronas se organiza en capas: | ||
| + | * Capa de entrada (Círculos amarillos): Es una única capa por donde entran los datos de entrada. Es decir los valores del largo del pétalo y el ancho del pétalo. Por lo tanto en este caso debe haber **2 neuronas** , una por cada valor de entrada. | ||
| + | * Capas ocultas (Círculos verdes): Son varias capas, las cuales calculan de que tipo es cada flor. La primera capa oculta consta de **6 neuronas**. La segunda capa oculta consta de **12 neuronas** . La última capa oculta consta de **6 neuronas**. | ||
| + | * Capa de salida (Círculos rojos): Es una única capa que es la que genera el resultado de la red neuronal. Como la red genera un único número la capa tiene solo **1 neurona**. | ||
| + | |||
| + | |||
| + | ===== Google Colaboratory ===== | ||
| + | [[https:// | ||
| + | |||
| + | Ves a la página de [[https:// | ||
| + | |||
| + | |||
| + | Una explicación completa de Google Colab la puedes ver en video [[https:// | ||
| + | |||
| + | <note tip>En otro tema veremos como usar Jupyter Notebooks en VS Code.</ | ||
| + | |||
| + | |||
| + | ===== Código en Python ===== | ||
| + | Veamos ahora el código python de la red neuronal. | ||
| + | |||
| + | El código completo es el siguiente: | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | import random | ||
| + | import numpy as np | ||
| + | import tensorflow as tf | ||
| + | from tensorflow.keras.models import Sequential | ||
| + | from tensorflow.keras.layers import Dense | ||
| + | from sklearn.datasets import load_iris | ||
| + | |||
| + | iris=load_iris() | ||
| + | |||
| + | longitudes_petalos=iris.data[0: | ||
| + | anchos_petalos=iris.data[0: | ||
| + | flower_type=iris.target[0: | ||
| + | |||
| + | x=np.column_stack((longitudes_petalos, | ||
| + | y=flower_type | ||
| + | |||
| + | |||
| + | np.random.seed(5) | ||
| + | tf.random.set_seed(5) | ||
| + | random.seed(5) | ||
| + | |||
| + | model=Sequential() | ||
| + | model.add(Dense(6, | ||
| + | model.add(Dense(12, | ||
| + | model.add(Dense(6, | ||
| + | model.add(Dense(1, | ||
| + | model.compile(loss=' | ||
| + | |||
| + | |||
| + | model.fit(x, | ||
| + | |||
| + | |||
| + | print(model.predict(np.array([[1.4, | ||
| + | print(model.predict(np.array([[4.4, | ||
| + | |||
| + | </ | ||
| + | |||
| + | Ahora vamos a ver todo el código paso a paso. | ||
| + | |||
| + | <sxh python> | ||
| + | import random | ||
| + | import numpy as np | ||
| + | import tensorflow as tf | ||
| + | from tensorflow.keras.models import Sequential | ||
| + | from tensorflow.keras.layers import Dense | ||
| + | from sklearn.datasets import load_iris | ||
| + | </ | ||
| + | |||
| + | Estas líneas simplemente hacer los " | ||
| + | |||
| + | <sxh python> | ||
| + | longitudes_petalos=iris.data[0: | ||
| + | anchos_petalos=iris.data[0: | ||
| + | flower_type=iris.target[0: | ||
| + | |||
| + | x=np.column_stack((longitudes_petalos, | ||
| + | y=flower_type | ||
| + | </ | ||
| + | |||
| + | Hemos cargado los datos y hemos creado 3 arrays: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Luego hemos creado una matriz juntando la longitud de cada pétalo y la anchura de cada pétalo, es lo que llamaremos '' | ||
| + | |||
| + | Es decir que vamos a entrenar a red neuronal con los valores de '' | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | np.random.seed(5) | ||
| + | tf.random.set_seed(5) | ||
| + | random.seed(5) | ||
| + | </ | ||
| + | |||
| + | Para a siempre nos salgan los mismos resultados, hemos inicializado los generadores de números aleatorios. | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | model=Sequential() | ||
| + | model.add(Dense(6, | ||
| + | model.add(Dense(12, | ||
| + | model.add(Dense(6, | ||
| + | model.add(Dense(1, | ||
| + | model.compile(loss=' | ||
| + | </ | ||
| + | |||
| + | Hemos creado el la estructura de la red neuronal. Excepto la capa de entrada, cada capa se especifica por un objeto de tipo [[https:// | ||
| + | |||
| + | En la primera capa también hemos indicado la propiedad '' | ||
| + | |||
| + | <note tip> | ||
| + | |||
| + | Para acabar compilamos el modelo con el método [[https:// | ||
| + | |||
| + | <sxh python> | ||
| + | model.fit(x, | ||
| + | </ | ||
| + | |||
| + | Ahora vemos a entrenar con el método [[https:// | ||
| + | |||
| + | Por último le decimos cuantas veces tiene que entrenar la red con el parámetro '' | ||
| + | |||
| + | |||
| + | <sxh base> | ||
| + | Epoch 1/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 105ms/step - loss: 0.6408 | ||
| + | Epoch 2/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 961us/step - loss: 0.6225 | ||
| + | Epoch 3/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.6031 | ||
| + | Epoch 4/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5911 | ||
| + | Epoch 5/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5854 | ||
| + | Epoch 6/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5805 | ||
| + | Epoch 7/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5755 | ||
| + | Epoch 8/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5705 | ||
| + | Epoch 9/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5657 | ||
| + | Epoch 10/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5609 | ||
| + | ........ | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.1176 | ||
| + | Epoch 90/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.1136 | ||
| + | Epoch 91/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.1097 | ||
| + | Epoch 92/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 958us/step - loss: 0.1059 | ||
| + | Epoch 93/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.1021 | ||
| + | Epoch 94/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.0984 | ||
| + | Epoch 95/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.0948 | ||
| + | Epoch 96/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 979us/step - loss: 0.0913 | ||
| + | Epoch 97/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 910us/step - loss: 0.0879 | ||
| + | Epoch 98/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.0845 | ||
| + | Epoch 99/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.0812 | ||
| + | Epoch 100/100 | ||
| + | 4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.0780 | ||
| + | </ | ||
| + | |||
| + | Ahora vemos el resultado del entrenamiento para cada una de las épocas, fíjate en //loss// , es lo que nos dice como de buena es nuestra red. Cuanto más pequeño sea ese valor, mejor es la red. | ||
| + | |||
| + | Una vez acabar vamos a usar nuestra función matemática con el método [[https:// | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | print(model.predict(np.array([[1.4, | ||
| + | print(model.predict(np.array([[4.4, | ||
| + | </ | ||
| + | |||
| + | <sxh base> | ||
| + | [[0.09985255]] | ||
| + | [[0.99229264]] | ||
| + | </ | ||
| + | |||
| + | |||
| + | | **X** || **Y Predicha** | ||
| + | | **Largo Pétalo** | ||
| + | | 1.4 | ||
| + | | 4.4 | ||
| + | |||
| + | |||
| + | |||
| + | Vemos como los resultados no son exactamente **0** o **1** sino número cercanos como el '' | ||
| + | |||
| + | Entonces fijarse que hay que distinguir entre: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | <note tip> | ||
| + | Para crear redes neuronales de Python existen 3 librerías | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | **Durante el curso vamos a usar Keras y algo de TensorFlow** | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Gráficas ===== | ||
| + | La mayoría de veces para una mayor comprensión de los datos queremos también ver gráficos de éstos. | ||
| + | |||
| + | El siguiente código Python muestra la siguiente gráfica con cada una de las flores de los datos. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | from matplotlib.colors import ListedColormap | ||
| + | figure=plt.figure(figsize = (5, 4)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | colors = ["# | ||
| + | cmap = ListedColormap(colors[: | ||
| + | |||
| + | |||
| + | scatter=axes.scatter(x=x[:, | ||
| + | axes.set_xlabel(' | ||
| + | axes.set_ylabel(' | ||
| + | |||
| + | for i, name in enumerate([" | ||
| + | color = scatter.cmap(scatter.norm(i)) | ||
| + | axes.scatter([], | ||
| + | axes.set_xlim(xmin=0, | ||
| + | axes.set_ylim(ymin=0, | ||
| + | axes.legend(title=" | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | Ahora vamos a hacer una gráfica con el resultado de la red neuronal | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | from matplotlib.colors import ListedColormap | ||
| + | figure=plt.figure(figsize = (5, 4)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | colors = ["# | ||
| + | cmap = ListedColormap(colors[: | ||
| + | |||
| + | |||
| + | colors = ["# | ||
| + | cmap_fondo = ListedColormap(colors[: | ||
| + | |||
| + | |||
| + | xt=np.linspace(0, | ||
| + | yt=np.linspace(0, | ||
| + | xt, | ||
| + | |||
| + | xa=xt.reshape(-1) | ||
| + | ya=yt.reshape(-1) | ||
| + | |||
| + | xya=np.column_stack((xa, | ||
| + | |||
| + | za=model.predict([xya]) | ||
| + | |||
| + | zt=np.reshape(za, | ||
| + | |||
| + | |||
| + | scatter=axes.scatter(x=xa, | ||
| + | axes.set_xlabel(' | ||
| + | axes.set_ylabel(' | ||
| + | |||
| + | for i, name in enumerate([" | ||
| + | color = scatter.cmap(scatter.norm(i)) | ||
| + | axes.scatter([], | ||
| + | scatter=axes.scatter(x=x[:, | ||
| + | axes.set_xlim(xmin=0, | ||
| + | axes.set_ylim(ymin=0, | ||
| + | axes.legend(title=" | ||
| + | </ | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | Lo que hay que hacer es comparar los datos de las 2 gráficas para ver si son coherentes entre ellas. Y obviamente lo son | ||
| + | |||
| + | ===== Las dificultades de la IA ===== | ||
| + | Al entrenar una IA lo dificil es cuando se encuentra con cosas que no habías previsto. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Si creamos una IA, para saber si una foto es de un chihuahua pero le pasamos una foto de un muffin, lo más normal es que lo confunda con un chihuahua.🤷🏻 | ||
| + | |||
| + | |||
| + | |||
| + | ===== Ejercicios ===== | ||
| + | |||
| + | ==== Ejercicio 1.A ==== | ||
| + | Usando Google collab haz una red neuronal en python con Keras que obtenga el tipo de flor en función del "Largo Pétalo" | ||
| + | |||
| + | |||
| + | Obtén el resultado de la red neuronal para las siguientes entradas e indica el tipo de flor que ha calcula la red neuronal. | ||
| + | |||
| + | | **X** || **Y Predicha** | ||
| + | | **Largo Pétalo** | ||
| + | | 1.3 | ||
| + | | 3.9 | ||
| + | |||
| + | ==== Ejercicio 1.B ==== | ||
| + | Muestra la siguiente figura para ver como se comporta la red neuronal | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Ejercicio 2.A ==== | ||
| + | Modifica ahora la red neuronal de forma que: | ||
| + | |||
| + | * La 1º capa oculta tenga 4 neuronas en vez de 6 | ||
| + | * La 2º capa oculta tenga 5 neuronas en vez de 12 | ||
| + | * La 3º capa oculta tenga 3 neuronas en vez de 6 | ||
| + | * La 4º capa seguirá teniendo 1 neurona | ||
| + | * Sean solo 30 épocas. | ||
| + | * La semilla sea 5. | ||
| + | |||
| + | Usando la web [[http:// | ||
| + | |||
| + | |||
| + | Ahora muestra los resultados | ||
| + | |||
| + | | **X** || **Y Predicha** | ||
| + | | **Largo Pétalo** | ||
| + | | 1.3 | ||
| + | | 3.9 | ||
| + | |||
| + | ==== Ejercicio 2.B ==== | ||
| + | Muestra la siguiente figura para ver como se comporta la red neuronal | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Ejercicio 3 ==== | ||
| + | Usando el código de la red original, modifica las siguientes líneas: | ||
| + | <sxh python> | ||
| + | longitudes_petalos=iris.data[0: | ||
| + | anchos_petalos=iris.data[0: | ||
| + | flower_type=iris.target[0: | ||
| + | </ | ||
| + | |||
| + | de forma que queden así: | ||
| + | |||
| + | <sxh python> | ||
| + | longitudes_petalos=iris.data[:, | ||
| + | anchos_petalos=iris.data[:, | ||
| + | flower_type=iris.target[: | ||
| + | </ | ||
| + | |||
| + | Entrena la red con los nuevos datos | ||
| + | |||
| + | Muestra la siguiente gráfica con los datos de entrada: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | Ahora verás que está el otro tipo de flor llamado // | ||
| + | |||
| + | Prueba a ver si funciona ahora la red neuronal con el nuevo tipo de flor. | ||
| + | |||
| + | | **X** || **Y Predicha** | ||
| + | | **Largo Pétalo** | ||
| + | | 5.1 | ||
| + | | 5.8 | ||
| + | |||
| + | |||
| + | ==== Ejercicio 4 ==== | ||
| + | Piensa al menos 3 problemas que se podrían resolver con una red neuronal similar a la que has usado. | ||
| + | |||
| + | ==== Ejercicio 5 ==== | ||
| + | Vamos a ver ahora otro conjunto de datos relativo a la detección de cáncer de mama. | ||
| + | |||
| + | Los datos se obtienen de la siguiente forma: | ||
| + | |||
| + | <sxh python> | ||
| + | from sklearn.datasets import load_breast_cancer | ||
| + | |||
| + | breast_cancer=load_breast_cancer() | ||
| + | |||
| + | x=breast_cancer.data | ||
| + | y=breast_cancer.target | ||
| + | </ | ||
| + | |||
| + | Este conjunto de datos tiene 30 variable de entrada, que son las siguientes: | ||
| + | * mean radius | ||
| + | * mean texture | ||
| + | * mean perimeter | ||
| + | * mean area | ||
| + | * mean smoothness | ||
| + | * mean compactness | ||
| + | * mean concavity | ||
| + | * mean concave points | ||
| + | * mean symmetry | ||
| + | * mean fractal dimension | ||
| + | * radius error | ||
| + | * texture error | ||
| + | * perimeter error | ||
| + | * area error | ||
| + | * smoothness error | ||
| + | * compactness error | ||
| + | * concavity error | ||
| + | * concave points error | ||
| + | * symmetry error | ||
| + | * fractal dimension error | ||
| + | * worst radius | ||
| + | * worst texture | ||
| + | * worst perimeter | ||
| + | * worst area | ||
| + | * worst smoothness | ||
| + | * worst compactness | ||
| + | * worst concavity | ||
| + | * worst concave points | ||
| + | * worst symmetry | ||
| + | * worst fractal dimension | ||
| + | |||
| + | Esto datos son relativos a imágenes de núcleos celulares como los siguientes: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Y los histogramas de todos los datos son los siguientes: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Podemos ven en los histogramas que no hay una forma fácil de saber si una célula es o no cancerígena. | ||
| + | |||
| + | <note important> | ||
| + | En vez de incluir todos los datos en la red neuronal , habría que hacer un Análisis exploratorio de datos (EDA) y por ejemplo eliminar las columnas que están relacionadas. | ||
| + | </ | ||
| + | |||
| + | Imprime el valor de la fila 56 tanto de la '' | ||
| + | |||
| + | <sxh> | ||
| + | #Para que los datos no se muestren con notación científica | ||
| + | np.set_printoptions(suppress=True) | ||
| + | |||
| + | print(x[56], | ||
| + | </ | ||
| + | |||
| + | Ahora muestra los valores de la '' | ||
| + | |||
| + | |||
| + | Crea una red neuronal en las que en cada capa tenga los siguientes números de neuronas: | ||
| + | |||
| + | | **Nº Capa** | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | |||
| + | |||
| + | Rellena la siguiente tabla y muestrala | ||
| + | |||
| + | |||
| + | | **X** | **Y Predicha** | ||
| + | | **Fila Datos** | ||
| + | | 56 | ||
| + | | 204 | ||
| + | |||
| + | ¿Es una buena red? | ||
| + | |||
| + | |||
| + | Usa hora una red más pequeña de forma que tenga las siguientes capas: | ||
| + | |||
| + | | **Nº Capa** | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | | | ||
| + | |||
| + | |||
| + | Rellena la siguiente tabla y muestrala | ||
| + | |||
| + | | **X** | **Y Predicha** | ||
| + | | **Fila Datos** | ||
| + | | 56 | ||
| + | | 204 | ||
| + | |||
| + | ¿Es una buena red? | ||
| + | |||
| + | ==== Ejercicio 6 ==== | ||
| + | Repite la red pequeña del ejercicio | ||
| + | <sxh> | ||
| + | np.random.seed(5) | ||
| + | tf.random.set_seed(5) | ||
| + | random.seed(5) | ||
| + | </ | ||
| + | |||
| + | Rellena la siguiente tabla y muestrala con una **red con la semilla 6** | ||
| + | |||
| + | | **X** | **Y Predicha** | ||
| + | | **Fila Datos** | ||
| + | | 56 | ||
| + | | 204 | ||
| + | |||
| + | Rellena la siguiente tabla y muestrala con una **red con la semilla 88** | ||
| + | |||
| + | | **X** | **Y Predicha** | ||
| + | | **Fila Datos** | ||
| + | | 56 | ||
| + | | 204 | ||
| + | |||
| + | |||
| + | ==== Ejercicio 7.A ==== | ||
| + | <note tip>El ejercicio es totalmente ficticio</ | ||
| + | Una estrella que explota como supernova. Al explotar expulsa elementos metálicos y no metálicos. | ||
| + | |||
| + | Al pasar 15 años se mide la distancia a la que están los elementos y mediante un arduo trabajo científico, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Hace una red neuronal que según la posición en la que se encuentra el elemento lo califique como metal o no metal. | ||
| + | |||
| + | Los datos son los siguientes: | ||
| + | <sxh python> | ||
| + | x =np.array([ | ||
| + | [12.9, 11.4], [13.7, 8.3], [15.6, 10.6], [11.0, 11.6], [12.7, 13.8], | ||
| + | [12.6, 11.8], [10.1, 9.7], [16.9, 9.8], [13.4, 9.0], [14.2, 17.0], | ||
| + | [15.5, 15.4], [7.7, 9.8], [9.6, 13.2], | ||
| + | [14.8, 10.6], [16.2, 13.3], [14.3, 14.7], [12.6, 11.3], [16.2, 15.0], | ||
| + | [15.6, 13.9], [14.6, 15.0], [11.6, 12.4], [15.7, 9.9], [10.5, 12.2], | ||
| + | [13.1, 11.3], [15.0, 14.2], [13.0, 7.8], [14.6, 12.1], [10.5, 13.9], | ||
| + | [13.7, 16.8], [7.5, 11.5], | ||
| + | [17.5, 11.0], [11.8, 7.8], [11.6, 17.5], [8.9, 8.0], | ||
| + | [9.2, 9.5], | ||
| + | [8.9, 8.6], | ||
| + | [8.6, 15.4], | ||
| + | [4.8, 13.8], | ||
| + | [11.3, 17.6], [18.5, 8.2], [20.0, 13.5], [13.1, 17.6], [10.6, 18.4], | ||
| + | [17.1, 17.4], [4.0, 13.3], | ||
| + | [9.5, 3.5], | ||
| + | [15.7, 18.7], [5.9, 5.3], [5.0, 7.9], | ||
| + | [8.5, 5.1], [7.5, 4.5], | ||
| + | [14.7, 17.5], [20.2, 14.5], [9.3, 17.9], | ||
| + | [4.5, 9.9], | ||
| + | [6.0, 7.1], | ||
| + | ]) | ||
| + | |||
| + | y = np.array([ | ||
| + | 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, 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, 1, 1, | ||
| + | 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, | ||
| + | 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 | ||
| + | |||
| + | ]) | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | Tenemos la siguiente función '' | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | def compile_model(neuronas_capa_1, | ||
| + | random.seed(5) | ||
| + | np.random.seed(5) | ||
| + | tf.random.set_seed(5) | ||
| + | model=Sequential() | ||
| + | model.add(Dense(neuronas_capa_1, | ||
| + | model.add(Dense(neuronas_capa_2, | ||
| + | model.add(Dense(neuronas_capa_3, | ||
| + | model.add(Dense(neuronas_capa_4, | ||
| + | model.compile(loss=' | ||
| + | |||
| + | return model | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Por último tenemos la función '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | <sxh python> | ||
| + | def plot_result(model, | ||
| + | axes = figure.add_subplot(filas, | ||
| + | axes.set_title(title, | ||
| + | | ||
| + | colors = ["# | ||
| + | cmap = ListedColormap(colors[: | ||
| + | |||
| + | |||
| + | colors = ["# | ||
| + | cmap_fondo = ListedColormap(colors[: | ||
| + | |||
| + | xt=np.linspace(0, | ||
| + | yt=np.linspace(0, | ||
| + | xt, | ||
| + | |||
| + | xa=xt.reshape(-1) | ||
| + | ya=yt.reshape(-1) | ||
| + | |||
| + | xya=np.column_stack((xa, | ||
| + | |||
| + | pred = model.predict(xya, | ||
| + | za = (pred > 0.5).astype(int).ravel() | ||
| + | |||
| + | zt=np.reshape(za, | ||
| + | |||
| + | |||
| + | scatter=axes.scatter(x=xa, | ||
| + | axes.set_xlabel(' | ||
| + | axes.set_ylabel(' | ||
| + | |||
| + | for i, name in enumerate([' | ||
| + | color = scatter.cmap(scatter.norm(i)) | ||
| + | axes.scatter([], | ||
| + | scatter=axes.scatter(x=x[:, | ||
| + | axes.set_xlim(xmin=0, | ||
| + | axes.set_ylim(ymin=0, | ||
| + | axes.legend(title=" | ||
| + | </ | ||
| + | |||
| + | Para crear una figura se usa el código: | ||
| + | |||
| + | <sxh python> | ||
| + | figure=plt.figure(figsize = (13.5, 8)) | ||
| + | </ | ||
| + | |||
| + | Siendo '' | ||
| + | |||
| + | Por último siempre hay que poner al final: | ||
| + | |||
| + | <sxh python> | ||
| + | figure.tight_layout() | ||
| + | </ | ||
| + | |||
| + | |||
| + | Veamos un ejemplo de como se usa: | ||
| + | |||
| + | <sxh python> | ||
| + | figure=plt.figure(figsize = (10, 8)) | ||
| + | |||
| + | |||
| + | |||
| + | model=compile_model(6, | ||
| + | |||
| + | model.fit(x, | ||
| + | plot_result(model, | ||
| + | |||
| + | model.fit(x, | ||
| + | plot_result(model, | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | model=compile_model(20, | ||
| + | |||
| + | model.fit(x, | ||
| + | plot_result(model, | ||
| + | |||
| + | model.fit(x, | ||
| + | plot_result(model, | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | figure.tight_layout() | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Veamos como quedaría como una animación de 3000 épocas. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | Ahora muestra 6 gráficas con lo siguiente | ||
| + | * Red: 20,40,20,1 | ||
| + | * épocas: 400 | ||
| + | * épocas: 800 | ||
| + | * épocas: 1200 | ||
| + | * Red: 100, | ||
| + | * épocas: 100 | ||
| + | * épocas: 200 | ||
| + | * épocas: 300 | ||
| + | ==== Ejercicio 7.B ==== | ||
| + | Rellena ahora la siguiente tabla con el último modelo que has creado | ||
| + | |||
| + | | **X** | **Y Predicha** | ||
| + | | **Posición del elemento** | ||
| + | | 13.1, 17.6 | ||
| + | | 3.7, 12.8 | ||
| + | |||
| + | ==== Ejercicio 7.C ==== | ||
| + | Vuelve a entrenar la primera red con los 1200 épocas. | ||
| + | Y muestra los resultados | ||
| + | Pero ahora cambia los datos por lo datos de otra supernova y muestra solo los datos. | ||
| + | |||
| + | <sxh python> | ||
| + | |||
| + | x_entrenamiento =np.array([ | ||
| + | [12.9, 11.4], [13.7, 8.3], [15.6, 10.6], [11.0, 11.6], [12.7, 13.8], | ||
| + | [12.6, 11.8], [10.1, 9.7], [16.9, 9.8], [13.4, 9.0], [14.2, 17.0], | ||
| + | [15.5, 15.4], [7.7, 9.8], [9.6, 13.2], | ||
| + | [14.8, 10.6], [16.2, 13.3], [14.3, 14.7], [12.6, 11.3], [16.2, 15.0], | ||
| + | [15.6, 13.9], [14.6, 15.0], [11.6, 12.4], [15.7, 9.9], [10.5, 12.2], | ||
| + | [13.1, 11.3], [15.0, 14.2], [13.0, 7.8], [14.6, 12.1], [10.5, 13.9], | ||
| + | [13.7, 16.8], [7.5, 11.5], | ||
| + | [17.5, 11.0], [11.8, 7.8], [11.6, 17.5], [8.9, 8.0], | ||
| + | [9.2, 9.5], | ||
| + | [8.9, 8.6], | ||
| + | [8.6, 15.4], | ||
| + | [4.8, 13.8], | ||
| + | [11.3, 17.6], [18.5, 8.2], [20.0, 13.5], [13.1, 17.6], [10.6, 18.4], | ||
| + | [17.1, 17.4], [4.0, 13.3], | ||
| + | [9.5, 3.5], | ||
| + | [15.7, 18.7], [5.9, 5.3], [5.0, 7.9], | ||
| + | [8.5, 5.1], [7.5, 4.5], | ||
| + | [14.7, 17.5], [20.2, 14.5], [9.3, 17.9], | ||
| + | [4.5, 9.9], | ||
| + | [6.0, 7.1], | ||
| + | ]) | ||
| + | |||
| + | y_entrenamiento = np.array([ | ||
| + | 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, 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, 1, 1, | ||
| + | 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, | ||
| + | 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 | ||
| + | |||
| + | ]) | ||
| + | |||
| + | x_validacion = np.array([ | ||
| + | [11.4, 13.4], [11.7, 10.2], [11.4, 12.6], [12.1, 10.4], [8.9, 11.2], | ||
| + | [15.0, 13.2], [10.7, 7.1], [8.2, 12.1], | ||
| + | [9.8, 10.1], | ||
| + | [12.0, 11.2], [12.2, 15.2], [10.5, 9.4], [11.7, 7.1], [14.3, 11.5], | ||
| + | [10.9, 13.3], [12.3, 7.2], [12.5, 9.4], [14.7, 9.0], [12.3, 11.0], | ||
| + | [11.3, 8.5], [9.1, 11.2], | ||
| + | [8.5, 8.1], | ||
| + | [14.2, 12.1], [12.7, 15.2], [8.6, 13.7], | ||
| + | [14.4, 9.7], [12.9, 12.6], [12.0, 9.5], [9.7, 12.9], | ||
| + | [12.3, 9.4], [12.0, 11.8], [9.8, 11.2], | ||
| + | [19.7, 10.2], [13.8, 2.6], [15.7, 12.7], [13.5, 17.3], [4.0, 13.2], | ||
| + | [4.4, 15.3], | ||
| + | [9.5, 5.1], [8.3, 2.5], | ||
| + | [18.6, 14.0], [3.5, 13.4], | ||
| + | [13.3, 5.6], [14.0, 3.6], [4.0, 6.6], | ||
| + | [17.5, 10.4], [15.6, 14.7], [5.3, 7.8], [3.5, 12.3], | ||
| + | [2.8, 13.1], | ||
| + | [11.2, 4.6], [17.2, 10.7], [12.3, 17.3], [3.6, 14.7], | ||
| + | [14.7, 15.1], [8.4, 18.6], | ||
| + | [10.2, 5.9], [4.8, 5.5], [4.8, 7.1], [5.6, 6.8], [6.4, 17.0], | ||
| + | ]) | ||
| + | |||
| + | |||
| + | y_validacion = np.array([ | ||
| + | 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, 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, 1, 1, | ||
| + | 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, | ||
| + | 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 | ||
| + | ]) | ||
| + | |||
| + | |||
| + | |||
| + | figure=plt.figure(figsize = (12, 5)) | ||
| + | |||
| + | model=compile_model(20, | ||
| + | model.fit(x_entrenamiento, | ||
| + | plot_result(model, | ||
| + | plot_result(model, | ||
| + | |||
| + | </ | ||
| + | |||
| + | ¿Que ha ocurrido? | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
