from tensorflow import keras
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import h5py
# Define Model
model = keras.models.Sequential([
keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(32, 32,1)),
keras.layers.MaxPooling2D(2, 2),
keras.layers.Conv2D(16, (3,3), activation='relu'),
keras.layers.MaxPooling2D(2,2),
keras.layers.Conv2D(32, (3,3), activation='relu'),
keras.layers.MaxPooling2D(2,2),
keras.layers.Flatten(),
keras.layers.Dropout(0.5),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(2, activation='sigmoid')
])
# Compile Model
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# Gather Training and Validation Data
train = ImageDataGenerator(rescale=1/255)
test = ImageDataGenerator(rescale=1/255)
train_dataset = train.flow_from_directory("./Data/train",
target_size=(32,32),
color_mode="grayscale",
shuffle=True,
batch_size = 16,
classes=['with_mask','without_mask'])
test_dataset = test.flow_from_directory("./Data/validation",
target_size=(32,32),
color_mode="grayscale",
shuffle=True,
batch_size = 16,
classes=['with_mask','without_mask'])
Found 600 images belonging to 2 classes. Found 200 images belonging to 2 classes.
# Train and Save Model
model.fit(train_dataset,
steps_per_epoch = 25,
epochs = 20,
validation_data = test_dataset)
model.save("./Data/models/classifier.h5")
Epoch 1/20 25/25 [==============================] - 2s 49ms/step - loss: 0.6870 - accuracy: 0.5510 - val_loss: 0.6887 - val_accuracy: 0.5000 Epoch 2/20 25/25 [==============================] - 1s 30ms/step - loss: 0.6919 - accuracy: 0.4950 - val_loss: 0.6827 - val_accuracy: 0.5400 Epoch 3/20 25/25 [==============================] - 1s 27ms/step - loss: 0.6877 - accuracy: 0.5153 - val_loss: 0.6763 - val_accuracy: 0.7750 Epoch 4/20 25/25 [==============================] - 1s 32ms/step - loss: 0.6748 - accuracy: 0.6173 - val_loss: 0.6491 - val_accuracy: 0.5600 Epoch 5/20 25/25 [==============================] - 1s 26ms/step - loss: 0.6660 - accuracy: 0.5944 - val_loss: 0.6205 - val_accuracy: 0.6550 Epoch 6/20 25/25 [==============================] - 1s 27ms/step - loss: 0.6348 - accuracy: 0.6225 - val_loss: 0.5742 - val_accuracy: 0.8000 Epoch 7/20 25/25 [==============================] - 1s 28ms/step - loss: 0.6000 - accuracy: 0.6939 - val_loss: 0.5270 - val_accuracy: 0.8250 Epoch 8/20 25/25 [==============================] - 1s 28ms/step - loss: 0.5824 - accuracy: 0.7300 - val_loss: 0.5416 - val_accuracy: 0.7050 Epoch 9/20 25/25 [==============================] - 1s 32ms/step - loss: 0.5351 - accuracy: 0.7725 - val_loss: 0.4521 - val_accuracy: 0.8550 Epoch 10/20 25/25 [==============================] - 1s 35ms/step - loss: 0.4774 - accuracy: 0.7934 - val_loss: 0.3764 - val_accuracy: 0.9000 Epoch 11/20 25/25 [==============================] - 1s 32ms/step - loss: 0.5144 - accuracy: 0.7650 - val_loss: 0.4364 - val_accuracy: 0.7900 Epoch 12/20 25/25 [==============================] - 1s 28ms/step - loss: 0.4634 - accuracy: 0.8100 - val_loss: 0.3443 - val_accuracy: 0.8950 Epoch 13/20 25/25 [==============================] - 1s 29ms/step - loss: 0.4348 - accuracy: 0.8010 - val_loss: 0.3005 - val_accuracy: 0.8900 Epoch 14/20 25/25 [==============================] - 1s 31ms/step - loss: 0.4012 - accuracy: 0.8300 - val_loss: 0.3286 - val_accuracy: 0.9000 Epoch 15/20 25/25 [==============================] - 1s 30ms/step - loss: 0.3775 - accuracy: 0.8475 - val_loss: 0.3153 - val_accuracy: 0.9050 Epoch 16/20 25/25 [==============================] - 1s 28ms/step - loss: 0.3883 - accuracy: 0.8350 - val_loss: 0.2795 - val_accuracy: 0.8950 Epoch 17/20 25/25 [==============================] - 1s 33ms/step - loss: 0.3844 - accuracy: 0.8393 - val_loss: 0.2837 - val_accuracy: 0.9100 Epoch 18/20 25/25 [==============================] - 1s 28ms/step - loss: 0.3757 - accuracy: 0.8418 - val_loss: 0.2666 - val_accuracy: 0.8950 Epoch 19/20 25/25 [==============================] - 1s 31ms/step - loss: 0.3612 - accuracy: 0.8495 - val_loss: 0.2801 - val_accuracy: 0.9100 Epoch 20/20 25/25 [==============================] - 1s 30ms/step - loss: 0.3746 - accuracy: 0.8342 - val_loss: 0.3022 - val_accuracy: 0.8700