Sentinel Satellite Image Classification Project¶
Project Overview¶
This project focuses on the development and deployment of a machine learning application for satellite image classification. The goal is to automate the classification of satellite images into predefined categories that represent different types of land cover.
Motivation¶
End Users¶
The end users of this project are environmental scientists and urban planners.
Goal of End Users¶
Their goal is to utilize automated tools to classify large volumes of satellite imagery quickly and accurately for environmental monitoring and urban planning purposes.
Obstacle to be Solved¶
The main obstacles include the high variability and similarity between different land cover types in satellite images and the volume of data that requires processing.
import tensorflow as tf
tf.__version__
'2.16.1'
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
Num GPUs Available: 1
Data Collection and Augmentation¶
Images Collected¶
The dataset used in this project is the EuroSAT collection, which consists of 30,988 satellite images derived from Sentinel satellites. These images are categorized into ten classes representing different types of land cover: AnnualCrop, Forest, HerbaceousVegetation, Highway, Industrial, Pasture, PermanentCrop, Residential, River, SeaLake.
Description of Splitting Images into Classes/Labeling Images¶
The EuroSAT images come pre-labeled, which facilitates the classification task. The dataset was split into a training set comprising 80% of the images and a validation set comprising 20%, ensuring a comprehensive evaluation of the model across varied image data.
import numpy as np
import keras
from keras import layers
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
def load_data():
train_ds = tf.keras.utils.image_dataset_from_directory(
'data',
validation_split=0.2,
subset="training",
seed=123,
image_size=(64, 64),
batch_size=32,
label_mode='categorical'
)
val_ds = tf.keras.utils.image_dataset_from_directory(
'data',
validation_split=0.2,
subset="validation",
seed=123,
image_size=(64, 64),
batch_size=32,
label_mode='categorical'
)
return train_ds, val_ds, train_ds.class_names
train_ds, val_ds, class_names = load_data()
class_names = train_ds.class_names
print(class_names)
Found 30988 files belonging to 10 classes. Using 24791 files for training. Found 30988 files belonging to 10 classes. Using 6197 files for validation. ['AnnualCrop', 'Forest', 'HerbaceousVegetation', 'Highway', 'Industrial', 'Pasture', 'PermanentCrop', 'Residential', 'River', 'SeaLake']
import matplotlib.pyplot as plt
for images, labels in train_ds.take(1):
plt.figure(figsize=(6, 6))
plt.imshow(images[0].numpy().astype('uint8'))
plt.title(class_names[tf.argmax(labels[0])])
plt.axis('off')
plt.show()
print("Sample pixel values (0 to 1 range):", images[0].numpy().flatten()[0:5])
print("Min and max pixel values:", images[0].numpy().min(), images[0].numpy().max())
Sample pixel values (0 to 1 range): [180. 183. 156. 177. 186.] Min and max pixel values: 74.0 248.0
2024-05-05 01:03:10.842952: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: OUT_OF_RANGE: End of sequence
val_batches = tf.data.experimental.cardinality(val_ds)
test_ds = val_ds.take(val_batches // 5)
validation_ds = val_ds.skip(val_batches // 5)
print('Number of training batches:', tf.data.experimental.cardinality(train_ds).numpy())
print('Number of validation batches:', tf.data.experimental.cardinality(validation_ds).numpy())
print('Number of test batches:', tf.data.experimental.cardinality(test_ds).numpy())
Number of training batches: 775 Number of validation batches: 156 Number of test batches: 38
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
plt.imshow(images[i].numpy().astype("uint8"))
class_index = np.argmax(labels[i])
plt.title(class_names[class_index])
plt.axis("off")
2024-05-05 01:03:10.923071: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: OUT_OF_RANGE: End of sequence
number_of_classes = len(train_ds.class_names)
Data Augmentation Description¶
To enhance the robustness of the model against variations in real-world satellite images, several data augmentation techniques were applied. These included random flips (both horizontal and vertical), random rotations (up to 20 degrees), random zoom (up to 20%), and random contrast adjustments. These techniques help simulate different capture conditions and photographic variations, aiding the model in learning more generalized features.
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
data_augmentation = keras.Sequential([
layers.RandomFlip("horizontal_and_vertical"),
layers.RandomRotation(0.2),
layers.RandomZoom(0.2),
layers.RandomContrast(0.1)
])
def augment_data(dataset):
return dataset.map(lambda x, y: (data_augmentation(x, training=True), y))
import numpy as np
import matplotlib.pyplot as plt
for images, labels in train_ds.take(1):
plt.figure(figsize=(10, 10))
first_image = images[0]
class_index = np.argmax(labels[0])
class_name = class_names[class_index]
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
augmented_image = data_augmentation(np.expand_dims(first_image, 0))
plt.imshow(augmented_image[0].numpy().astype("uint8"))
plt.title(class_name)
plt.axis("off")
2024-05-05 01:03:11.358116: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: OUT_OF_RANGE: End of sequence
dataset_length = tf.data.experimental.cardinality(train_ds).numpy()
print("Length of the TensorFlow dataset:", dataset_length)
Length of the TensorFlow dataset: 775
Model Training¶
Initial Training and Fine Tuning¶
The model's initial training utilized a pre-trained EfficientNetB0 architecture with the top layers tailored for our classification needs. The base model's layers were initially frozen. Fine-tuning was later applied by unfreezing all layers and continuing training, which refined the model's ability to classify complex images more accurately.
Comparison of Performance¶
Initially, the model achieved a validation accuracy of around 92%. Post fine-tuning, this accuracy improved to approximately 94%. This indicates the effectiveness of fine-tuning in enhancing the model's capability to distinguish subtle features in satellite images.
from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Model
from tensorflow.keras.applications import EfficientNetB0
def create_efficientnet_model(input_shape, num_classes):
inputs = keras.Input(shape=input_shape)
scale_layer = keras.layers.Rescaling(scale=1 / 127.5, offset=-1)
x = scale_layer(inputs)
base_model = EfficientNetB0(include_top=False, weights="imagenet", input_tensor=inputs)
base_model.trainable = False
x = layers.GlobalAveragePooling2D()(base_model.output)
x = layers.Dense(512, activation='relu')(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.3)(x)
outputs = layers.Dense(num_classes, activation='softmax')(x)
model = Model(inputs=inputs, outputs=outputs)
return model
def fine_tune_model(model, train_ds, val_ds, epochs):
base_model = model.layers[1]
base_model.trainable = True
model.compile(optimizer=keras.optimizers.Adam(1e-5),
loss='categorical_crossentropy',
metrics=['accuracy'])
history_fine = model.fit(train_ds, epochs=epochs, validation_data=val_ds, callbacks=callbacks)
return history_fine
train_ds = augment_data(train_ds)
model = create_efficientnet_model((64, 64, 3), len(class_names))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
callbacks = [
keras.callbacks.ModelCheckpoint('best_model.keras', save_best_only=True, monitor='val_loss', mode='min'),
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, min_lr=0.00001),
keras.callbacks.EarlyStopping(monitor='val_loss', patience=20, restore_best_weights=True)
]
initial_epochs = 10
history = model.fit(train_ds, validation_data=validation_ds, epochs=initial_epochs, callbacks=callbacks)
Epoch 1/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 56s 62ms/step - accuracy: 0.8013 - loss: 0.6025 - val_accuracy: 0.9022 - val_loss: 0.3121 - learning_rate: 0.0010 Epoch 2/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 38s 49ms/step - accuracy: 0.8930 - loss: 0.3150 - val_accuracy: 0.9083 - val_loss: 0.2748 - learning_rate: 0.0010 Epoch 3/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 51ms/step - accuracy: 0.9116 - loss: 0.2614 - val_accuracy: 0.9187 - val_loss: 0.2372 - learning_rate: 0.0010 Epoch 4/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 43s 55ms/step - accuracy: 0.9210 - loss: 0.2349 - val_accuracy: 0.9179 - val_loss: 0.2646 - learning_rate: 0.0010 Epoch 5/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 50ms/step - accuracy: 0.9255 - loss: 0.2102 - val_accuracy: 0.9239 - val_loss: 0.2526 - learning_rate: 0.0010 Epoch 6/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 35s 46ms/step - accuracy: 0.9359 - loss: 0.1938 - val_accuracy: 0.9261 - val_loss: 0.2490 - learning_rate: 0.0010 Epoch 7/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 37s 48ms/step - accuracy: 0.9340 - loss: 0.1869 - val_accuracy: 0.9209 - val_loss: 0.2702 - learning_rate: 0.0010 Epoch 8/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 36s 47ms/step - accuracy: 0.9416 - loss: 0.1678 - val_accuracy: 0.9231 - val_loss: 0.2535 - learning_rate: 0.0010 Epoch 9/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 37s 48ms/step - accuracy: 0.9444 - loss: 0.1588 - val_accuracy: 0.9219 - val_loss: 0.2727 - learning_rate: 0.0010 Epoch 10/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 50ms/step - accuracy: 0.9485 - loss: 0.1468 - val_accuracy: 0.9171 - val_loss: 0.2794 - learning_rate: 0.0010
epochs = 10
history_fine = fine_tune_model(model, train_ds, validation_ds, epochs)
Epoch 1/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 55s 62ms/step - accuracy: 0.9292 - loss: 0.2041 - val_accuracy: 0.9219 - val_loss: 0.2278 - learning_rate: 1.0000e-05 Epoch 2/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 40s 51ms/step - accuracy: 0.9348 - loss: 0.1898 - val_accuracy: 0.9249 - val_loss: 0.2211 - learning_rate: 1.0000e-05 Epoch 3/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 43s 55ms/step - accuracy: 0.9367 - loss: 0.1840 - val_accuracy: 0.9287 - val_loss: 0.2178 - learning_rate: 1.0000e-05 Epoch 4/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 41s 53ms/step - accuracy: 0.9371 - loss: 0.1831 - val_accuracy: 0.9283 - val_loss: 0.2168 - learning_rate: 1.0000e-05 Epoch 5/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 51ms/step - accuracy: 0.9410 - loss: 0.1729 - val_accuracy: 0.9291 - val_loss: 0.2138 - learning_rate: 1.0000e-05 Epoch 6/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 40s 51ms/step - accuracy: 0.9419 - loss: 0.1698 - val_accuracy: 0.9299 - val_loss: 0.2147 - learning_rate: 1.0000e-05 Epoch 7/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 50ms/step - accuracy: 0.9427 - loss: 0.1690 - val_accuracy: 0.9299 - val_loss: 0.2139 - learning_rate: 1.0000e-05 Epoch 8/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 50ms/step - accuracy: 0.9438 - loss: 0.1659 - val_accuracy: 0.9307 - val_loss: 0.2151 - learning_rate: 1.0000e-05 Epoch 9/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 39s 50ms/step - accuracy: 0.9399 - loss: 0.1711 - val_accuracy: 0.9315 - val_loss: 0.2115 - learning_rate: 1.0000e-05 Epoch 10/10 775/775 ━━━━━━━━━━━━━━━━━━━━ 38s 49ms/step - accuracy: 0.9461 - loss: 0.1608 - val_accuracy: 0.9327 - val_loss: 0.2127 - learning_rate: 1.0000e-05
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.ylabel('Accuracy')
plt.ylim([min(plt.ylim()),1])
plt.title('Training and Validation Accuracy')
plt.subplot(2, 1, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.ylabel('Cross Entropy')
#plt.ylim([0,1.0])
plt.title('Training and Validation Loss')
plt.xlabel('epoch')
plt.show()
acc += history_fine.history['accuracy']
val_acc += history_fine.history['val_accuracy']
loss += history_fine.history['loss']
val_loss += history_fine.history['val_loss']
plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.ylim([0.4, 1]) # set the y-axis limits
plt.plot([initial_epochs-1,initial_epochs-1],
plt.ylim(), label='Start Fine Tuning')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(2, 1, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.plot([initial_epochs-1,initial_epochs-1],
plt.ylim(), label='Start Fine Tuning')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.xlabel('epoch')
plt.show()
print("Test dataset evaluation")
model.evaluate(test_ds)
Test dataset evaluation 38/38 ━━━━━━━━━━━━━━━━━━━━ 1s 34ms/step - accuracy: 0.9317 - loss: 0.2277
[0.19601286947727203, 0.9358552694320679]
print(model.summary())
Model: "functional_15"
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ Connected to ┃ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩ │ input_layer_11 │ (None, 64, 64, 3) │ 0 │ - │ │ (InputLayer) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ rescaling_16 │ (None, 64, 64, 3) │ 0 │ input_layer_11[0… │ │ (Rescaling) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ normalization_5 │ (None, 64, 64, 3) │ 7 │ rescaling_16[0][… │ │ (Normalization) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ rescaling_17 │ (None, 64, 64, 3) │ 0 │ normalization_5[… │ │ (Rescaling) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ stem_conv_pad │ (None, 65, 65, 3) │ 0 │ rescaling_17[0][… │ │ (ZeroPadding2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ stem_conv (Conv2D) │ (None, 32, 32, │ 864 │ stem_conv_pad[0]… │ │ │ 32) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ stem_bn │ (None, 32, 32, │ 128 │ stem_conv[0][0] │ │ (BatchNormalizatio… │ 32) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ stem_activation │ (None, 32, 32, │ 0 │ stem_bn[0][0] │ │ (Activation) │ 32) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_dwconv │ (None, 32, 32, │ 288 │ stem_activation[… │ │ (DepthwiseConv2D) │ 32) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_bn │ (None, 32, 32, │ 128 │ block1a_dwconv[0… │ │ (BatchNormalizatio… │ 32) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_activation │ (None, 32, 32, │ 0 │ block1a_bn[0][0] │ │ (Activation) │ 32) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_se_squeeze │ (None, 32) │ 0 │ block1a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_se_reshape │ (None, 1, 1, 32) │ 0 │ block1a_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_se_reduce │ (None, 1, 1, 8) │ 264 │ block1a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_se_expand │ (None, 1, 1, 32) │ 288 │ block1a_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_se_excite │ (None, 32, 32, │ 0 │ block1a_activati… │ │ (Multiply) │ 32) │ │ block1a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_project_co… │ (None, 32, 32, │ 512 │ block1a_se_excit… │ │ (Conv2D) │ 16) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block1a_project_bn │ (None, 32, 32, │ 64 │ block1a_project_… │ │ (BatchNormalizatio… │ 16) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_expand_conv │ (None, 32, 32, │ 1,536 │ block1a_project_… │ │ (Conv2D) │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_expand_bn │ (None, 32, 32, │ 384 │ block2a_expand_c… │ │ (BatchNormalizatio… │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_expand_act… │ (None, 32, 32, │ 0 │ block2a_expand_b… │ │ (Activation) │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_dwconv_pad │ (None, 33, 33, │ 0 │ block2a_expand_a… │ │ (ZeroPadding2D) │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_dwconv │ (None, 16, 16, │ 864 │ block2a_dwconv_p… │ │ (DepthwiseConv2D) │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_bn │ (None, 16, 16, │ 384 │ block2a_dwconv[0… │ │ (BatchNormalizatio… │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_activation │ (None, 16, 16, │ 0 │ block2a_bn[0][0] │ │ (Activation) │ 96) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_se_squeeze │ (None, 96) │ 0 │ block2a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_se_reshape │ (None, 1, 1, 96) │ 0 │ block2a_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_se_reduce │ (None, 1, 1, 4) │ 388 │ block2a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_se_expand │ (None, 1, 1, 96) │ 480 │ block2a_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_se_excite │ (None, 16, 16, │ 0 │ block2a_activati… │ │ (Multiply) │ 96) │ │ block2a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_project_co… │ (None, 16, 16, │ 2,304 │ block2a_se_excit… │ │ (Conv2D) │ 24) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2a_project_bn │ (None, 16, 16, │ 96 │ block2a_project_… │ │ (BatchNormalizatio… │ 24) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_expand_conv │ (None, 16, 16, │ 3,456 │ block2a_project_… │ │ (Conv2D) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_expand_bn │ (None, 16, 16, │ 576 │ block2b_expand_c… │ │ (BatchNormalizatio… │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_expand_act… │ (None, 16, 16, │ 0 │ block2b_expand_b… │ │ (Activation) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_dwconv │ (None, 16, 16, │ 1,296 │ block2b_expand_a… │ │ (DepthwiseConv2D) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_bn │ (None, 16, 16, │ 576 │ block2b_dwconv[0… │ │ (BatchNormalizatio… │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_activation │ (None, 16, 16, │ 0 │ block2b_bn[0][0] │ │ (Activation) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_se_squeeze │ (None, 144) │ 0 │ block2b_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_se_reshape │ (None, 1, 1, 144) │ 0 │ block2b_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_se_reduce │ (None, 1, 1, 6) │ 870 │ block2b_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_se_expand │ (None, 1, 1, 144) │ 1,008 │ block2b_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_se_excite │ (None, 16, 16, │ 0 │ block2b_activati… │ │ (Multiply) │ 144) │ │ block2b_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_project_co… │ (None, 16, 16, │ 3,456 │ block2b_se_excit… │ │ (Conv2D) │ 24) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_project_bn │ (None, 16, 16, │ 96 │ block2b_project_… │ │ (BatchNormalizatio… │ 24) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_drop │ (None, 16, 16, │ 0 │ block2b_project_… │ │ (Dropout) │ 24) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block2b_add (Add) │ (None, 16, 16, │ 0 │ block2b_drop[0][… │ │ │ 24) │ │ block2a_project_… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_expand_conv │ (None, 16, 16, │ 3,456 │ block2b_add[0][0] │ │ (Conv2D) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_expand_bn │ (None, 16, 16, │ 576 │ block3a_expand_c… │ │ (BatchNormalizatio… │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_expand_act… │ (None, 16, 16, │ 0 │ block3a_expand_b… │ │ (Activation) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_dwconv_pad │ (None, 19, 19, │ 0 │ block3a_expand_a… │ │ (ZeroPadding2D) │ 144) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_dwconv │ (None, 8, 8, 144) │ 3,600 │ block3a_dwconv_p… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_bn │ (None, 8, 8, 144) │ 576 │ block3a_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_activation │ (None, 8, 8, 144) │ 0 │ block3a_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_se_squeeze │ (None, 144) │ 0 │ block3a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_se_reshape │ (None, 1, 1, 144) │ 0 │ block3a_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_se_reduce │ (None, 1, 1, 6) │ 870 │ block3a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_se_expand │ (None, 1, 1, 144) │ 1,008 │ block3a_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_se_excite │ (None, 8, 8, 144) │ 0 │ block3a_activati… │ │ (Multiply) │ │ │ block3a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_project_co… │ (None, 8, 8, 40) │ 5,760 │ block3a_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3a_project_bn │ (None, 8, 8, 40) │ 160 │ block3a_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_expand_conv │ (None, 8, 8, 240) │ 9,600 │ block3a_project_… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_expand_bn │ (None, 8, 8, 240) │ 960 │ block3b_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_expand_act… │ (None, 8, 8, 240) │ 0 │ block3b_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_dwconv │ (None, 8, 8, 240) │ 6,000 │ block3b_expand_a… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_bn │ (None, 8, 8, 240) │ 960 │ block3b_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_activation │ (None, 8, 8, 240) │ 0 │ block3b_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_se_squeeze │ (None, 240) │ 0 │ block3b_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_se_reshape │ (None, 1, 1, 240) │ 0 │ block3b_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_se_reduce │ (None, 1, 1, 10) │ 2,410 │ block3b_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_se_expand │ (None, 1, 1, 240) │ 2,640 │ block3b_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_se_excite │ (None, 8, 8, 240) │ 0 │ block3b_activati… │ │ (Multiply) │ │ │ block3b_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_project_co… │ (None, 8, 8, 40) │ 9,600 │ block3b_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_project_bn │ (None, 8, 8, 40) │ 160 │ block3b_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_drop │ (None, 8, 8, 40) │ 0 │ block3b_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block3b_add (Add) │ (None, 8, 8, 40) │ 0 │ block3b_drop[0][… │ │ │ │ │ block3a_project_… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_expand_conv │ (None, 8, 8, 240) │ 9,600 │ block3b_add[0][0] │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_expand_bn │ (None, 8, 8, 240) │ 960 │ block4a_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_expand_act… │ (None, 8, 8, 240) │ 0 │ block4a_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_dwconv_pad │ (None, 9, 9, 240) │ 0 │ block4a_expand_a… │ │ (ZeroPadding2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_dwconv │ (None, 4, 4, 240) │ 2,160 │ block4a_dwconv_p… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_bn │ (None, 4, 4, 240) │ 960 │ block4a_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_activation │ (None, 4, 4, 240) │ 0 │ block4a_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_se_squeeze │ (None, 240) │ 0 │ block4a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_se_reshape │ (None, 1, 1, 240) │ 0 │ block4a_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_se_reduce │ (None, 1, 1, 10) │ 2,410 │ block4a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_se_expand │ (None, 1, 1, 240) │ 2,640 │ block4a_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_se_excite │ (None, 4, 4, 240) │ 0 │ block4a_activati… │ │ (Multiply) │ │ │ block4a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_project_co… │ (None, 4, 4, 80) │ 19,200 │ block4a_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4a_project_bn │ (None, 4, 4, 80) │ 320 │ block4a_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_expand_conv │ (None, 4, 4, 480) │ 38,400 │ block4a_project_… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_expand_bn │ (None, 4, 4, 480) │ 1,920 │ block4b_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_expand_act… │ (None, 4, 4, 480) │ 0 │ block4b_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_dwconv │ (None, 4, 4, 480) │ 4,320 │ block4b_expand_a… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_bn │ (None, 4, 4, 480) │ 1,920 │ block4b_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_activation │ (None, 4, 4, 480) │ 0 │ block4b_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_se_squeeze │ (None, 480) │ 0 │ block4b_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_se_reshape │ (None, 1, 1, 480) │ 0 │ block4b_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_se_reduce │ (None, 1, 1, 20) │ 9,620 │ block4b_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_se_expand │ (None, 1, 1, 480) │ 10,080 │ block4b_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_se_excite │ (None, 4, 4, 480) │ 0 │ block4b_activati… │ │ (Multiply) │ │ │ block4b_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_project_co… │ (None, 4, 4, 80) │ 38,400 │ block4b_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_project_bn │ (None, 4, 4, 80) │ 320 │ block4b_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_drop │ (None, 4, 4, 80) │ 0 │ block4b_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4b_add (Add) │ (None, 4, 4, 80) │ 0 │ block4b_drop[0][… │ │ │ │ │ block4a_project_… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_expand_conv │ (None, 4, 4, 480) │ 38,400 │ block4b_add[0][0] │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_expand_bn │ (None, 4, 4, 480) │ 1,920 │ block4c_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_expand_act… │ (None, 4, 4, 480) │ 0 │ block4c_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_dwconv │ (None, 4, 4, 480) │ 4,320 │ block4c_expand_a… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_bn │ (None, 4, 4, 480) │ 1,920 │ block4c_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_activation │ (None, 4, 4, 480) │ 0 │ block4c_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_se_squeeze │ (None, 480) │ 0 │ block4c_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_se_reshape │ (None, 1, 1, 480) │ 0 │ block4c_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_se_reduce │ (None, 1, 1, 20) │ 9,620 │ block4c_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_se_expand │ (None, 1, 1, 480) │ 10,080 │ block4c_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_se_excite │ (None, 4, 4, 480) │ 0 │ block4c_activati… │ │ (Multiply) │ │ │ block4c_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_project_co… │ (None, 4, 4, 80) │ 38,400 │ block4c_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_project_bn │ (None, 4, 4, 80) │ 320 │ block4c_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_drop │ (None, 4, 4, 80) │ 0 │ block4c_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block4c_add (Add) │ (None, 4, 4, 80) │ 0 │ block4c_drop[0][… │ │ │ │ │ block4b_add[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_expand_conv │ (None, 4, 4, 480) │ 38,400 │ block4c_add[0][0] │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_expand_bn │ (None, 4, 4, 480) │ 1,920 │ block5a_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_expand_act… │ (None, 4, 4, 480) │ 0 │ block5a_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_dwconv │ (None, 4, 4, 480) │ 12,000 │ block5a_expand_a… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_bn │ (None, 4, 4, 480) │ 1,920 │ block5a_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_activation │ (None, 4, 4, 480) │ 0 │ block5a_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_se_squeeze │ (None, 480) │ 0 │ block5a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_se_reshape │ (None, 1, 1, 480) │ 0 │ block5a_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_se_reduce │ (None, 1, 1, 20) │ 9,620 │ block5a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_se_expand │ (None, 1, 1, 480) │ 10,080 │ block5a_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_se_excite │ (None, 4, 4, 480) │ 0 │ block5a_activati… │ │ (Multiply) │ │ │ block5a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_project_co… │ (None, 4, 4, 112) │ 53,760 │ block5a_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5a_project_bn │ (None, 4, 4, 112) │ 448 │ block5a_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_expand_conv │ (None, 4, 4, 672) │ 75,264 │ block5a_project_… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_expand_bn │ (None, 4, 4, 672) │ 2,688 │ block5b_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_expand_act… │ (None, 4, 4, 672) │ 0 │ block5b_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_dwconv │ (None, 4, 4, 672) │ 16,800 │ block5b_expand_a… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_bn │ (None, 4, 4, 672) │ 2,688 │ block5b_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_activation │ (None, 4, 4, 672) │ 0 │ block5b_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_se_squeeze │ (None, 672) │ 0 │ block5b_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_se_reshape │ (None, 1, 1, 672) │ 0 │ block5b_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_se_reduce │ (None, 1, 1, 28) │ 18,844 │ block5b_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_se_expand │ (None, 1, 1, 672) │ 19,488 │ block5b_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_se_excite │ (None, 4, 4, 672) │ 0 │ block5b_activati… │ │ (Multiply) │ │ │ block5b_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_project_co… │ (None, 4, 4, 112) │ 75,264 │ block5b_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_project_bn │ (None, 4, 4, 112) │ 448 │ block5b_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_drop │ (None, 4, 4, 112) │ 0 │ block5b_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5b_add (Add) │ (None, 4, 4, 112) │ 0 │ block5b_drop[0][… │ │ │ │ │ block5a_project_… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_expand_conv │ (None, 4, 4, 672) │ 75,264 │ block5b_add[0][0] │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_expand_bn │ (None, 4, 4, 672) │ 2,688 │ block5c_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_expand_act… │ (None, 4, 4, 672) │ 0 │ block5c_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_dwconv │ (None, 4, 4, 672) │ 16,800 │ block5c_expand_a… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_bn │ (None, 4, 4, 672) │ 2,688 │ block5c_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_activation │ (None, 4, 4, 672) │ 0 │ block5c_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_se_squeeze │ (None, 672) │ 0 │ block5c_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_se_reshape │ (None, 1, 1, 672) │ 0 │ block5c_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_se_reduce │ (None, 1, 1, 28) │ 18,844 │ block5c_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_se_expand │ (None, 1, 1, 672) │ 19,488 │ block5c_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_se_excite │ (None, 4, 4, 672) │ 0 │ block5c_activati… │ │ (Multiply) │ │ │ block5c_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_project_co… │ (None, 4, 4, 112) │ 75,264 │ block5c_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_project_bn │ (None, 4, 4, 112) │ 448 │ block5c_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_drop │ (None, 4, 4, 112) │ 0 │ block5c_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block5c_add (Add) │ (None, 4, 4, 112) │ 0 │ block5c_drop[0][… │ │ │ │ │ block5b_add[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_expand_conv │ (None, 4, 4, 672) │ 75,264 │ block5c_add[0][0] │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_expand_bn │ (None, 4, 4, 672) │ 2,688 │ block6a_expand_c… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_expand_act… │ (None, 4, 4, 672) │ 0 │ block6a_expand_b… │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_dwconv_pad │ (None, 7, 7, 672) │ 0 │ block6a_expand_a… │ │ (ZeroPadding2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_dwconv │ (None, 2, 2, 672) │ 16,800 │ block6a_dwconv_p… │ │ (DepthwiseConv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_bn │ (None, 2, 2, 672) │ 2,688 │ block6a_dwconv[0… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_activation │ (None, 2, 2, 672) │ 0 │ block6a_bn[0][0] │ │ (Activation) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_se_squeeze │ (None, 672) │ 0 │ block6a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_se_reshape │ (None, 1, 1, 672) │ 0 │ block6a_se_squee… │ │ (Reshape) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_se_reduce │ (None, 1, 1, 28) │ 18,844 │ block6a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_se_expand │ (None, 1, 1, 672) │ 19,488 │ block6a_se_reduc… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_se_excite │ (None, 2, 2, 672) │ 0 │ block6a_activati… │ │ (Multiply) │ │ │ block6a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_project_co… │ (None, 2, 2, 192) │ 129,024 │ block6a_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6a_project_bn │ (None, 2, 2, 192) │ 768 │ block6a_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_expand_conv │ (None, 2, 2, │ 221,184 │ block6a_project_… │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_expand_bn │ (None, 2, 2, │ 4,608 │ block6b_expand_c… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_expand_act… │ (None, 2, 2, │ 0 │ block6b_expand_b… │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_dwconv │ (None, 2, 2, │ 28,800 │ block6b_expand_a… │ │ (DepthwiseConv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_bn │ (None, 2, 2, │ 4,608 │ block6b_dwconv[0… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_activation │ (None, 2, 2, │ 0 │ block6b_bn[0][0] │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_se_squeeze │ (None, 1152) │ 0 │ block6b_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_se_reshape │ (None, 1, 1, │ 0 │ block6b_se_squee… │ │ (Reshape) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_se_reduce │ (None, 1, 1, 48) │ 55,344 │ block6b_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_se_expand │ (None, 1, 1, │ 56,448 │ block6b_se_reduc… │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_se_excite │ (None, 2, 2, │ 0 │ block6b_activati… │ │ (Multiply) │ 1152) │ │ block6b_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_project_co… │ (None, 2, 2, 192) │ 221,184 │ block6b_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_project_bn │ (None, 2, 2, 192) │ 768 │ block6b_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_drop │ (None, 2, 2, 192) │ 0 │ block6b_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6b_add (Add) │ (None, 2, 2, 192) │ 0 │ block6b_drop[0][… │ │ │ │ │ block6a_project_… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_expand_conv │ (None, 2, 2, │ 221,184 │ block6b_add[0][0] │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_expand_bn │ (None, 2, 2, │ 4,608 │ block6c_expand_c… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_expand_act… │ (None, 2, 2, │ 0 │ block6c_expand_b… │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_dwconv │ (None, 2, 2, │ 28,800 │ block6c_expand_a… │ │ (DepthwiseConv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_bn │ (None, 2, 2, │ 4,608 │ block6c_dwconv[0… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_activation │ (None, 2, 2, │ 0 │ block6c_bn[0][0] │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_se_squeeze │ (None, 1152) │ 0 │ block6c_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_se_reshape │ (None, 1, 1, │ 0 │ block6c_se_squee… │ │ (Reshape) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_se_reduce │ (None, 1, 1, 48) │ 55,344 │ block6c_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_se_expand │ (None, 1, 1, │ 56,448 │ block6c_se_reduc… │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_se_excite │ (None, 2, 2, │ 0 │ block6c_activati… │ │ (Multiply) │ 1152) │ │ block6c_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_project_co… │ (None, 2, 2, 192) │ 221,184 │ block6c_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_project_bn │ (None, 2, 2, 192) │ 768 │ block6c_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_drop │ (None, 2, 2, 192) │ 0 │ block6c_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6c_add (Add) │ (None, 2, 2, 192) │ 0 │ block6c_drop[0][… │ │ │ │ │ block6b_add[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_expand_conv │ (None, 2, 2, │ 221,184 │ block6c_add[0][0] │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_expand_bn │ (None, 2, 2, │ 4,608 │ block6d_expand_c… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_expand_act… │ (None, 2, 2, │ 0 │ block6d_expand_b… │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_dwconv │ (None, 2, 2, │ 28,800 │ block6d_expand_a… │ │ (DepthwiseConv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_bn │ (None, 2, 2, │ 4,608 │ block6d_dwconv[0… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_activation │ (None, 2, 2, │ 0 │ block6d_bn[0][0] │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_se_squeeze │ (None, 1152) │ 0 │ block6d_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_se_reshape │ (None, 1, 1, │ 0 │ block6d_se_squee… │ │ (Reshape) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_se_reduce │ (None, 1, 1, 48) │ 55,344 │ block6d_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_se_expand │ (None, 1, 1, │ 56,448 │ block6d_se_reduc… │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_se_excite │ (None, 2, 2, │ 0 │ block6d_activati… │ │ (Multiply) │ 1152) │ │ block6d_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_project_co… │ (None, 2, 2, 192) │ 221,184 │ block6d_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_project_bn │ (None, 2, 2, 192) │ 768 │ block6d_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_drop │ (None, 2, 2, 192) │ 0 │ block6d_project_… │ │ (Dropout) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block6d_add (Add) │ (None, 2, 2, 192) │ 0 │ block6d_drop[0][… │ │ │ │ │ block6c_add[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_expand_conv │ (None, 2, 2, │ 221,184 │ block6d_add[0][0] │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_expand_bn │ (None, 2, 2, │ 4,608 │ block7a_expand_c… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_expand_act… │ (None, 2, 2, │ 0 │ block7a_expand_b… │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_dwconv │ (None, 2, 2, │ 10,368 │ block7a_expand_a… │ │ (DepthwiseConv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_bn │ (None, 2, 2, │ 4,608 │ block7a_dwconv[0… │ │ (BatchNormalizatio… │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_activation │ (None, 2, 2, │ 0 │ block7a_bn[0][0] │ │ (Activation) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_se_squeeze │ (None, 1152) │ 0 │ block7a_activati… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_se_reshape │ (None, 1, 1, │ 0 │ block7a_se_squee… │ │ (Reshape) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_se_reduce │ (None, 1, 1, 48) │ 55,344 │ block7a_se_resha… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_se_expand │ (None, 1, 1, │ 56,448 │ block7a_se_reduc… │ │ (Conv2D) │ 1152) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_se_excite │ (None, 2, 2, │ 0 │ block7a_activati… │ │ (Multiply) │ 1152) │ │ block7a_se_expan… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_project_co… │ (None, 2, 2, 320) │ 368,640 │ block7a_se_excit… │ │ (Conv2D) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ block7a_project_bn │ (None, 2, 2, 320) │ 1,280 │ block7a_project_… │ │ (BatchNormalizatio… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ top_conv (Conv2D) │ (None, 2, 2, │ 409,600 │ block7a_project_… │ │ │ 1280) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ top_bn │ (None, 2, 2, │ 5,120 │ top_conv[0][0] │ │ (BatchNormalizatio… │ 1280) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ top_activation │ (None, 2, 2, │ 0 │ top_bn[0][0] │ │ (Activation) │ 1280) │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ global_average_poo… │ (None, 1280) │ 0 │ top_activation[0… │ │ (GlobalAveragePool… │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ dense_15 (Dense) │ (None, 512) │ 655,872 │ global_average_p… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ dense_16 (Dense) │ (None, 256) │ 131,328 │ dense_15[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ dropout_4 (Dropout) │ (None, 256) │ 0 │ dense_16[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ dense_17 (Dense) │ (None, 10) │ 2,570 │ dropout_4[0][0] │ └─────────────────────┴───────────────────┴────────────┴───────────────────┘
Total params: 6,418,883 (24.49 MB)
Trainable params: 789,770 (3.01 MB)
Non-trainable params: 4,049,571 (15.45 MB)
Optimizer params: 1,579,542 (6.03 MB)
None
print("Test dataset evaluation")
model.evaluate(test_ds)
Test dataset evaluation 38/38 ━━━━━━━━━━━━━━━━━━━━ 1s 33ms/step - accuracy: 0.9380 - loss: 0.2024
[0.20488472282886505, 0.9358552694320679]
import numpy as np
import tensorflow as tf
y_true = []
y_pred = []
for images, labels in test_ds:
predictions = model.predict(images)
predicted_labels = np.argmax(predictions, axis=1)
if labels.ndim > 1 and labels.shape[1] > 1:
labels = np.argmax(labels, axis=1)
y_true.extend(labels)
y_pred.extend(predicted_labels)
1/1 ━━━━━━━━━━━━━━━━━━━━ 5s 5s/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 84ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
2024-05-05 01:16:54.328388: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: OUT_OF_RANGE: End of sequence
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
cm = confusion_matrix(y_true, y_pred)a
plt.figure(figsize=(10, 8))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix')
plt.show()
model.save('sentinel_classificatiion_model_generated.keras')
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
class_names = ['AnnualCrop', 'Forest', 'HerbaceousVegetation', 'Highway', 'Industrial', 'Pasture', 'PermanentCrop', 'Residential', 'River', 'SeaLake']
def plot_images(images, labels, predictions):
plt.figure(figsize=(10, 10))
for i in range(9):
plt.subplot(3, 3, i + 1)
plt.imshow(images[i].numpy().astype("uint8"))
plt.title(f"True: {class_names[np.argmax(labels[i])]}, Pred: {class_names[np.argmax(predictions[i])]}")
plt.axis("off")
for images, labels in test_ds.take(1):
predictions = model.predict(images)
plot_images(images, labels, predictions)
plt.show()
1/1 ━━━━━━━━━━━━━━━━━━━━ 8s 8s/step
2024-05-04 23:42:16.121259: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: OUT_OF_RANGE: End of sequence
Model Application¶
Deployment¶
The model was deployed using a Gradio web interface, which provides a user-friendly GUI for uploading images and receiving instant classifications.
Demo¶
A live demo of the application can be accessed at: https://huggingface.co/spaces/Lars2000/sentinel
Results of User Validation¶
User feedback highlighted the application's ease of use and accuracy. Positive points included quick response times and informative confidence scores for different classifications. Suggestions for improvement were focused on enhancing performance with low-contrast images and those affected by cloud cover.
Conclusion¶
The project successfully demonstrated the application of convolutional neural networks in classifying satellite imagery, utilizing both transfer learning and fine-tuning approaches to achieve high accuracy. Future improvements could address the challenges identified through user feedback, potentially involving the incorporation of additional data preprocessing steps or advanced neural network architectures.