| import os
|
| import numpy as np
|
| import tensorflow as tf
|
| from tensorflow.keras.preprocessing.image import ImageDataGenerator
|
| from tensorflow.keras.models import Sequential
|
| from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
|
| from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
|
| import matplotlib.pyplot as plt
|
|
|
|
|
| DATA_DIR = 'asl_alphabet_train'
|
| MODEL_SAVE_PATH = 'trained_model/asl_model.h5'
|
| IMG_SIZE = 64
|
| BATCH_SIZE = 32
|
| EPOCHS = 20
|
| NUM_CLASSES = 26
|
|
|
|
|
| os.makedirs(os.path.dirname(MODEL_SAVE_PATH), exist_ok=True)
|
| os.makedirs('outputs', exist_ok=True)
|
|
|
|
|
| train_datagen = ImageDataGenerator(
|
| rescale=1./255,
|
| validation_split=0.2,
|
| rotation_range=15,
|
| zoom_range=0.1,
|
| width_shift_range=0.1,
|
| height_shift_range=0.1,
|
| horizontal_flip=True
|
| )
|
|
|
| train_generator = train_datagen.flow_from_directory(
|
| DATA_DIR,
|
| target_size=(IMG_SIZE, IMG_SIZE),
|
| batch_size=BATCH_SIZE,
|
| class_mode='categorical',
|
| subset='training',
|
| shuffle=True,
|
| seed=42
|
| )
|
|
|
| validation_generator = train_datagen.flow_from_directory(
|
| DATA_DIR,
|
| target_size=(IMG_SIZE, IMG_SIZE),
|
| batch_size=BATCH_SIZE,
|
| class_mode='categorical',
|
| subset='validation',
|
| shuffle=False,
|
| seed=42
|
| )
|
|
|
|
|
| model = Sequential([
|
| Conv2D(32, (3,3), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3)),
|
| MaxPooling2D(2,2),
|
|
|
| Conv2D(64, (3,3), activation='relu'),
|
| MaxPooling2D(2,2),
|
|
|
| Conv2D(128, (3,3), activation='relu'),
|
| MaxPooling2D(2,2),
|
|
|
| Flatten(),
|
| Dense(128, activation='relu'),
|
| Dropout(0.5),
|
| Dense(NUM_CLASSES, activation='softmax')
|
| ])
|
|
|
| model.compile(optimizer='adam',
|
| loss='categorical_crossentropy',
|
| metrics=['accuracy'])
|
|
|
| model.summary()
|
|
|
|
|
| checkpoint = ModelCheckpoint(MODEL_SAVE_PATH, save_best_only=True, monitor='val_accuracy', mode='max')
|
| early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
|
|
|
|
|
| history = model.fit(
|
| train_generator,
|
| validation_data=validation_generator,
|
| epochs=EPOCHS,
|
| callbacks=[checkpoint, early_stop]
|
| )
|
|
|
|
|
| plt.figure(figsize=(12,5))
|
|
|
| plt.subplot(1,2,1)
|
| plt.plot(history.history['accuracy'], label='Train Accuracy')
|
| plt.plot(history.history['val_accuracy'], label='Val Accuracy')
|
| plt.legend()
|
| plt.title('Accuracy')
|
|
|
| plt.subplot(1,2,2)
|
| plt.plot(history.history['loss'], label='Train Loss')
|
| plt.plot(history.history['val_loss'], label='Val Loss')
|
| plt.legend()
|
| plt.title('Loss')
|
|
|
| plt.savefig('outputs/training_plot.png')
|
| plt.show()
|
|
|