Spaces:
Sleeping
Sleeping
File size: 1,701 Bytes
e64dd2d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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")
|