import os
import numpy as np
from tensorflow.keras.preprocessing import image
from keras.models import Model
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.preprocessing import image_dataset_from_directory
BATCH_SIZE = 32
path_train = "frontal_lateral/train"
path_val = "frontal_lateral/validation"
path_test = "frontal_lateral/test"
n_rows = 160
n_cols = 160
train_dataset = image_dataset_from_directory(
path_train,
shuffle=True,
batch_size=BATCH_SIZE,
image_size=(n_rows, n_cols)
)
validation_dataset = image_dataset_from_directory(
path_val,
shuffle=True,
batch_size=BATCH_SIZE,
image_size=(n_rows, n_cols)
)
test_dataset = image_dataset_from_directory(
path_test,
shuffle=True,
batch_size=BATCH_SIZE,
image_size=(n_rows, n_cols)
)
Found 600 files belonging to 2 classes.
Found 200 files belonging to 2 classes.
Found 200 files belonging to 2 classes.
class_names = train_dataset.class_names
print('Etiquetas encontradas: ', class_names)
Etiquetas encontradas: ['frontal', 'lateral']
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
for images, labels in train_dataset.take(1):
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
plt.imshow(images[i].numpy().astype("uint8"))
if labels[i] == 0:
plt.title('Frontal')
elif labels[i] == 1:
plt.title('Lateral')
plt.axis("off")
# Autotune para que no se bloquee la red
AUTOTUNE = tf.data.AUTOTUNE
train_dataset = train_dataset.prefetch(buffer_size=AUTOTUNE)
validation_dataset = validation_dataset.prefetch(buffer_size=AUTOTUNE)
test_dataset = test_dataset.prefetch(buffer_size=AUTOTUNE)
# Vamos a ver valores de intensidad mínimo y máximo de una imagen antes de realizar el escalado
for images, labels in train_dataset.take(1):
print('Intensidad mínima: ', images[0].numpy().min())
print('Intensidad máxima: ', images[0].numpy().max())
Intensidad mínima: 0.0
Intensidad máxima: 255.0
def scaling_normalization(image, label):
image = tf.cast(image/255., tf.float32)
return image, label
train_dataset = train_dataset.map(scaling_normalization)
validation_dataset = validation_dataset.map(scaling_normalization)
test_dataset = test_dataset.map(scaling_normalization)
def create_model():
input_layer = layers.Input(shape=[160,160,3])
layer_conv = layers.Conv2D(filters=16, kernel_size=(3, 3), strides=(1, 1), padding="same", activation="relu")(input_layer)
pool = layers.MaxPool2D(pool_size=(2, 2))(layer_conv)
layer_conv2 = layers.Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding="same", activation="relu")(pool)
pool2 = layers.MaxPool2D(pool_size=(2, 2))(layer_conv2)
layer_conv3 = layers.Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding="same", activation="relu")(pool2)
flatten = layers.Flatten()(layer_conv3)
dense_hidden = layers.Dense(32, activation='relu')(flatten)
dense_output = layers.Dense(1, activation='sigmoid')(dense_hidden)
model_base = Model(inputs=[input_layer], outputs=[dense_output])
return model_base
model_base = create_model()
model_base.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 160, 160, 3)] 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 160, 160, 16) 448
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 80, 80, 16) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 80, 80, 32) 4640
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 40, 40, 32) 0
_________________________________________________________________
conv2d_5 (Conv2D) (None, 40, 40, 64) 18496
_________________________________________________________________
flatten_1 (Flatten) (None, 102400) 0
_________________________________________________________________
dense_2 (Dense) (None, 32) 3276832
_________________________________________________________________
dense_3 (Dense) (None, 1) 33
=================================================================
Total params: 3,300,449
Trainable params: 3,300,449
Non-trainable params: 0
_________________________________________________________________
model_base.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model_base.fit(train_dataset,
epochs=12,
batch_size=32,
validation_data=validation_dataset,
verbose=1)
Epoch 1/12
19/19 [==============================] - 2s 49ms/step - loss: 0.1536 - accuracy: 0.9673 - val_loss: 0.1010 - val_accuracy: 0.9850
Epoch 2/12
19/19 [==============================] - 1s 40ms/step - loss: 0.0431 - accuracy: 0.9893 - val_loss: 0.0441 - val_accuracy: 0.9900
Epoch 3/12
19/19 [==============================] - 1s 40ms/step - loss: 0.0058 - accuracy: 0.9959 - val_loss: 0.0549 - val_accuracy: 0.9900
Epoch 4/12
19/19 [==============================] - 1s 40ms/step - loss: 3.3445e-04 - accuracy: 1.0000 - val_loss: 0.0488 - val_accuracy: 0.9900
Epoch 5/12
19/19 [==============================] - 1s 40ms/step - loss: 2.0022e-04 - accuracy: 1.0000 - val_loss: 0.0472 - val_accuracy: 0.9900
Epoch 6/12
19/19 [==============================] - 1s 40ms/step - loss: 1.4347e-04 - accuracy: 1.0000 - val_loss: 0.0471 - val_accuracy: 0.9900
Epoch 7/12
19/19 [==============================] - 1s 40ms/step - loss: 1.6140e-04 - accuracy: 1.0000 - val_loss: 0.0468 - val_accuracy: 0.9900
Epoch 8/12
19/19 [==============================] - 1s 40ms/step - loss: 1.0973e-04 - accuracy: 1.0000 - val_loss: 0.0477 - val_accuracy: 0.9900
Epoch 9/12
19/19 [==============================] - 1s 40ms/step - loss: 1.2045e-04 - accuracy: 1.0000 - val_loss: 0.0490 - val_accuracy: 0.9900
Epoch 10/12
19/19 [==============================] - 1s 40ms/step - loss: 7.8434e-05 - accuracy: 1.0000 - val_loss: 0.0477 - val_accuracy: 0.9900
Epoch 11/12
19/19 [==============================] - 1s 41ms/step - loss: 6.6087e-05 - accuracy: 1.0000 - val_loss: 0.0550 - val_accuracy: 0.9900
Epoch 12/12
19/19 [==============================] - 1s 40ms/step - loss: 5.1333e-05 - accuracy: 1.0000 - val_loss: 0.0488 - val_accuracy: 0.9900
# Método para la visualización de la exactitud obtenida durante el proceso de entrenamiento tanto en entrenamiento como en validación
def plot_losses(history):
plt.plot(history.history['loss'], label="Entrenamiento")
plt.plot(history.history['val_loss'], label="Validación")
plt.ylabel('Pérdidas')
plt.xlabel('Época')
plt.legend(loc="upper right")
plt.title('Pérdidas durante el entrenamiento')
# Método para la visualización de la exactitud obtenida durante el proceso de entrenamiento tanto en entrenamiento como en validación
def plot_accuracy(history):
plt.plot(history.history['accuracy'], label="Entrenamiento")
plt.plot(history.history['val_accuracy'], label="Validación")
plt.ylabel('Exactitud')
plt.xlabel('Época')
plt.legend(loc="upper right")
plt.title('Exactitud durante el entrenamiento')
plot_losses(history)
plot_accuracy(history)
model_base.save('modelo_base.h5')
def tipoImagen(filepath):
img = image.load_img(filepath, target_size = (160,160))
plt.imshow(img)
Y = image.img_to_array(img)
X = np.expand_dims(Y, axis=0)
result = model_base.predict(X)
print(result[0][0])
if result == 1:
print('Lateral')
elif result == 0:
print('Frontal')
tipoImagen("frontal_lateral/test/frontal/patient01262_study6_view1_frontal.jpg")
0.0
Frontal
tipoImagen("frontal_lateral/test/lateral/patient00336_study1_view2_lateral.jpg")
1.0
Lateral
!pip3 install albumentations
!pip3 install git+https://github.com/mjkvaak/ImageDataAugmentor
Requirement already satisfied: albumentations in /home/julianmelero/.local/lib/python3.8/site-packages (1.1.0)
Requirement already satisfied: numpy>=1.11.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations) (1.19.5)
Requirement already satisfied: qudida>=0.0.4 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations) (0.0.4)
Requirement already satisfied: PyYAML in /usr/lib/python3/dist-packages (from albumentations) (5.3.1)
Requirement already satisfied: scipy in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations) (1.7.3)
Requirement already satisfied: opencv-python-headless>=4.1.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations) (4.5.5.64)
Requirement already satisfied: scikit-image>=0.16.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations) (0.19.2)
Requirement already satisfied: scikit-learn>=0.19.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from qudida>=0.0.4->albumentations) (1.0.2)
Requirement already satisfied: typing-extensions in /home/julianmelero/.local/lib/python3.8/site-packages (from qudida>=0.0.4->albumentations) (3.7.4.3)
Requirement already satisfied: tifffile>=2019.7.26 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations) (2022.5.4)
Requirement already satisfied: imageio>=2.4.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations) (2.19.2)
Requirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations) (9.0.0)
Requirement already satisfied: packaging>=20.0 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations) (21.3)
Requirement already satisfied: PyWavelets>=1.1.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations) (1.3.0)
Requirement already satisfied: networkx>=2.2 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations) (2.6.3)
Requirement already satisfied: joblib>=0.11 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-learn>=0.19.1->qudida>=0.0.4->albumentations) (1.1.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-learn>=0.19.1->qudida>=0.0.4->albumentations) (3.0.0)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /home/julianmelero/.local/lib/python3.8/site-packages (from packaging>=20.0->scikit-image>=0.16.1->albumentations) (3.0.6)
Collecting git+https://github.com/mjkvaak/ImageDataAugmentor
Cloning https://github.com/mjkvaak/ImageDataAugmentor to /tmp/pip-req-build-n_6tz4pz
Running command git clone -q https://github.com/mjkvaak/ImageDataAugmentor /tmp/pip-req-build-n_6tz4pz
Requirement already satisfied: Pillow in /home/julianmelero/.local/lib/python3.8/site-packages (from ImageDataAugmentor==0.0.0) (9.0.0)
Requirement already satisfied: albumentations in /home/julianmelero/.local/lib/python3.8/site-packages (from ImageDataAugmentor==0.0.0) (1.1.0)
Requirement already satisfied: matplotlib in /home/julianmelero/.local/lib/python3.8/site-packages (from ImageDataAugmentor==0.0.0) (3.5.1)
Requirement already satisfied: opencv-python>=4.2 in /home/julianmelero/.local/lib/python3.8/site-packages (from ImageDataAugmentor==0.0.0) (4.5.5.64)
Requirement already satisfied: pandas in /home/julianmelero/.local/lib/python3.8/site-packages (from ImageDataAugmentor==0.0.0) (1.4.0)
Requirement already satisfied: scipy in /home/julianmelero/.local/lib/python3.8/site-packages (from ImageDataAugmentor==0.0.0) (1.7.3)
Requirement already satisfied: qudida>=0.0.4 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations->ImageDataAugmentor==0.0.0) (0.0.4)
Requirement already satisfied: numpy>=1.11.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations->ImageDataAugmentor==0.0.0) (1.19.5)
Requirement already satisfied: PyYAML in /usr/lib/python3/dist-packages (from albumentations->ImageDataAugmentor==0.0.0) (5.3.1)
Requirement already satisfied: opencv-python-headless>=4.1.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations->ImageDataAugmentor==0.0.0) (4.5.5.64)
Requirement already satisfied: scikit-image>=0.16.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from albumentations->ImageDataAugmentor==0.0.0) (0.19.2)
Requirement already satisfied: python-dateutil>=2.7 in /home/julianmelero/.local/lib/python3.8/site-packages (from matplotlib->ImageDataAugmentor==0.0.0) (2.8.2)
Requirement already satisfied: kiwisolver>=1.0.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from matplotlib->ImageDataAugmentor==0.0.0) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /home/julianmelero/.local/lib/python3.8/site-packages (from matplotlib->ImageDataAugmentor==0.0.0) (0.11.0)
Requirement already satisfied: packaging>=20.0 in /home/julianmelero/.local/lib/python3.8/site-packages (from matplotlib->ImageDataAugmentor==0.0.0) (21.3)
Requirement already satisfied: pyparsing>=2.2.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from matplotlib->ImageDataAugmentor==0.0.0) (3.0.6)
Requirement already satisfied: fonttools>=4.22.0 in /home/julianmelero/.local/lib/python3.8/site-packages (from matplotlib->ImageDataAugmentor==0.0.0) (4.28.5)
Requirement already satisfied: pytz>=2020.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from pandas->ImageDataAugmentor==0.0.0) (2021.3)
Requirement already satisfied: typing-extensions in /home/julianmelero/.local/lib/python3.8/site-packages (from qudida>=0.0.4->albumentations->ImageDataAugmentor==0.0.0) (3.7.4.3)
Requirement already satisfied: scikit-learn>=0.19.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from qudida>=0.0.4->albumentations->ImageDataAugmentor==0.0.0) (1.0.2)
Requirement already satisfied: networkx>=2.2 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations->ImageDataAugmentor==0.0.0) (2.6.3)
Requirement already satisfied: tifffile>=2019.7.26 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations->ImageDataAugmentor==0.0.0) (2022.5.4)
Requirement already satisfied: imageio>=2.4.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations->ImageDataAugmentor==0.0.0) (2.19.2)
Requirement already satisfied: PyWavelets>=1.1.1 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-image>=0.16.1->albumentations->ImageDataAugmentor==0.0.0) (1.3.0)
Requirement already satisfied: six>=1.5 in /home/julianmelero/.local/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->ImageDataAugmentor==0.0.0) (1.15.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-learn>=0.19.1->qudida>=0.0.4->albumentations->ImageDataAugmentor==0.0.0) (3.0.0)
Requirement already satisfied: joblib>=0.11 in /home/julianmelero/.local/lib/python3.8/site-packages (from scikit-learn>=0.19.1->qudida>=0.0.4->albumentations->ImageDataAugmentor==0.0.0) (1.1.0)
Building wheels for collected packages: ImageDataAugmentor
Building wheel for ImageDataAugmentor (setup.py) ... done
Created wheel for ImageDataAugmentor: filename=ImageDataAugmentor-0.0.0-py3-none-any.whl size=29623 sha256=6784775159a77bfe5ebd0ed30c471272f47780b0f8c2491ce9254b7f6c6f2837
Stored in directory: /tmp/pip-ephem-wheel-cache-jfpx46w3/wheels/10/e0/ef/1b0b2931bba8bab5273f248bbb7049ffd9ac587cb3a652193b
Successfully built ImageDataAugmentor
Installing collected packages: ImageDataAugmentor
Successfully installed ImageDataAugmentor-0.0.0
import albumentations as A
from ImageDataAugmentor.image_data_augmentor import *
IMG_SIZE = (160,160)
BATCH_SIZE = 32
# Implementamos la rutina de transformaciones
transforms = A.Compose([
A.Rotate(limit=40, p=0.5),
A.RandomBrightnessContrast(p=0.5),
A.HorizontalFlip(p=0.5)
])
# Generador de datos de entrenamiento
train_datagen = ImageDataAugmentor(
augment=transforms,
validation_split=0.2,
seed=123)
# Generador de datos de validación sin aumento de datos
val_datagen = ImageDataAugmentor(
validation_split=0.2,
seed=123)
# Dataset de entrenamiento
train_dataset = train_datagen.flow_from_directory(
path_train,
subset="training",
target_size=IMG_SIZE,
batch_size=BATCH_SIZE,
class_mode='sparse',
shuffle=True)
# Dataset validación
validation_dataset = val_datagen.flow_from_directory(
path_val,
subset="validation",
target_size=IMG_SIZE,
batch_size=BATCH_SIZE,
class_mode='sparse',
shuffle=True)
Found 481 images belonging to 2 classes.
Found 40 images belonging to 2 classes.
train_dataset.show_data()
validation_dataset.show_data()
model_aumento = create_model()
model_aumento.summary()
Model: "model_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) [(None, 160, 160, 3)] 0
_________________________________________________________________
conv2d_6 (Conv2D) (None, 160, 160, 16) 448
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 80, 80, 16) 0
_________________________________________________________________
conv2d_7 (Conv2D) (None, 80, 80, 32) 4640
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 40, 40, 32) 0
_________________________________________________________________
conv2d_8 (Conv2D) (None, 40, 40, 64) 18496
_________________________________________________________________
flatten_2 (Flatten) (None, 102400) 0
_________________________________________________________________
dense_4 (Dense) (None, 32) 3276832
_________________________________________________________________
dense_5 (Dense) (None, 1) 33
=================================================================
Total params: 3,300,449
Trainable params: 3,300,449
Non-trainable params: 0
_________________________________________________________________
model_aumento.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history_aumento = model_aumento.fit(train_dataset,
epochs=12,
batch_size=32,
validation_data=validation_dataset,
verbose=1)
Epoch 1/12
16/16 [==============================] - 2s 69ms/step - loss: 117.7056 - accuracy: 0.5901 - val_loss: 0.1870 - val_accuracy: 0.9750
Epoch 2/12
16/16 [==============================] - 1s 48ms/step - loss: 1.2123 - accuracy: 0.8318 - val_loss: 0.2841 - val_accuracy: 0.9750
Epoch 3/12
16/16 [==============================] - 1s 49ms/step - loss: 0.2571 - accuracy: 0.9205 - val_loss: 0.2075 - val_accuracy: 0.9750
Epoch 4/12
16/16 [==============================] - 1s 50ms/step - loss: 0.1285 - accuracy: 0.9384 - val_loss: 0.3716 - val_accuracy: 0.9750
Epoch 5/12
16/16 [==============================] - 1s 48ms/step - loss: 0.0875 - accuracy: 0.9690 - val_loss: 0.3165 - val_accuracy: 0.9750
Epoch 6/12
16/16 [==============================] - 1s 51ms/step - loss: 0.1079 - accuracy: 0.9611 - val_loss: 0.2852 - val_accuracy: 0.9750
Epoch 7/12
16/16 [==============================] - 1s 47ms/step - loss: 0.0800 - accuracy: 0.9817 - val_loss: 0.2506 - val_accuracy: 0.9750
Epoch 8/12
16/16 [==============================] - 1s 48ms/step - loss: 0.1803 - accuracy: 0.9676 - val_loss: 0.3355 - val_accuracy: 0.9750
Epoch 9/12
16/16 [==============================] - 1s 49ms/step - loss: 0.0526 - accuracy: 0.9791 - val_loss: 0.3098 - val_accuracy: 0.9750
Epoch 10/12
16/16 [==============================] - 1s 48ms/step - loss: 0.0427 - accuracy: 0.9883 - val_loss: 0.2839 - val_accuracy: 0.9750
Epoch 11/12
16/16 [==============================] - 1s 48ms/step - loss: 0.0911 - accuracy: 0.9844 - val_loss: 0.2618 - val_accuracy: 0.9750
Epoch 12/12
16/16 [==============================] - 1s 48ms/step - loss: 0.1138 - accuracy: 0.9616 - val_loss: 0.3111 - val_accuracy: 0.9750
plot_losses(history_aumento)
plot_accuracy(history_aumento)
IMG_SHAPE = IMG_SIZE + (3,)
base_mobile = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
include_top=False,
weights='imagenet')
base_mobile.summary()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_160_no_top.h5
9412608/9406464 [==============================] - 0s 0us/step
Model: "mobilenetv2_1.00_160"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_8 (InputLayer) [(None, 160, 160, 3) 0
__________________________________________________________________________________________________
Conv1 (Conv2D) (None, 80, 80, 32) 864 input_8[0][0]
__________________________________________________________________________________________________
bn_Conv1 (BatchNormalization) (None, 80, 80, 32) 128 Conv1[0][0]
__________________________________________________________________________________________________
Conv1_relu (ReLU) (None, 80, 80, 32) 0 bn_Conv1[0][0]
__________________________________________________________________________________________________
expanded_conv_depthwise (Depthw (None, 80, 80, 32) 288 Conv1_relu[0][0]
__________________________________________________________________________________________________
expanded_conv_depthwise_BN (Bat (None, 80, 80, 32) 128 expanded_conv_depthwise[0][0]
__________________________________________________________________________________________________
expanded_conv_depthwise_relu (R (None, 80, 80, 32) 0 expanded_conv_depthwise_BN[0][0]
__________________________________________________________________________________________________
expanded_conv_project (Conv2D) (None, 80, 80, 16) 512 expanded_conv_depthwise_relu[0][0
__________________________________________________________________________________________________
expanded_conv_project_BN (Batch (None, 80, 80, 16) 64 expanded_conv_project[0][0]
__________________________________________________________________________________________________
block_1_expand (Conv2D) (None, 80, 80, 96) 1536 expanded_conv_project_BN[0][0]
__________________________________________________________________________________________________
block_1_expand_BN (BatchNormali (None, 80, 80, 96) 384 block_1_expand[0][0]
__________________________________________________________________________________________________
block_1_expand_relu (ReLU) (None, 80, 80, 96) 0 block_1_expand_BN[0][0]
__________________________________________________________________________________________________
block_1_pad (ZeroPadding2D) (None, 81, 81, 96) 0 block_1_expand_relu[0][0]
__________________________________________________________________________________________________
block_1_depthwise (DepthwiseCon (None, 40, 40, 96) 864 block_1_pad[0][0]
__________________________________________________________________________________________________
block_1_depthwise_BN (BatchNorm (None, 40, 40, 96) 384 block_1_depthwise[0][0]
__________________________________________________________________________________________________
block_1_depthwise_relu (ReLU) (None, 40, 40, 96) 0 block_1_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_1_project (Conv2D) (None, 40, 40, 24) 2304 block_1_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_1_project_BN (BatchNormal (None, 40, 40, 24) 96 block_1_project[0][0]
__________________________________________________________________________________________________
block_2_expand (Conv2D) (None, 40, 40, 144) 3456 block_1_project_BN[0][0]
__________________________________________________________________________________________________
block_2_expand_BN (BatchNormali (None, 40, 40, 144) 576 block_2_expand[0][0]
__________________________________________________________________________________________________
block_2_expand_relu (ReLU) (None, 40, 40, 144) 0 block_2_expand_BN[0][0]
__________________________________________________________________________________________________
block_2_depthwise (DepthwiseCon (None, 40, 40, 144) 1296 block_2_expand_relu[0][0]
__________________________________________________________________________________________________
block_2_depthwise_BN (BatchNorm (None, 40, 40, 144) 576 block_2_depthwise[0][0]
__________________________________________________________________________________________________
block_2_depthwise_relu (ReLU) (None, 40, 40, 144) 0 block_2_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_2_project (Conv2D) (None, 40, 40, 24) 3456 block_2_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_2_project_BN (BatchNormal (None, 40, 40, 24) 96 block_2_project[0][0]
__________________________________________________________________________________________________
block_2_add (Add) (None, 40, 40, 24) 0 block_1_project_BN[0][0]
block_2_project_BN[0][0]
__________________________________________________________________________________________________
block_3_expand (Conv2D) (None, 40, 40, 144) 3456 block_2_add[0][0]
__________________________________________________________________________________________________
block_3_expand_BN (BatchNormali (None, 40, 40, 144) 576 block_3_expand[0][0]
__________________________________________________________________________________________________
block_3_expand_relu (ReLU) (None, 40, 40, 144) 0 block_3_expand_BN[0][0]
__________________________________________________________________________________________________
block_3_pad (ZeroPadding2D) (None, 41, 41, 144) 0 block_3_expand_relu[0][0]
__________________________________________________________________________________________________
block_3_depthwise (DepthwiseCon (None, 20, 20, 144) 1296 block_3_pad[0][0]
__________________________________________________________________________________________________
block_3_depthwise_BN (BatchNorm (None, 20, 20, 144) 576 block_3_depthwise[0][0]
__________________________________________________________________________________________________
block_3_depthwise_relu (ReLU) (None, 20, 20, 144) 0 block_3_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_3_project (Conv2D) (None, 20, 20, 32) 4608 block_3_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_3_project_BN (BatchNormal (None, 20, 20, 32) 128 block_3_project[0][0]
__________________________________________________________________________________________________
block_4_expand (Conv2D) (None, 20, 20, 192) 6144 block_3_project_BN[0][0]
__________________________________________________________________________________________________
block_4_expand_BN (BatchNormali (None, 20, 20, 192) 768 block_4_expand[0][0]
__________________________________________________________________________________________________
block_4_expand_relu (ReLU) (None, 20, 20, 192) 0 block_4_expand_BN[0][0]
__________________________________________________________________________________________________
block_4_depthwise (DepthwiseCon (None, 20, 20, 192) 1728 block_4_expand_relu[0][0]
__________________________________________________________________________________________________
block_4_depthwise_BN (BatchNorm (None, 20, 20, 192) 768 block_4_depthwise[0][0]
__________________________________________________________________________________________________
block_4_depthwise_relu (ReLU) (None, 20, 20, 192) 0 block_4_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_4_project (Conv2D) (None, 20, 20, 32) 6144 block_4_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_4_project_BN (BatchNormal (None, 20, 20, 32) 128 block_4_project[0][0]
__________________________________________________________________________________________________
block_4_add (Add) (None, 20, 20, 32) 0 block_3_project_BN[0][0]
block_4_project_BN[0][0]
__________________________________________________________________________________________________
block_5_expand (Conv2D) (None, 20, 20, 192) 6144 block_4_add[0][0]
__________________________________________________________________________________________________
block_5_expand_BN (BatchNormali (None, 20, 20, 192) 768 block_5_expand[0][0]
__________________________________________________________________________________________________
block_5_expand_relu (ReLU) (None, 20, 20, 192) 0 block_5_expand_BN[0][0]
__________________________________________________________________________________________________
block_5_depthwise (DepthwiseCon (None, 20, 20, 192) 1728 block_5_expand_relu[0][0]
__________________________________________________________________________________________________
block_5_depthwise_BN (BatchNorm (None, 20, 20, 192) 768 block_5_depthwise[0][0]
__________________________________________________________________________________________________
block_5_depthwise_relu (ReLU) (None, 20, 20, 192) 0 block_5_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_5_project (Conv2D) (None, 20, 20, 32) 6144 block_5_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_5_project_BN (BatchNormal (None, 20, 20, 32) 128 block_5_project[0][0]
__________________________________________________________________________________________________
block_5_add (Add) (None, 20, 20, 32) 0 block_4_add[0][0]
block_5_project_BN[0][0]
__________________________________________________________________________________________________
block_6_expand (Conv2D) (None, 20, 20, 192) 6144 block_5_add[0][0]
__________________________________________________________________________________________________
block_6_expand_BN (BatchNormali (None, 20, 20, 192) 768 block_6_expand[0][0]
__________________________________________________________________________________________________
block_6_expand_relu (ReLU) (None, 20, 20, 192) 0 block_6_expand_BN[0][0]
__________________________________________________________________________________________________
block_6_pad (ZeroPadding2D) (None, 21, 21, 192) 0 block_6_expand_relu[0][0]
__________________________________________________________________________________________________
block_6_depthwise (DepthwiseCon (None, 10, 10, 192) 1728 block_6_pad[0][0]
__________________________________________________________________________________________________
block_6_depthwise_BN (BatchNorm (None, 10, 10, 192) 768 block_6_depthwise[0][0]
__________________________________________________________________________________________________
block_6_depthwise_relu (ReLU) (None, 10, 10, 192) 0 block_6_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_6_project (Conv2D) (None, 10, 10, 64) 12288 block_6_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_6_project_BN (BatchNormal (None, 10, 10, 64) 256 block_6_project[0][0]
__________________________________________________________________________________________________
block_7_expand (Conv2D) (None, 10, 10, 384) 24576 block_6_project_BN[0][0]
__________________________________________________________________________________________________
block_7_expand_BN (BatchNormali (None, 10, 10, 384) 1536 block_7_expand[0][0]
__________________________________________________________________________________________________
block_7_expand_relu (ReLU) (None, 10, 10, 384) 0 block_7_expand_BN[0][0]
__________________________________________________________________________________________________
block_7_depthwise (DepthwiseCon (None, 10, 10, 384) 3456 block_7_expand_relu[0][0]
__________________________________________________________________________________________________
block_7_depthwise_BN (BatchNorm (None, 10, 10, 384) 1536 block_7_depthwise[0][0]
__________________________________________________________________________________________________
block_7_depthwise_relu (ReLU) (None, 10, 10, 384) 0 block_7_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_7_project (Conv2D) (None, 10, 10, 64) 24576 block_7_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_7_project_BN (BatchNormal (None, 10, 10, 64) 256 block_7_project[0][0]
__________________________________________________________________________________________________
block_7_add (Add) (None, 10, 10, 64) 0 block_6_project_BN[0][0]
block_7_project_BN[0][0]
__________________________________________________________________________________________________
block_8_expand (Conv2D) (None, 10, 10, 384) 24576 block_7_add[0][0]
__________________________________________________________________________________________________
block_8_expand_BN (BatchNormali (None, 10, 10, 384) 1536 block_8_expand[0][0]
__________________________________________________________________________________________________
block_8_expand_relu (ReLU) (None, 10, 10, 384) 0 block_8_expand_BN[0][0]
__________________________________________________________________________________________________
block_8_depthwise (DepthwiseCon (None, 10, 10, 384) 3456 block_8_expand_relu[0][0]
__________________________________________________________________________________________________
block_8_depthwise_BN (BatchNorm (None, 10, 10, 384) 1536 block_8_depthwise[0][0]
__________________________________________________________________________________________________
block_8_depthwise_relu (ReLU) (None, 10, 10, 384) 0 block_8_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_8_project (Conv2D) (None, 10, 10, 64) 24576 block_8_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_8_project_BN (BatchNormal (None, 10, 10, 64) 256 block_8_project[0][0]
__________________________________________________________________________________________________
block_8_add (Add) (None, 10, 10, 64) 0 block_7_add[0][0]
block_8_project_BN[0][0]
__________________________________________________________________________________________________
block_9_expand (Conv2D) (None, 10, 10, 384) 24576 block_8_add[0][0]
__________________________________________________________________________________________________
block_9_expand_BN (BatchNormali (None, 10, 10, 384) 1536 block_9_expand[0][0]
__________________________________________________________________________________________________
block_9_expand_relu (ReLU) (None, 10, 10, 384) 0 block_9_expand_BN[0][0]
__________________________________________________________________________________________________
block_9_depthwise (DepthwiseCon (None, 10, 10, 384) 3456 block_9_expand_relu[0][0]
__________________________________________________________________________________________________
block_9_depthwise_BN (BatchNorm (None, 10, 10, 384) 1536 block_9_depthwise[0][0]
__________________________________________________________________________________________________
block_9_depthwise_relu (ReLU) (None, 10, 10, 384) 0 block_9_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_9_project (Conv2D) (None, 10, 10, 64) 24576 block_9_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_9_project_BN (BatchNormal (None, 10, 10, 64) 256 block_9_project[0][0]
__________________________________________________________________________________________________
block_9_add (Add) (None, 10, 10, 64) 0 block_8_add[0][0]
block_9_project_BN[0][0]
__________________________________________________________________________________________________
block_10_expand (Conv2D) (None, 10, 10, 384) 24576 block_9_add[0][0]
__________________________________________________________________________________________________
block_10_expand_BN (BatchNormal (None, 10, 10, 384) 1536 block_10_expand[0][0]
__________________________________________________________________________________________________
block_10_expand_relu (ReLU) (None, 10, 10, 384) 0 block_10_expand_BN[0][0]
__________________________________________________________________________________________________
block_10_depthwise (DepthwiseCo (None, 10, 10, 384) 3456 block_10_expand_relu[0][0]
__________________________________________________________________________________________________
block_10_depthwise_BN (BatchNor (None, 10, 10, 384) 1536 block_10_depthwise[0][0]
__________________________________________________________________________________________________
block_10_depthwise_relu (ReLU) (None, 10, 10, 384) 0 block_10_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_10_project (Conv2D) (None, 10, 10, 96) 36864 block_10_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_10_project_BN (BatchNorma (None, 10, 10, 96) 384 block_10_project[0][0]
__________________________________________________________________________________________________
block_11_expand (Conv2D) (None, 10, 10, 576) 55296 block_10_project_BN[0][0]
__________________________________________________________________________________________________
block_11_expand_BN (BatchNormal (None, 10, 10, 576) 2304 block_11_expand[0][0]
__________________________________________________________________________________________________
block_11_expand_relu (ReLU) (None, 10, 10, 576) 0 block_11_expand_BN[0][0]
__________________________________________________________________________________________________
block_11_depthwise (DepthwiseCo (None, 10, 10, 576) 5184 block_11_expand_relu[0][0]
__________________________________________________________________________________________________
block_11_depthwise_BN (BatchNor (None, 10, 10, 576) 2304 block_11_depthwise[0][0]
__________________________________________________________________________________________________
block_11_depthwise_relu (ReLU) (None, 10, 10, 576) 0 block_11_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_11_project (Conv2D) (None, 10, 10, 96) 55296 block_11_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_11_project_BN (BatchNorma (None, 10, 10, 96) 384 block_11_project[0][0]
__________________________________________________________________________________________________
block_11_add (Add) (None, 10, 10, 96) 0 block_10_project_BN[0][0]
block_11_project_BN[0][0]
__________________________________________________________________________________________________
block_12_expand (Conv2D) (None, 10, 10, 576) 55296 block_11_add[0][0]
__________________________________________________________________________________________________
block_12_expand_BN (BatchNormal (None, 10, 10, 576) 2304 block_12_expand[0][0]
__________________________________________________________________________________________________
block_12_expand_relu (ReLU) (None, 10, 10, 576) 0 block_12_expand_BN[0][0]
__________________________________________________________________________________________________
block_12_depthwise (DepthwiseCo (None, 10, 10, 576) 5184 block_12_expand_relu[0][0]
__________________________________________________________________________________________________
block_12_depthwise_BN (BatchNor (None, 10, 10, 576) 2304 block_12_depthwise[0][0]
__________________________________________________________________________________________________
block_12_depthwise_relu (ReLU) (None, 10, 10, 576) 0 block_12_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_12_project (Conv2D) (None, 10, 10, 96) 55296 block_12_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_12_project_BN (BatchNorma (None, 10, 10, 96) 384 block_12_project[0][0]
__________________________________________________________________________________________________
block_12_add (Add) (None, 10, 10, 96) 0 block_11_add[0][0]
block_12_project_BN[0][0]
__________________________________________________________________________________________________
block_13_expand (Conv2D) (None, 10, 10, 576) 55296 block_12_add[0][0]
__________________________________________________________________________________________________
block_13_expand_BN (BatchNormal (None, 10, 10, 576) 2304 block_13_expand[0][0]
__________________________________________________________________________________________________
block_13_expand_relu (ReLU) (None, 10, 10, 576) 0 block_13_expand_BN[0][0]
__________________________________________________________________________________________________
block_13_pad (ZeroPadding2D) (None, 11, 11, 576) 0 block_13_expand_relu[0][0]
__________________________________________________________________________________________________
block_13_depthwise (DepthwiseCo (None, 5, 5, 576) 5184 block_13_pad[0][0]
__________________________________________________________________________________________________
block_13_depthwise_BN (BatchNor (None, 5, 5, 576) 2304 block_13_depthwise[0][0]
__________________________________________________________________________________________________
block_13_depthwise_relu (ReLU) (None, 5, 5, 576) 0 block_13_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_13_project (Conv2D) (None, 5, 5, 160) 92160 block_13_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_13_project_BN (BatchNorma (None, 5, 5, 160) 640 block_13_project[0][0]
__________________________________________________________________________________________________
block_14_expand (Conv2D) (None, 5, 5, 960) 153600 block_13_project_BN[0][0]
__________________________________________________________________________________________________
block_14_expand_BN (BatchNormal (None, 5, 5, 960) 3840 block_14_expand[0][0]
__________________________________________________________________________________________________
block_14_expand_relu (ReLU) (None, 5, 5, 960) 0 block_14_expand_BN[0][0]
__________________________________________________________________________________________________
block_14_depthwise (DepthwiseCo (None, 5, 5, 960) 8640 block_14_expand_relu[0][0]
__________________________________________________________________________________________________
block_14_depthwise_BN (BatchNor (None, 5, 5, 960) 3840 block_14_depthwise[0][0]
__________________________________________________________________________________________________
block_14_depthwise_relu (ReLU) (None, 5, 5, 960) 0 block_14_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_14_project (Conv2D) (None, 5, 5, 160) 153600 block_14_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_14_project_BN (BatchNorma (None, 5, 5, 160) 640 block_14_project[0][0]
__________________________________________________________________________________________________
block_14_add (Add) (None, 5, 5, 160) 0 block_13_project_BN[0][0]
block_14_project_BN[0][0]
__________________________________________________________________________________________________
block_15_expand (Conv2D) (None, 5, 5, 960) 153600 block_14_add[0][0]
__________________________________________________________________________________________________
block_15_expand_BN (BatchNormal (None, 5, 5, 960) 3840 block_15_expand[0][0]
__________________________________________________________________________________________________
block_15_expand_relu (ReLU) (None, 5, 5, 960) 0 block_15_expand_BN[0][0]
__________________________________________________________________________________________________
block_15_depthwise (DepthwiseCo (None, 5, 5, 960) 8640 block_15_expand_relu[0][0]
__________________________________________________________________________________________________
block_15_depthwise_BN (BatchNor (None, 5, 5, 960) 3840 block_15_depthwise[0][0]
__________________________________________________________________________________________________
block_15_depthwise_relu (ReLU) (None, 5, 5, 960) 0 block_15_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_15_project (Conv2D) (None, 5, 5, 160) 153600 block_15_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_15_project_BN (BatchNorma (None, 5, 5, 160) 640 block_15_project[0][0]
__________________________________________________________________________________________________
block_15_add (Add) (None, 5, 5, 160) 0 block_14_add[0][0]
block_15_project_BN[0][0]
__________________________________________________________________________________________________
block_16_expand (Conv2D) (None, 5, 5, 960) 153600 block_15_add[0][0]
__________________________________________________________________________________________________
block_16_expand_BN (BatchNormal (None, 5, 5, 960) 3840 block_16_expand[0][0]
__________________________________________________________________________________________________
block_16_expand_relu (ReLU) (None, 5, 5, 960) 0 block_16_expand_BN[0][0]
__________________________________________________________________________________________________
block_16_depthwise (DepthwiseCo (None, 5, 5, 960) 8640 block_16_expand_relu[0][0]
__________________________________________________________________________________________________
block_16_depthwise_BN (BatchNor (None, 5, 5, 960) 3840 block_16_depthwise[0][0]
__________________________________________________________________________________________________
block_16_depthwise_relu (ReLU) (None, 5, 5, 960) 0 block_16_depthwise_BN[0][0]
__________________________________________________________________________________________________
block_16_project (Conv2D) (None, 5, 5, 320) 307200 block_16_depthwise_relu[0][0]
__________________________________________________________________________________________________
block_16_project_BN (BatchNorma (None, 5, 5, 320) 1280 block_16_project[0][0]
__________________________________________________________________________________________________
Conv_1 (Conv2D) (None, 5, 5, 1280) 409600 block_16_project_BN[0][0]
__________________________________________________________________________________________________
Conv_1_bn (BatchNormalization) (None, 5, 5, 1280) 5120 Conv_1[0][0]
__________________________________________________________________________________________________
out_relu (ReLU) (None, 5, 5, 1280) 0 Conv_1_bn[0][0]
==================================================================================================
Total params: 2,257,984
Trainable params: 2,223,872
Non-trainable params: 34,112
__________________________________________________________________________________________________
base_mobile.trainable= False
preprocess_input = tf.keras.applications.mobilenet_v2.preprocess_input
input = layers.Input(shape=(160, 160, 3))
# Capa preprocesado
x = preprocess_input(input)
# Añadimos modelo base
x = base_mobile(x, training=False)
x = layers.GlobalAveragePooling2D()(x)
# Clasificación binaria
output = layers.Dense(1, activation="sigmoid")(x)
model_tl = Model(inputs=[input], outputs=[output])
model_tl.summary()
Model: "model_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_9 (InputLayer) [(None, 160, 160, 3)] 0
_________________________________________________________________
tf.math.truediv_3 (TFOpLambd (None, 160, 160, 3) 0
_________________________________________________________________
tf.math.subtract_3 (TFOpLamb (None, 160, 160, 3) 0
_________________________________________________________________
mobilenetv2_1.00_160 (Functi (None, 5, 5, 1280) 2257984
_________________________________________________________________
global_average_pooling2d (Gl (None, 1280) 0
_________________________________________________________________
dense_8 (Dense) (None, 1) 1281
=================================================================
Total params: 2,259,265
Trainable params: 1,281
Non-trainable params: 2,257,984
_________________________________________________________________
path_models = "./modelos/"
path_experiment = path_models + 'Train/'
# Compilamos
model_tl.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# Inicializamos el callback
model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=path_experiment + 'model.h5',
monitor='val_accuracy',
mode='max',
save_best_only=True,
verbose=1)
# Entrenamos
history_tl = model_tl.fit(train_dataset,
epochs=10,
validation_data=validation_dataset,
callbacks=[model_checkpoint_callback],
verbose=1)
Epoch 1/10
16/16 [==============================] - 5s 150ms/step - loss: 0.5702 - accuracy: 0.6988 - val_loss: 0.2747 - val_accuracy: 0.9500
Epoch 00001: val_accuracy improved from -inf to 0.95000, saving model to ./modelos/Train/model.h5
Epoch 2/10
16/16 [==============================] - 1s 53ms/step - loss: 0.1905 - accuracy: 0.9592 - val_loss: 0.1181 - val_accuracy: 0.9750
Epoch 00002: val_accuracy improved from 0.95000 to 0.97500, saving model to ./modelos/Train/model.h5
Epoch 3/10
16/16 [==============================] - 1s 53ms/step - loss: 0.1019 - accuracy: 0.9907 - val_loss: 0.0834 - val_accuracy: 0.9750
Epoch 00003: val_accuracy did not improve from 0.97500
Epoch 4/10
16/16 [==============================] - 1s 54ms/step - loss: 0.0786 - accuracy: 0.9801 - val_loss: 0.0555 - val_accuracy: 1.0000
Epoch 00004: val_accuracy improved from 0.97500 to 1.00000, saving model to ./modelos/Train/model.h5
Epoch 5/10
16/16 [==============================] - 1s 53ms/step - loss: 0.0551 - accuracy: 0.9895 - val_loss: 0.0399 - val_accuracy: 1.0000
Epoch 00005: val_accuracy did not improve from 1.00000
Epoch 6/10
16/16 [==============================] - 1s 51ms/step - loss: 0.0430 - accuracy: 1.0000 - val_loss: 0.0336 - val_accuracy: 1.0000
Epoch 00006: val_accuracy did not improve from 1.00000
Epoch 7/10
16/16 [==============================] - 1s 52ms/step - loss: 0.0328 - accuracy: 0.9976 - val_loss: 0.0279 - val_accuracy: 1.0000
Epoch 00007: val_accuracy did not improve from 1.00000
Epoch 8/10
16/16 [==============================] - 1s 57ms/step - loss: 0.0261 - accuracy: 1.0000 - val_loss: 0.0229 - val_accuracy: 1.0000
Epoch 00008: val_accuracy did not improve from 1.00000
Epoch 9/10
16/16 [==============================] - 1s 54ms/step - loss: 0.0282 - accuracy: 1.0000 - val_loss: 0.0181 - val_accuracy: 1.0000
Epoch 00009: val_accuracy did not improve from 1.00000
Epoch 10/10
16/16 [==============================] - 1s 51ms/step - loss: 0.0217 - accuracy: 0.9983 - val_loss: 0.0184 - val_accuracy: 1.0000
Epoch 00010: val_accuracy did not improve from 1.00000
# Visualizamos curvas de aprendizaje
plt.figure(figsize=(10, 8))
plt.plot(history_tl.history['accuracy'], label='Entrenamiento')
plt.plot(history_tl.history['val_accuracy'], label='Validación')
plt.title('Exactitud entrenamiento vs. validación')
plt.legend()
# Comparamos curvas de aprendizaje validación
plt.figure(figsize=(10, 8))
plt.plot(history.history['val_accuracy'], label='Sin trans. conocimiento')
plt.plot(history_tl.history['val_accuracy'], label='Con trans. conocimiento')
plt.title('Exactitud sin vs. con transferencia conocimiento (validación)')
plt.legend()
model_tl.save("modelo_transf.h5")