<jupyter_start><jupyter_text>Inteligencia Artificial PIA Martes N4Integrantes:*   1637233  <NAME>*   1799790  <NAME>*   1671460  <NAME> *   1852486  <NAME> *   1857520  Eduardo Ortega Corpus Lo primero que se realizo fue importar las librerias que se van a utilizar, en este caso fue la libreria de TensorFlow y posteriormente llamamos a la libreria de Keras la cual nos ayuda y facilita darle estructura a la red neuronal artificial, con esta importamos las funciónes de layers, models y datasets, la cual nos ayuda a descargar el set de datos de CIFAR-100. Igualmente, importamos la libreria de matplotlib, la cual nos ayuda a crear graficas de los resultados obtenidos.Luego descargamos el set de datos CIFAR-100 con la etiqueta de 'coarse', la cual hace que las imagenes del set se clasifiquen por la etiqueta de las 20 superclasses y se descargan la cantidad de imagenes ya establecidas para el entrenamiento y de prueba. Finalmente, ya cuando las imagenes de entrenamiento y de prueba esten guardadas en sus respectivas variables se van normalizar los valores de los pixeles de las imagenes para que sean entre 0 y 1, dividiendolas entre 255, esto hace que el procesamiento de los datos sea mas sencillo para el entrenamiento de la red neuronal artificial.<jupyter_code>import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar100.load_data(label_mode='coarse')

# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0<jupyter_output>Downloading data from https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz
169009152/169001437 [==============================] - 11s 0us/step
169017344/169001437 [==============================] - 11s 0us/step<jupyter_text>Se guardo en una lista los nombres de las 20 superclases para posteriormente verificar que el conjunto de datos se vea correcto. Para esto se imprimieron las primeras 25 imágenes del conjunto de entrenamiento y se mostro el nombre de la superclase debajo de cada imagen.<jupyter_code>super_names= ['aquatic_mammals', 'fish', 'flowers', 'food_containers', 'fruit_and_vegetables',
                             'household_electrical_devices', 'household_furniture', 'insects', 'large_carnivores', 
                             'large_man-made_outdoor_things', 'large_natural_outdoor_scenes', 'large_omnivores_and_herbivores',
                             'medium_mammals', 'non-insect_invertebrates', 'people', 'reptiles', 'small_mammals', 'trees', 
                             'vehicles_1', 'vehicles_2']

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i])
    # The CIFAR labels happen to be arrays, 
    # which is why you need the extra index
    plt.xlabel(super_names[train_labels[i][0]])
plt.show()<jupyter_output><empty_output><jupyter_text>Aqui ya se comienza a crear la red neuronal convolucional, en donde se extraen caracteristicas y modificando un poco las imagenes inciales, guardando capa por capa de nuestro modelo secuencial en la variable model. En este modelo se utilizaron 4 capas de Conv2D con filtro de (3,3), con diferente numero de neuronas cada una y la función de activación relu y 3 capas de MaxPooling2D con un filtro de (2,2). Finalmente, se imprimió el resumen de las capas que tiene nuestra red.<jupyter_code>model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',padding="same", input_shape=(32, 32, 3)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.Conv2D(256, (3,3), activation="relu"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.MaxPooling2D((2, 2)))

model.summary()<jupyter_output>Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 32, 32, 32)        896       
                                                                 
 conv2d_1 (Conv2D)           (None, 30, 30, 64)        18496     
                                                                 
 conv2d_2 (Conv2D)           (None, 28, 28, 128)       73856     
                                                                 
 conv2d_3 (Conv2D)           (None, 26, 26, 256)       295168    
                                                                 
 max_pooling2d (MaxPooling2D  (None, 13, 13, 256)      0         
 )                                                               
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 6, 6, 256)        0[...]<jupyter_text>Para poder completar el modelo se deben de agregar capas densas. Se agrego una capa de Flatten, la cual nos aplana los pixeles de las imagenes para crear un solo arreglo unideminsional. Luego se agregaron dos capas densas la primera de 128 neuronas con la activación relu y la capa densa de salida con 20 neuronas ya que solo hay 20 superclases sin función de activación. Finalmente, se imprimió el resumen de la estructura de la red neuronal convolucional.<jupyter_code>model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(20))
model.summary()<jupyter_output>Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 32, 32, 32)        896       
                                                                 
 conv2d_1 (Conv2D)           (None, 30, 30, 64)        18496     
                                                                 
 conv2d_2 (Conv2D)           (None, 28, 28, 128)       73856     
                                                                 
 conv2d_3 (Conv2D)           (None, 26, 26, 256)       295168    
                                                                 
 max_pooling2d (MaxPooling2D  (None, 13, 13, 256)      0         
 )                                                               
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 6, 6, 256)        0[...]<jupyter_text>A continuación se compila y se entrena el modelo. En este caso se entreno con 10 epochs y se obtuvo los resultados del accuracy y perdida de entrenamiento y de prueba.<jupyter_code>model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))<jupyter_output>Epoch 1/10
1563/1563 [==============================] - 75s 29ms/step - loss: 2.3728 - accuracy: 0.2618 - val_loss: 2.0356 - val_accuracy: 0.3693
Epoch 2/10
1563/1563 [==============================] - 45s 29ms/step - loss: 1.9155 - accuracy: 0.4028 - val_loss: 1.8270 - val_accuracy: 0.4307
Epoch 3/10
1563/1563 [==============================] - 45s 29ms/step - loss: 1.6945 - accuracy: 0.4693 - val_loss: 1.6662 - val_accuracy: 0.4793
Epoch 4/10
1563/1563 [==============================] - 44s 28ms/step - loss: 1.5429 - accuracy: 0.5145 - val_loss: 1.6255 - val_accuracy: 0.4949
Epoch 5/10
1563/1563 [==============================] - 44s 28ms/step - loss: 1.4193 - accuracy: 0.5513 - val_loss: 1.5812 - val_accuracy: 0.5069
Epoch 6/10
1563/1563 [==============================] - 44s 28ms/step - loss: 1.3246 - accuracy: 0.5804 - val_loss: 1.5312 - val_accuracy: 0.5232
Epoch 7/10
1563/1563 [==============================] - 44s 28ms/step - loss: 1.2348 - accuracy: 0.6073 - val_loss: 1.5237 -[...]<jupyter_text>Aqui utilizamos la función de matplotlib para crear una gráfica que compare los dos valores de presición del entrenamiento y de la prueba. Como se puede observar cada epoch la presición del entrenamiento iba subiendo constantemente hasta llegar a 0.6758, en cambio con la presición de prueba los valores no subieron de igual manera y se llego a 0.5397.<jupyter_code>plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.2, 0.7])
plt.legend(loc='lower right')

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)<jupyter_output>313/313 - 3s - loss: 1.5880 - accuracy: 0.5397 - 3s/epoch - 9ms/step<jupyter_text>Finalemente, se imprimio la exactitud general de toda la red neuronal convolucional.<jupyter_code>print(test_acc)<jupyter_output>0.5396999716758728
StarcoderdataJupyterStructuredCleanDedup