Spaces:
Sleeping
Sleeping
| 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") | |