# -*- coding: utf-8 -*- """Copia de Training_fruit_vegetable.ipynb Automatically generated by Colaboratory. Original file is located at https://colab.research.google.com/drive/1h-zNQjkVokq9MDVJb61PPvYb4f1eJcF6 Montaje del disco """ """Importar librerías""" import tensorflow as tf import matplotlib.pyplot as plt """Preprocesamiento de datos""" #Preprocesamiento de imagenes del conjunto de entrenamiento training_set = tf.keras.utils.image_dataset_from_directory( '/content/drive/MyDrive/TallerIII/FruitTrainingDataset/train', labels="inferred", label_mode="categorical", class_names=None, color_mode="rgb", batch_size=32, image_size=(64, 64), shuffle=True, seed=None, validation_split=None, subset=None, interpolation="bilinear", follow_links=False, crop_to_aspect_ratio=False ) #Preprocesamiento de imagenes del conjunto de validacion validation_set = tf.keras.utils.image_dataset_from_directory( '/content/drive/MyDrive/TallerIII/FruitTrainingDataset/validation', labels="inferred", label_mode="categorical", class_names=None, color_mode="rgb", batch_size=32, image_size=(64, 64), shuffle=True, seed=None, validation_split=None, subset=None, interpolation="bilinear", follow_links=False, crop_to_aspect_ratio=False ) """Crear el modelo""" model = tf.keras.models.Sequential() """Capa de convolución""" model.add(tf.keras.layers.Conv2D(filters=32,kernel_size=3,padding='same',activation='relu',input_shape=[64,64,3])) model.add(tf.keras.layers.Conv2D(filters=32,kernel_size=3,activation='relu')) model.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2)) model.add(tf.keras.layers.Dropout(0.25)) model.add(tf.keras.layers.Conv2D(filters=64,kernel_size=3,padding='same',activation='relu')) model.add(tf.keras.layers.Conv2D(filters=64,kernel_size=3,activation='relu')) model.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2)) model.add(tf.keras.layers.Dropout(0.25)) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(units=512,activation='relu')) model.add(tf.keras.layers.Dense(units=256,activation='relu')) model.add(tf.keras.layers.Dropout(0.5)) #To avoid overfitting #Output Layer model.add(tf.keras.layers.Dense(units=36,activation='softmax')) """Capas del modelo""" model.summary() """Compilación del modelo""" model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy',"mean_absolute_error","Precision","Recall",tf.keras.metrics.AUC()]) """Configuración tensorboard""" # Commented out IPython magic to ensure Python compatibility. from tensorflow.keras.callbacks import ModelCheckpoint import tensorflow as tf import datetime # %load_ext tensorboard #!rm -rf ./logs/ log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1) """Ruta""" ruta_rfv="/content/drive/MyDrive/TallerIII/Reconocimiento_frutas_verduras" """Punto de control del modelo y devolución de llamada""" checkpoint_callback = ModelCheckpoint( filepath=ruta_rfv + '/peso2/weights.{epoch:1d}.h5', save_weights_only=True, save_best_only=False, verbose=1 ) """Entrenamiento del modelo""" epochs = 10 history=model.fit(x=training_set,validation_data=validation_set,epochs=epochs, callbacks=[tensorboard_callback, checkpoint_callback]) import os import re #Codigo para extraer el numero maximo de epoca almacenado en un directorio # Ruta del directorio dir_path = "/content/drive/MyDrive/Taller3/Reconocimiento_frutas_verduras/peso2" # Lista para almacenar los números extraídos num_list = [] # Recorrer todos los archivos en el directorio for filename in os.listdir(dir_path): # Comprobar si el archivo es uno de los archivos de pesos if filename.startswith("weights.") and filename.endswith(".h5"): # Extraer el número del nombre del archivo usando una expresión regular match = re.search(r'\d+', filename) if match: # Convertir el número a un entero y añadirlo a la lista num = int(match.group()) num_list.append(num) # Imprimir la lista de números print(num_list) # Variable para almacenar el número máximo max_num = max(num_list) if num_list else None # Imprimir el número máximo print(max_num) max_num_string = str(max_num) print(max_num_string) #Definir directorio que contiene el archivo de pesos de la ultima epoca ruta = ruta_rfv + '/peso2/weights.' + max_num_string +'.h5' print(ruta) #Cargar el archivo de pesos de la ultima epoca ejecutada model.load_weights(ruta) #Entrenar el modelo desde la ultima epoca almacenada usando el parametro initial_epoch history = model.fit(x=training_set,validation_data=validation_set, epochs=epochs, initial_epoch=max_num, callbacks=[tensorboard_callback, checkpoint_callback]) """Curvas de entrenamiento""" # Commented out IPython magic to ensure Python compatibility. # %tensorboard --logdir logs/fit """Evaluar el modelo entrenado""" #Precisión del conjunto de entrenamiento train_loss, train_acc = model.evaluate(training_set) print('Training accuracy:', train_acc) #Precisión del conjunto de validación val_loss, val_acc = model.evaluate(validation_set) print('Validation accuracy:', val_acc) """Guardar el modelo""" ruta_modelo=ruta_rfv + "/modelo/modeloRFV.h5" model.save(ruta_modelo) """Guardar pesos""" ruta_pesos=ruta_rfv + "/modelo/pesosRFV.h5" model.save_weights(ruta_pesos)