import os import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.applications import MobileNetV2 from tensorflow.keras import layers, models from tensorflow.keras.optimizers import Adam # Updated path base_dir = 'data/chest_xray' train_dir = os.path.join(base_dir, 'train') val_dir = os.path.join(base_dir, 'val') # Parameters IMG_SIZE = (224, 224) BATCH_SIZE = 32 EPOCHS = 5 # You can increase later # Data generators train_gen = ImageDataGenerator( rescale=1./255, rotation_range=10, zoom_range=0.1, horizontal_flip=True ) val_gen = ImageDataGenerator(rescale=1./255) train_data = train_gen.flow_from_directory( train_dir, target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='binary' ) val_data = val_gen.flow_from_directory( val_dir, target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='binary' ) # MobileNetV2 base base_model = MobileNetV2(input_shape=(224, 224, 3), include_top=False, weights='imagenet') base_model.trainable = False # Custom head model = models.Sequential([ base_model, layers.GlobalAveragePooling2D(), layers.Dense(128, activation='relu'), layers.Dropout(0.3), layers.Dense(1, activation='sigmoid') # Binary classifier ]) model.compile(optimizer=Adam(learning_rate=0.0001), loss='binary_crossentropy', metrics=['accuracy']) # Train model.fit(train_data, validation_data=val_data, epochs=EPOCHS) # Save model os.makedirs("model", exist_ok=True) model.save("model/pneumonia_model.h5") print("✅ Model saved as model/pneumonia_model.h5")