import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import MobileNet
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Load MobileNet base model with pretrained weights, exclude top layers
base_model = MobileNet(weights='imagenet', include_top=False, input_shape=(128, 128, 3))
base_model.trainable = False
# Add new classification head
model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dropout(0.4),
layers.Dense(10, activation='softmax')
])
# Compile model
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Data augmentation
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True
)
val_datagen = ImageDataGenerator(rescale=1./255)
# Assume train_images, train_labels, val_images, val_labels are numpy arrays
# For example purposes, placeholders are used here
train_images = tf.cast(255 * tf.random.uniform([1000, 128, 128, 3]), tf.uint8)
train_labels = tf.cast(tf.random.uniform([1000], maxval=10, dtype=tf.int32), tf.int32)
val_images = tf.cast(255 * tf.random.uniform([200, 128, 128, 3]), tf.uint8)
val_labels = tf.cast(tf.random.uniform([200], maxval=10, dtype=tf.int32), tf.int32)
train_generator = train_datagen.flow(train_images, train_labels, batch_size=32)
val_generator = val_datagen.flow(val_images, val_labels, batch_size=32)
# Train model
history = model.fit(train_generator, epochs=15, validation_data=val_generator)
# Unfreeze some base model layers for fine-tuning
base_model.trainable = True
for layer in base_model.layers[:-20]:
layer.trainable = False
model.compile(optimizer=tf.keras.optimizers.Adam(1e-5), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history_fine = model.fit(train_generator, epochs=10, validation_data=val_generator)