Documentos de Académico
Documentos de Profesional
Documentos de Cultura
REDES NEURONALES
VERGARA TABOADA. - JOSÉ MIGUEL
En esta actividad vamos a utilizar una red neuronal para clasificar imágenes de prendas de
ropa. Para ello, utilizaremos Keras con TensorFlow.
El dataset a utilizar es Fashion MNIST, un problema sencillo con imágenes pequeñas de
ropa, pero más interesante que el dataset de MNIST. Puedes consultar más información
sobre el dataset en este enlace.
El código utilizado para contestar tiene que quedar claramente reflejado en el Notebook.
Puedes crear nuevas celdas si así lo deseas para estructurar tu código y sus salidas. A la
hora de entregar el notebook, asegúrate de que los resultados de ejecutar tu código han
quedado guardados. Por ejemplo, a la hora de entrenar una red neuronal tiene que verse
claramente un log de los resultados de cada epoch.
In [1]: import keras
from keras.datasets import fashion_mnist
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf
import pandas as pd
import time
En primer lugar vamos a importar el dataset Fashion MNIST (recordad que este es uno de
los dataset de entranamiento que estan guardados en keras) que es el que vamos a utilizar
en esta actividad:
In [2]: mnist = tf.keras.datasets.fashion_mnist
Llamar a load_data en este dataset nos dará dos conjuntos de dos listas, estos serán los
valores de entrenamiento y prueba para los gráficos que contienen las prendas de vestir y
sus etiquetas.
Nota: Aunque en esta actividad lo veis de esta forma, también lo vais a poder encontrar
como 4 variables de esta forma: training_images, training_labels, test_images, test_labels =
mnist.load_data()
In [3]: (training_images, training_labels), (test_images, test_labels) = mnist.load_dat
Antes de continuar vamos a dar un vistazo a nuestro dataset, para ello vamos a ver una
imagen de entrenamiento y su etiqueta o clase.
localhost:8888/lab/tree/OneDrive - UNIR/UNIR/MASTER/INTELIGENCIA ARTIFICIAL/SISTEMAS COGNITIVOS ARTIFICIALES/ACTIVIDAD 1/Actividad… 1/57
22/10/23, 23:31 Actividad_1_Redes_Neuronales_Artificiales_ANN
Habreis notado que todos los valores numericos están entre 0 y 255. Si estamos
entrenando una red neuronal, una buena practica es transformar todos los valores entre 0 y
1, un proceso llamado "normalización" y afortunadamente en Python es fácil normalizar una
lista. Lo puedes hacer de esta manera:
In [5]: training_images = training_images / 255.0
test_images = test_images / 255.0
q_train_images = training_images.shape[0]
q_test_images = test_images.shape[0]
image_height = training_images.shape[1]
image_width = training_images.shape[2]
Tu respuesta aquí
Los sets de entrenamiento y test tienen 60000 y 10000 imágenes respectivamente. Todas
ellas de 28 x 28.
Pregunta 1.2 (0.25 puntos) Realizar una exploración de las variables que contienen los
datos. Describir en qué consiste un example del dataset (qué información se guarda en
cada imagen) y describir qué contiene la información en y.
In [7]: ### Tu código aquí ###
plt.figure(figsize=(10,2))
for i in range(10):
plt.subplot(1,10, i+1)
plt.imshow(training_images[i],cmap='gray')
plt.title(training_labels[i])
plt.axis('off')
plt.show()
labels = len(np.unique(training_labels))
print('Labels únicos: ',labels)
Labels únicos: 10
Tu respuesta aquí
De acuerdo con el ejercicio exploratorio, puede observarse que el dataset esta compuesto
de imágenes de prendas de vestir. Además de esto, en y cuenta con etiquetas que
clasifican dichas prendas en 10 diferentes categorías únicas.
Cada capa de neuronas necesita una función de activación. Normalmente se usa la función
relu en las capas intermedias y softmax en la ultima capa (en problemas de clasificación de
más de dos items)
Relu significa que "Si X>0 devuelve X, si no, devuelve 0", así que lo que hace es pasar
sólo valores 0 o mayores a la siguiente capa de la red.
Softmax toma un conjunto de valores, y escoge el más grande.
Pregunta 2.1 (2 puntos). Utilizando Keras, y preparando los datos de X e y como fuera
necesario, define y entrena una red neuronal que sea capaz de clasificar imágenes de
Fashion MNIST con las siguientes características:
Una hidden layer de tamaños 128, utilizando unidades sigmoid Optimizador Adam.
Durante el entrenamiento, la red tiene que mostrar resultados de loss y accuracy por
cada epoch.
La red debe entrenar durante 10 epochs y batch size de 64.
La última capa debe de ser una capa softmax.
Tu red tendría que ser capaz de superar fácilmente 80% de accuracy.
In [8]: ### Tu código para la red neuronal de la pregunta 2 aquí ###
model1.add(keras.layers.Flatten(input_shape=[28,28]))
model1.add(Dense(10, activation='softmax'))
# Compilar el modelo:
model1.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time1 = time.time()
# Entrenar el modelo
history1 = model1.fit(training_images, training_labels, epochs=10, batch_size=6
# Detener el temporizador
end_time1 = time.time()
Epoch 1/10
938/938 [==============================] - 1s 724us/step - loss: 0.6007 - accu
racy: 0.7997 - val_loss: 0.4760 - val_accuracy: 0.8321
Epoch 2/10
938/938 [==============================] - 1s 627us/step - loss: 0.4136 - accu
racy: 0.8526 - val_loss: 0.4266 - val_accuracy: 0.8451
Epoch 3/10
938/938 [==============================] - 1s 640us/step - loss: 0.3739 - accu
racy: 0.8655 - val_loss: 0.4043 - val_accuracy: 0.8536
Epoch 4/10
938/938 [==============================] - 1s 669us/step - loss: 0.3484 - accu
racy: 0.8749 - val_loss: 0.3835 - val_accuracy: 0.8633
Epoch 5/10
938/938 [==============================] - 1s 640us/step - loss: 0.3319 - accu
racy: 0.8795 - val_loss: 0.3810 - val_accuracy: 0.8625
Epoch 6/10
938/938 [==============================] - 1s 630us/step - loss: 0.3152 - accu
racy: 0.8863 - val_loss: 0.3741 - val_accuracy: 0.8662
Epoch 7/10
938/938 [==============================] - 1s 638us/step - loss: 0.3022 - accu
racy: 0.8909 - val_loss: 0.3556 - val_accuracy: 0.8741
Epoch 8/10
938/938 [==============================] - 1s 633us/step - loss: 0.2907 - accu
racy: 0.8949 - val_loss: 0.3441 - val_accuracy: 0.8774
Epoch 9/10
938/938 [==============================] - 1s 640us/step - loss: 0.2811 - accu
racy: 0.8968 - val_loss: 0.3401 - val_accuracy: 0.8794
Epoch 10/10
938/938 [==============================] - 1s 614us/step - loss: 0.2717 - accu
racy: 0.9000 - val_loss: 0.3335 - val_accuracy: 0.8791
Duración del entrenamiento: 6.25 segundos
Para concluir el entrenamiento de la red neuronal, una buena practica es evaluar el modelo
para ver si la precisión de entrenamiento es real
pregunta 2.2 (0.5 puntos): evalua el modelo con las imagenes y etiquetas test.
In [9]: ### Tu código para la evaluación de la red neuronal de la pregunta 2 aquí ###
entrenamiento realizado
Ahora vamos a explorar el código con una serie de ejercicios para alcanzar un grado de
comprensión mayor sobre las redes neuronales y su entrenamiento.
print(classifications[0])
# Clase predicha:
predicted_class = np.argmax(classifications[0])
Esto se da porque la red neuronal produce una distribución de probabilidad sobre las
posibles clases.
Tu respuesta a la pregunta 3.2 aquí:
La clase predicha es la clase: 9. Lo cual es correspondiente con la respuesta de la pregunta
1.2 y con el valor del vector con mayor probabilidad de ocurrencia.
4:lasImpacto variar
capas ocultas el número de neuronas en
En este ejercicio vamos a experimentar con nuestra red neuronal cambiando el numero de
neuronas por 512 y por 1024. Para ello, utiliza la red neuronal de la pregunta 1, y su capa
oculta cambia las 128 neuronas:
**512 neuronas en la capa oculta
**1024 neuronas en la capa oculta
y entrena la red en ambos casos.
In [11]: ### Tu código para 512 neuronas aquí ###
model2.add(keras.layers.Flatten(input_shape=[28,28]))
model2.add(Dense(10, activation='softmax'))
# Compilar el modelo:
model2.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time2 = time.time()
# Entrenar el modelo
history2 = model2.fit(training_images, training_labels, epochs=10, batch_size=6
# Detener el temporizador
end_time2 = time.time()
Epoch 1/10
938/938 [==============================] - 1s 1ms/step - loss: 0.5256 - accura
cy: 0.8168 - val_loss: 0.4551 - val_accuracy: 0.8344
Epoch 2/10
938/938 [==============================] - 1s 1ms/step - loss: 0.4004 - accura
cy: 0.8568 - val_loss: 0.4053 - val_accuracy: 0.8557
Epoch 3/10
938/938 [==============================] - 1s 1ms/step - loss: 0.3632 - accura
cy: 0.8677 - val_loss: 0.3901 - val_accuracy: 0.8600
Epoch 4/10
938/938 [==============================] - 1s 1ms/step - loss: 0.3355 - accura
cy: 0.8774 - val_loss: 0.3724 - val_accuracy: 0.8652
Epoch 5/10
938/938 [==============================] - 1s 1ms/step - loss: 0.3150 - accura
cy: 0.8842 - val_loss: 0.3628 - val_accuracy: 0.8698
Epoch 6/10
938/938 [==============================] - 1s 1ms/step - loss: 0.2982 - accura
cy: 0.8910 - val_loss: 0.3684 - val_accuracy: 0.8645
Epoch 7/10
938/938 [==============================] - 1s 1ms/step - loss: 0.2825 - accura
cy: 0.8959 - val_loss: 0.3478 - val_accuracy: 0.8741
Epoch 8/10
938/938 [==============================] - 1s 1ms/step - loss: 0.2700 - accura
cy: 0.8990 - val_loss: 0.3608 - val_accuracy: 0.8686
Epoch 9/10
938/938 [==============================] - 1s 1ms/step - loss: 0.2581 - accura
cy: 0.9043 - val_loss: 0.3253 - val_accuracy: 0.8839
Epoch 10/10
938/938 [==============================] - 1s 1ms/step - loss: 0.2457 - accura
cy: 0.9086 - val_loss: 0.3210 - val_accuracy: 0.8855
Duración del entrenamiento: 11.09 segundos
model3.add(keras.layers.Flatten(input_shape=[28,28]))
model3.add(Dense(10, activation='softmax'))
# Compilar el modelo:
model3.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time3 = time.time()
# Entrenar el modelo
history3 = model3.fit(training_images, training_labels, epochs=10, batch_size=6
# Detener el temporizador
end_time3 = time.time()
In [15]: # Crear una matriz con una fila y tres columnas para almacenar los gráficos
fig, axs = plt.subplots(1, 3, figsize=(18, 5))
# Modelo 1
df1 = pd.DataFrame(history1.history)
df1.plot(ax=axs[0], title='Modelo 1', grid=True)
axs[0].set_ylim(0, 1)
# Modelo 2
df2 = pd.DataFrame(history2.history)
df2.plot(ax=axs[1], title='Modelo 2', grid=True)
axs[1].set_ylim(0, 1)
# Modelo 3
df3 = pd.DataFrame(history3.history)
df3.plot(ax=axs[2], title='Modelo 3', grid=True)
axs[2].set_ylim(0, 1)
plt.tight_layout()
plt.show()
print(results)
Modelo Loss Accuracy Val Loss Val Accuracy Training Duration (s)
0 Modelo 1 0.271734 0.900000 0.333485 0.8791 6.249813
1 Modelo 2 0.245740 0.908550 0.320959 0.8855 11.088078
2 Modelo 3 0.236681 0.911817 0.339533 0.8798 18.354863
pregunta 4.1 (0.5 puntos): ¿Cual es el impacto que tiene la red neuronal? Tu respuesta a la
pregunta 4.1 aquí:
Los resultados de Loss y Accuracy aumentan conforme aumenta el número de neuronas en
la red neuronal. Sin embargo, la mejora no es significativa respecto al aumento en el número
de cálculos de cada caso. Se observa también que el incremento en el número de neuronas
tiene incidencia directa sobre el tiempo de procesamiento.
Si ahora entrenais el modelo de esta forma (con 512 y 1024 neuronas en la capa oculta) y
volveis a ejecutar el predictor guardado en la variable classifications, escribir el código del
clasificador del ejercicio 1 de nuevo e imprimid el primer objeto guardado en la variable
classifications.
pregunta 4.2 (0.25 puntos):
¿En que clase esta clasificado ahora la primera prenda de vestir de la variable
classifications?
pregunta 4.3 (0.25 puntos):
¿Porque crees que ha ocurrido esto?
In [16]: ### Tu código del clasificador de la pregunta 5 aquí ###
print(classifications2[0])
print(classifications3[0])
5: Capa Flatten
En este ejercicio vamos a ver que ocurre cuando quitamos la capa flatten, para ello, escribe
la red neuronal de la pregunta 1 y no pongas la capa Flatten.
pregunta 5 (0.5 puntos): ¿puedes explicar porque da el error que da?
In [18]: ### Tu código de la red neuronal sin capa flatten de la pregunta 6 aquí ###
model4 = keras.models.Sequential()
#model1.add(keras.layers.Flatten(input_shape=[28,28]))
model4.add(Dense(10, activation='softmax'))
# Compilar el modelo:
model4.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Entrenar el modelo:
history4 = model4.fit(training_images, training_labels, epochs=10, batch_size=6
Epoch 1/10
---------------------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
Cell In[18], line 17
13 model4.compile(loss='sparse_categorical_crossentropy', optimizer='ada
m', metrics=['accuracy'])
16 # Entrenar el modelo:
---> 17 history4 = model4.fit(training_images, training_labels, epochs=10, bat
ch_size=64, validation_data = (test_images, test_labels))
File ~/anaconda3/lib/python3.10/site-packages/keras/src/utils/traceback_utils.
py:70, in filter_traceback.<locals>.error_handler(*args, **kwargs)
67 filtered_tb = _process_traceback_frames(e.__traceback__)
68 # To get the full stack trace, call:
69 # `tf.debugging.disable_traceback_filtering()`
---> 70 raise e.with_traceback(filtered_tb) from None
71 finally:
72 del filtered_tb
File ~/anaconda3/lib/python3.10/site-packages/tensorflow/python/eager/execute.
py:60, in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
53 # Convert any objects of type core_types.Tensor to Tensor.
54 inputs = [
55 tensor_conversion_registry.convert(t)
56 if isinstance(t, core_types.Tensor)
57 else t
58 for t in inputs
59 ]
---> 60 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_nam
e,
61 inputs, attrs, num_outputs)
62 except core._NotOkStatusException as e:
63 if name is not None:
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel_launcher.
py", line 17, in <module>
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/traitlets/config/ap
plication.py", line 992, in launch_instance
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelap
p.py", line 711, in start
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/tornado/platform/as
yncio.py", line 199, in start
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 510, in dispatch_queue
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 499, in process_one
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 406, in dispatch_shell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 729, in execute_request
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/ipkernel.
py", line 411, in do_execute
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/zmqshell.
py", line 531, in run_cell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 2961, in run_cell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3016, in _run_cell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/async_
helpers.py", line 129, in _pseudo_sync_runner
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3221, in run_cell_async
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3400, in run_ast_nodes
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3460, in run_code
File "/var/folders/dh/xbnl7h7x6dn68sbq_kxqsvc80000gn/T/ipykernel_2778/232782
3463.py", line 17, in <module>
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/utils/tra
ceback_utils.py", line 65, in error_handler
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1783, in fit
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1377, in train_function
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1360, in step_function
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1349, in run_step
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1127, in train_step
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/co
mpile_utils.py", line 277, in __call__
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/losses.p
y", line 143, in __call__
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/losses.p
y", line 270, in call
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/losses.p
y", line 2454, in sparse_categorical_crossentropy
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/backend.p
y", line 5777, in sparse_categorical_crossentropy
logits and labels must have the same first dimension, got logits shape [1792,1
0] and labels shape [64]
[[{{node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWit
hLogits/SparseSoftmaxCrossEntropyWithLogits}}]] [Op:__inference_train_function
_169774]
model_19 = keras.models.Sequential()
model_19.add(keras.layers.Flatten(input_shape=[28,28]))
model_19.add(Dense(5, activation='softmax'))
# Entrenar el modelo
history_19 = model_19.fit(training_images, training_labels, epochs=10, batch_si
Epoch 1/10
2023-10-22 23:06:12.393444: W tensorflow/core/framework/op_kernel.cc:1839] OP_
REQUIRES failed at sparse_xent_op.cc:103 : INVALID_ARGUMENT: Received a label
value of 9 which is outside the valid range of [0, 5). Label values: 2 2 4 7
7 8 5 3 4 8 8 1 4 2 3 1 1 0 6 3 7 5 6 9 0 8 9 0 8 7 9 5 5 7 9 0 7 4 8 8 1 1 9
3 3 0 5 2 2 6 7 0 3 5 4 3 8 9 5 1 6 3 8 0
---------------------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
Cell In[22], line 17
13 model_19.compile(loss='sparse_categorical_crossentropy', optimizer='ad
am', metrics=['accuracy'])
16 # Entrenar el modelo
---> 17 history_19 = model_19.fit(training_images, training_labels, epochs=10,
batch_size=64, validation_data = (test_images, test_labels))
File ~/anaconda3/lib/python3.10/site-packages/keras/src/utils/traceback_utils.
py:70, in filter_traceback.<locals>.error_handler(*args, **kwargs)
67 filtered_tb = _process_traceback_frames(e.__traceback__)
68 # To get the full stack trace, call:
69 # `tf.debugging.disable_traceback_filtering()`
---> 70 raise e.with_traceback(filtered_tb) from None
71 finally:
72 del filtered_tb
File ~/anaconda3/lib/python3.10/site-packages/tensorflow/python/eager/execute.
py:60, in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
53 # Convert any objects of type core_types.Tensor to Tensor.
54 inputs = [
55 tensor_conversion_registry.convert(t)
56 if isinstance(t, core_types.Tensor)
57 else t
58 for t in inputs
59 ]
---> 60 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_nam
e,
61 inputs, attrs, num_outputs)
62 except core._NotOkStatusException as e:
63 if name is not None:
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel_launcher.
py", line 17, in <module>
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/traitlets/config/ap
plication.py", line 992, in launch_instance
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelap
p.py", line 711, in start
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/tornado/platform/as
yncio.py", line 199, in start
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 510, in dispatch_queue
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 499, in process_one
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 406, in dispatch_shell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/kernelbas
e.py", line 729, in execute_request
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/ipkernel.
py", line 411, in do_execute
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/ipykernel/zmqshell.
py", line 531, in run_cell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 2961, in run_cell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3016, in _run_cell
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/async_
helpers.py", line 129, in _pseudo_sync_runner
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3221, in run_cell_async
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3400, in run_ast_nodes
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/IPython/core/intera
ctiveshell.py", line 3460, in run_code
File "/var/folders/dh/xbnl7h7x6dn68sbq_kxqsvc80000gn/T/ipykernel_2778/186461
4145.py", line 17, in <module>
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/utils/tra
ceback_utils.py", line 65, in error_handler
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1783, in fit
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1377, in train_function
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1360, in step_function
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1349, in run_step
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/tr
aining.py", line 1127, in train_step
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/engine/co
mpile_utils.py", line 277, in __call__
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/losses.p
y", line 143, in __call__
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/losses.p
y", line 270, in call
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/losses.p
y", line 2454, in sparse_categorical_crossentropy
File "/Users/jmvt/anaconda3/lib/python3.10/site-packages/keras/src/backend.p
y", line 5777, in sparse_categorical_crossentropy
Received a label value of 9 which is outside the valid range of [0, 5). Label
values: 2 2 4 7 7 8 5 3 4 8 8 1 4 2 3 1 1 0 6 3 7 5 6 9 0 8 9 0 8 7 9 5 5 7 9
0 7 4 8 8 1 1 9 3 3 0 5 2 2 6 7 0 3 5 4 3 8 9 5 1 6 3 8 0
[[{{node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWit
hLogits/SparseSoftmaxCrossEntropyWithLogits}}]] [Op:__inference_train_function
_237854]
7:neuronal
Aumento de epoch y su efecto en la red
En este ejercicio vamos a ver el impacto de aumentar los epoch en el entrenamiento.
Usando la red neuronal de la pregunta 1:
pregunta 7.1 (0.15 puntos)
Intentad 15 epoch para su entrenamiento, probablemente obtendras un modelo con una
pérdida mucho mejor que el que tiene 5.
localhost:8888/lab/tree/OneDrive - UNIR/UNIR/MASTER/INTELIGENCIA ARTIFICIAL/SISTEMAS COGNITIVOS ARTIFICIALES/ACTIVIDAD 1/Activida… 23/57
22/10/23, 23:31 Actividad_1_Redes_Neuronales_Artificiales_ANN
model5 = keras.models.Sequential()
model5.add(keras.layers.Flatten(input_shape=[28,28]))
model5.add(Dense(10, activation='softmax'))
# Compilar el modelo:
model5.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time5 = time.time()
# Entrenar el modelo
history5 = model5.fit(training_images, training_labels, epochs=15, batch_size=6
# Detener el temporizador
end_time5 = time.time()
model6 = keras.models.Sequential()
model6.add(keras.layers.Flatten(input_shape=[28,28]))
model6.add(Dense(10, activation='softmax'))
# Compilar el modelo
model6.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time6 = time.time()
# Entrenar el modelo
history6 = model6.fit(training_images, training_labels, epochs=30, batch_size=6
# Detener el temporizador
end_time6 = time.time()
In [27]: # Crear una matriz con una fila y tres columnas para almacenar los gráficos
fig, axs = plt.subplots(1, 3, figsize=(18, 5))
# Modelo 1
df1 = pd.DataFrame(history1.history)
df1.plot(ax=axs[0], title='Modelo 1', grid=True)
axs[0].set_ylim(0, 1)
# Modelo 5
df5 = pd.DataFrame(history5.history)
df5.plot(ax=axs[1], title='Modelo 5', grid=True)
axs[1].set_ylim(0, 1)
# Modelo 6
df6 = pd.DataFrame(history6.history)
df6.plot(ax=axs[2], title='Modelo 6', grid=True)
axs[2].set_ylim(0, 1)
plt.tight_layout()
plt.show()
print(results)
Modelo Loss Accuracy Val Loss Val Accuracy Training Duration (s)
0 Modelo 1 0.271734 0.900000 0.333485 0.8791 6.249813
1 Modelo 5 0.235046 0.913783 0.326567 0.8837 9.601142
2 Modelo 6 0.165969 0.940583 0.330657 0.8854 17.750523
8: Early stop
localhost:8888/lab/tree/OneDrive - UNIR/UNIR/MASTER/INTELIGENCIA ARTIFICIAL/SISTEMAS COGNITIVOS ARTIFICIALES/ACTIVIDAD 1/Activida… 29/57
22/10/23, 23:31 Actividad_1_Redes_Neuronales_Artificiales_ANN
En el ejercicio anterior, cuando entrenabas con epoch extras, tenías un problema en el que
tu pérdida podía cambiar. Puede que te haya llevado un poco de tiempo esperar a que el
entrenamiento lo hiciera, y puede que hayas pensado "¿no estaría bien si pudiera parar el
entrenamiento cuando alcance un valor deseado?", es decir, una precisión del 85% podría
ser suficiente para ti, y si alcanzas eso después de 3 epoch, ¿por qué sentarte a esperar a
que termine muchas más épocas? Como cualquier otro programa existen formas de parar la
ejecución
A partir del código de ejemplo, hacer una nueva función que tenga en cuenta la perdida
(loss) y que pueda parar el código para evitar que ocurra el efeto secundario que vimos en
el ejercicio 5.
In [28]: ### Ejemplo de código
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('accuracy')> 0.85):
print("\nAlcanzado el 85% de precisión, se cancela el entrenamien
self.model.stop_training = True
Ejercicio 8 (0.75 puntos): Completa el siguiente código con una clase callback que una
vez alcanzado el 40% de perdida detenga el entrenamiento.
In [29]: import tensorflow as tf
print(tf.__version__)
class MyLossCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if logs.get('loss') <= 0.4:
print("\nPérdida menor o igual al 40%, se cancela el entrenamiento
self.model.stop_training = True
callbacks = MyLossCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_dat
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn
tf.keras.layers.Dense(10, activation=tf.nn
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
9. Unidades de activación
En este ejercicio, vamos a evaluar la importancia de utilizar las unidades de activación
adecuadas. Como hemos visto en clase, funciones de activación como sigmoid han dejado
de utilizarse en favor de otras unidades como ReLU.
Ejercicio 9 (0.75 puntos): Partiendo de una red sencilla como la desarrollada en el Trabajo
1, escribir un breve análisis comparando la utilización de unidades sigmoid y ReLU (por
ejemplo, se pueden comentar aspectos como velocidad de convergencia, métricas
obtenidas...). Explicar por qué pueden darse estas diferencias. Opcionalmente, comparar
con otras activaciones disponibles en Keras.
Pista: Usando redes más grandes se hace más sencillo apreciar las diferencias. Es mejor
utilizar al menos 3 o 4 capas densas.
In [30]: ## Tu código y comentarios de texto aquí
## Puedes incluir tantas celdas como quieras
## No olvides utilizar celdas de Markdown para texto
model7 = keras.models.Sequential()
# Compilar el modelo
model7.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time7 = time.time()
# Entrenar el modelo
history7 = model7.fit(training_images, training_labels, epochs=10, batch_size=6
Epoch 1/10
938/938 [==============================] - 1s 659us/step - loss: 0.5233 - accu
racy: 0.8182 - val_loss: 0.4544 - val_accuracy: 0.8403
Epoch 2/10
938/938 [==============================] - 1s 607us/step - loss: 0.3901 - accu
racy: 0.8609 - val_loss: 0.4075 - val_accuracy: 0.8563
Epoch 3/10
938/938 [==============================] - 1s 603us/step - loss: 0.3517 - accu
racy: 0.8727 - val_loss: 0.3645 - val_accuracy: 0.8694
Epoch 4/10
938/938 [==============================] - 1s 598us/step - loss: 0.3243 - accu
racy: 0.8820 - val_loss: 0.3729 - val_accuracy: 0.8623
Epoch 5/10
938/938 [==============================] - 1s 600us/step - loss: 0.3055 - accu
racy: 0.8879 - val_loss: 0.3756 - val_accuracy: 0.8657
Epoch 6/10
938/938 [==============================] - 1s 597us/step - loss: 0.2910 - accu
racy: 0.8944 - val_loss: 0.3509 - val_accuracy: 0.8754
Epoch 7/10
938/938 [==============================] - 1s 601us/step - loss: 0.2778 - accu
racy: 0.8981 - val_loss: 0.3350 - val_accuracy: 0.8810
Epoch 8/10
938/938 [==============================] - 1s 605us/step - loss: 0.2663 - accu
racy: 0.9011 - val_loss: 0.3365 - val_accuracy: 0.8835
Epoch 9/10
938/938 [==============================] - 1s 598us/step - loss: 0.2590 - accu
racy: 0.9045 - val_loss: 0.3232 - val_accuracy: 0.8835
Epoch 10/10
938/938 [==============================] - 1s 633us/step - loss: 0.2489 - accu
racy: 0.9079 - val_loss: 0.3425 - val_accuracy: 0.8813
Duración del entrenamiento: 5.98 segundos
model8.add(keras.layers.Dense(10, activation='softmax'))
# Compilar el modelo
model8.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time8 = time.time()
# Entrenar el modelo
history8 = model8.fit(training_images, training_labels, epochs=10, batch_size=6
# Detener el temporizador
end_time8 = time.time()
model9.add(keras.layers.Dense(10, activation='softmax'))
# Compilar el modelo
model9.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metric
# Iniciar un temporizador
start_time9 = time.time()
# Entrenar el modelo
history9 = model9.fit(training_images, training_labels, epochs=10, batch_size=6
# Detener el temporizador
end_time9 = time.time()
# Modelo 1
df1 = pd.DataFrame(history1.history)
df1.plot(ax=axs[0], title= 'Modelo 1: Sigmoid, 1 Capa', grid=True)
axs[0].set_ylim(0, 1)
# Modelo 7
df7 = pd.DataFrame(history7.history)
df7.plot(ax=axs[1], title= 'Modelo 7: ReLU, 1 Capa', grid=True)
axs[1].set_ylim(0, 1)
# Modelo 8
df8 = pd.DataFrame(history8.history)
df8.plot(ax=axs[2], title= 'Modelo 8: ReLU, 3 Capas', grid=True)
axs[2].set_ylim(0, 1)
# Modelo 9
df9 = pd.DataFrame(history9.history)
df9.plot(ax=axs[3], title='Modelo 9: ReLU, 5 Capas', grid=True)
axs[3].set_ylim(0, 1)
plt.tight_layout()
plt.show()
print(results)
Modelo Loss Accuracy Val Loss Val Accuracy Training Duration (s)
0 Modelo 1 0.271734 0.900000 0.333485 0.8791 6.249813
1 Modelo 7 0.248859 0.907900 0.342542 0.8813 5.982485
2 Modelo 8 0.232111 0.911650 0.331654 0.8868 8.669376
3 Modelo 9 0.243188 0.907767 0.339001 0.8778 11.254771
# Capa de salida
model10.add(tf.keras.layers.Dense(10, activation='softmax', kernel_initializer=
# Compilar el modelo
model10.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metri
# Iniciar un temporizador
start_time10 = time.time()
# Entrenar el modelo
history10 = model10.fit(training_images, training_labels, epochs=10, batch_size
# Detener el temporizador
end_time10 = time.time()
Epoch 1/10
938/938 [==============================] - 1s 654us/step - loss: 2.3027 - accu
racy: 0.0964 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 2/10
938/938 [==============================] - 1s 601us/step - loss: 2.3027 - accu
racy: 0.0995 - val_loss: 2.3027 - val_accuracy: 0.1000
Epoch 3/10
938/938 [==============================] - 1s 605us/step - loss: 2.3027 - accu
racy: 0.0980 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 4/10
938/938 [==============================] - 1s 605us/step - loss: 2.3027 - accu
racy: 0.0979 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 5/10
938/938 [==============================] - 1s 602us/step - loss: 2.3027 - accu
racy: 0.0994 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 6/10
938/938 [==============================] - 1s 599us/step - loss: 2.3027 - accu
racy: 0.0991 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 7/10
938/938 [==============================] - 1s 599us/step - loss: 2.3027 - accu
racy: 0.0978 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 8/10
938/938 [==============================] - 1s 598us/step - loss: 2.3027 - accu
racy: 0.0992 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 9/10
938/938 [==============================] - 1s 608us/step - loss: 2.3027 - accu
racy: 0.0963 - val_loss: 2.3026 - val_accuracy: 0.1000
Epoch 10/10
938/938 [==============================] - 1s 600us/step - loss: 2.3027 - accu
racy: 0.0966 - val_loss: 2.3026 - val_accuracy: 0.1000
Duración del entrenamiento: 5.97 segundos
Se puede observar que bajo esta inicialización en ceros, la red prácticamente no aprende.
Los resultados de accuracy son muy bajos respecto a otras inicializaciones, así como los
resultados de loss son demasiado altos.
In [39]: # Crear el modelo y compilarlo con inicialización aleatoria normal
model11 = tf.keras.models.Sequential()
# Compilar el modelo
model11.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metri
# Iniciar un temporizador
start_time11 = time.time()
# Entrenar el modelo
history11 = model11.fit(training_images, training_labels, epochs=10, batch_size
# Detener el temporizador
end_time11 = time.time()
# Compilar el modelo
model12.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metri
# Iniciar un temporizador
start_time12 = time.time()
# Entrenar el modelo
history12 = model12.fit(training_images, training_labels, epochs=10, batch_size
# Detener el temporizador
end_time12 = time.time()
In [43]: # Crear un DataFrame con los resultados de pérdida y precisión de cada modelo
results = pd.DataFrame({
print(results)
11. Optimizadores
Ejercicio 11 (0.75 puntos): Partiendo de una red similar a la del ejercicio anterior (utilizando
la mejor estrategia de inicialización observada), comparar y analizar las diferencias que se
observan al entrenar con varios de los optimizadores vistos en clase, incluyendo SGD como
optimizador básico (se puede explorar el espacio de hiperparámetros de cada optimizador,
aunque para optimizadores más avanzados del estilo de adam y RMSprop es buena idea
dejar los valores por defecto provistos por Keras).
In [44]: ## Tu código y comentarios de texto aquí
## Puedes incluir tantas celdas como quieras
## No olvides utilizar celdas de Markdown para texto
# Compilar el modelo
model13.compile(loss='sparse_categorical_crossentropy', optimizer = tf.keras.op
# Entrenar el modelo
history13 = model13.fit(training_images, training_labels, epochs=10, batch_size
# Detener el temporizador
end_time13 = time.time()
Epoch 1/10
938/938 [==============================] - 1s 585us/step - loss: 0.8725 - accu
racy: 0.7196 - val_loss: 0.6524 - val_accuracy: 0.7755
Epoch 2/10
938/938 [==============================] - 0s 528us/step - loss: 0.5791 - accu
racy: 0.8068 - val_loss: 0.5655 - val_accuracy: 0.8066
Epoch 3/10
938/938 [==============================] - 0s 531us/step - loss: 0.5203 - accu
racy: 0.8226 - val_loss: 0.5253 - val_accuracy: 0.8193
Epoch 4/10
938/938 [==============================] - 0s 531us/step - loss: 0.4896 - accu
racy: 0.8331 - val_loss: 0.5150 - val_accuracy: 0.8191
Epoch 5/10
938/938 [==============================] - 0s 529us/step - loss: 0.4697 - accu
racy: 0.8387 - val_loss: 0.5130 - val_accuracy: 0.8179
Epoch 6/10
938/938 [==============================] - 0s 532us/step - loss: 0.4546 - accu
racy: 0.8436 - val_loss: 0.4804 - val_accuracy: 0.8324
Epoch 7/10
938/938 [==============================] - 0s 531us/step - loss: 0.4423 - accu
racy: 0.8475 - val_loss: 0.4702 - val_accuracy: 0.8346
Epoch 8/10
938/938 [==============================] - 0s 526us/step - loss: 0.4328 - accu
racy: 0.8505 - val_loss: 0.4709 - val_accuracy: 0.8332
Epoch 9/10
938/938 [==============================] - 1s 534us/step - loss: 0.4245 - accu
racy: 0.8538 - val_loss: 0.4810 - val_accuracy: 0.8249
Epoch 10/10
938/938 [==============================] - 0s 530us/step - loss: 0.4164 - accu
racy: 0.8562 - val_loss: 0.4609 - val_accuracy: 0.8387
Duración del entrenamiento: 5.24 segundos
# Compilar el modelo
model14.compile(loss='sparse_categorical_crossentropy', optimizer = tf.keras.op
# Iniciar un temporizador
start_time14 = time.time()
# Entrenar el modelo
history14 = model14.fit(training_images, training_labels, epochs=10, batch_size
# Detener el temporizador
end_time14 = time.time()
# Compilar el modelo
model15.compile(loss='sparse_categorical_crossentropy', optimizer = tf.keras.op
# Iniciar un temporizador
start_time15 = time.time()
# Entrenar el modelo
history15 = model15.fit(training_images, training_labels, epochs=10, batch_size
# Detener el temporizador
end_time15 = time.time()
In [50]: # Crear un DataFrame con los resultados de pérdida y precisión de cada modelo
results = pd.DataFrame({
print(results)
Partimos del mejor resultado del caso anterior, el cual utiliza la función de activación ReLU.
Sobre este modelo, se varía los optimizadores entre SGD, Adam y RMSprop. De los
anteriores, los tiempos de ejecución no son particularmente diferentes entre si, los
resultados tampoco tienen variaciones importantes, salvo el caso de la aplicación SGD, el
cual obtiene los peores resultados tanto en accuracy como en Loss
A continuación, se resumirá el resultato de todos los procesos de modelado. De tal forma
que pueda apreciarse una comparativa entre todos.
RESUMEN DE RESULTADOS*
In [51]: # Crear un DataFrame con los resultados de pérdida y precisión de cada modelo
results = pd.DataFrame({
'Modelo': ['Modelo 1: Base', 'Modelo 2: 512 Neuronas', 'Modelo 3: 1024 Neur
'Modelo 6: 30 Epochs','Modelo 7: Activación ReLU','Modelo 8: ReL
'Modelo 11: Inicialización - Aleatoria', 'Modelo 12: Inicializac
'Loss': [history1.history['loss'][-1],history2.history['loss'][-1],history3
history5.history['loss'][-1],history6.history['loss'][-1],
history7.history['loss'][-1],history8.history['loss'][-1],history9
history10.history['loss'][-1],history11.history['loss'][-1],histo
history13.history['loss'][-1], history14.history['loss'][-1], hist
'Accuracy': [history1.history['accuracy'][-1],history2.history['accuracy']
history5.history['accuracy'][-1],history6.history['accuracy']
history7.history['accuracy'][-1],history8.history['accuracy']
history10.history['accuracy'][-1],history11.history['accuracy
history13.history['accuracy'][-1], history14.history['accuracy
'Val Loss': [history1.history['val_loss'][-1], history2.history['val_loss']
history5.history['val_loss'][-1], history6.history['val_loss']
history7.history['val_loss'][-1], history8.history['val_loss']
history10.history['val_loss'][-1], history11.history['val_loss
history13.history['val_loss'][-1], history14.history['val_loss
'Val Accuracy': [history1.history['val_accuracy'][-1], history2.history['va
history5.history['val_accuracy'][-1], history6.history['val
history7.history['val_accuracy'][-1], history8.history['val
localhost:8888/lab/tree/OneDrive - UNIR/UNIR/MASTER/INTELIGENCIA ARTIFICIAL/SISTEMAS COGNITIVOS ARTIFICIALES/ACTIVIDAD 1/Activida… 50/57
22/10/23, 23:31 Actividad_1_Redes_Neuronales_Artificiales_ANN
history10.history['val_accuracy'][-1], history11.history['v
history13.history['val_accuracy'][-1], history14.history['v
'Training Duration (s)': [training_duration1,training_duration2,training_du
training_duration5,training_duration6,
training_duration7,training_duration8,training_du
training_duration10,training_duration11,training_
training_duration13, training_duration14, trainin
})
print(results.to_string(justify='right'))
De acuerdo con la tabla anterior, puede verse que casi todas las variaciones hechas al
modelo 1 (inicial) tienen incidencia positiva sobre la precisión del mismo. Algunos a
expensas de la multiplicación por 2x o 3x, lo cual connota un aumento en el costo
computacional para la solución.
Los mejores resultados se observan en el aumento a 30 epochs, manejo de 512 neuronas y
con la implementación de 3 capas ocultas.
técnicas de regularización para evitar overfitting. Algunos de los elementos que pueden
tenerse en cuenta son los siguientes.
Número de capas y neuronas por capa
Optimizadores y sus parámetros
Batch size
Unidades de activación
Uso de capas dropout, regularización L2, regularización L1...
Early stopping (se puede aplicar como un callback de Keras, o se puede ver un poco "a
ojo" cuándo el modelo empieza a caer en overfitting y seleccionar el número de epochs
necesarias)
Batch normalization
Si los modelos entrenados anteriormente ya se acercaban al valor requerido de accuracy,
probar distintas estrategias igualmente y comentar los resultados.
Explicar brevemente la estrategia seguida y los modelos probados para obtener el modelo
final, que debe verse entrenado en este Notebook. No es necesario guardar el
entrenamiento de todos los modelos que se han probado, es suficiente con explicar cómo
se ha llegado al modelo final.
In [52]: ## Tu modelo y comentarios de texto aquí
## Puedes incluir tantas celdas como quieras
## No olvides utilizar celdas de Markdown para texto
model20 = keras.models.Sequential()
model20.add(keras.layers.Dense(10, activation='softmax'))
# Compilar el modelo
model20.compile(loss='sparse_categorical_crossentropy', optimizer=tf.keras.opti
# Iniciar un temporizador
start_time20 = time.time()
# Entrenar el modelo
history20 = model20.fit(training_images, training_labels, epochs=50, batch_size
# Detener el temporizador
end_time20 = time.time()
Para obtener el resultado anterior, se combino una colección de las variables modificadas
que mejores incidencias tuvieron sobre los modelos anteriores; buscando balancear la
localhost:8888/lab/tree/OneDrive - UNIR/UNIR/MASTER/INTELIGENCIA ARTIFICIAL/SISTEMAS COGNITIVOS ARTIFICIALES/ACTIVIDAD 1/Activida… 56/57
22/10/23, 23:31 Actividad_1_Redes_Neuronales_Artificiales_ANN
relación costo/beneficio. Se contempló trabajar ReLU como unidad de activación, con 512
neuronas y 3 capas ocultas, además de esto, se implementaron 50 epochs, en materia de
optimizador se empleó RMSprop y para la inicialización de los datos se utilizaron los valores
por defecto de Keras.
Después de todo lo anterior, los resultados no distan demasiado a los obtenidos en los
modelos anteriores. No se alcanza el 90% de precisión, con la configuración actual y a
partir del epoch 21 los datos comienzan a aumentar y disminuir, sin poder alcanzar nunca
un 90% de precisión. Podría decirse que a partir de este punto puede inferirse algún nivel
de sobreajuste en la red.
In [ ]: