Skip to content

Instantly share code, notes, and snippets.

@NickShargan
Last active May 6, 2019 10:15
Show Gist options
  • Save NickShargan/7fa5433a5727d39a35f99631b472f0e6 to your computer and use it in GitHub Desktop.
Save NickShargan/7fa5433a5727d39a35f99631b472f0e6 to your computer and use it in GitHub Desktop.
import os
import numpy as np
from keras.applications.mobilenet import MobileNet
from keras.models import Sequential, Model
from keras.layers import Input, Dense, Activation, GlobalAveragePooling2D, Reshape, Conv2D, Dropout
from keras.optimizers import adam
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint, TensorBoard, ReduceLROnPlateau, EarlyStopping
from keras.backend import backend
from keras.utils import plot_model
import tensorflow as tf
from numpy.random import seed
from tensorflow import set_random_seed
seed(1)
set_random_seed(2)
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
img_size = 224
batch_size = 32
num_epochs = 20
num_classes = 120
# def get_class_weights(dir_path):
# class_names = os.listdir(dir_path)
# class_names.sort()
# class_el_nums = []
# for class_name in range(num_classes):
# filenames = os.listdir(os.path.join(dir_path, str(class_name)))
# class_el_nums.append(len(filenames))
# class_weights = []
# for class_idx in range(num_classes):
# if class_el_nums[class_idx] == 0:
# class_weights.append(1.0)
# else:
# class_weights.append(1. / class_el_nums[class_idx])
# return class_weights
base_model = MobileNet(input_shape=(img_size, img_size, 3), include_top=False)
# base_model = MobileNet(input_shape=(img_size, img_size, 3))
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(num_classes, activation='softmax')(x)
model = Model(input=base_model.input, output=predictions)
# model.summary()
# plot_model(model, 'model.png', show_shapes = True)
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'./data/train/',
target_size=(img_size, img_size),
batch_size=batch_size
)
val_generator = test_datagen.flow_from_directory(
'./data/val/',
target_size=(img_size, img_size),
batch_size=batch_size
)
prefix = "1_w"
filepath = "./models/" + prefix + "_{epoch:02d}_{val_acc:.2f}.hdf5"
os.makedirs("./models", exist_ok=True)
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
tensorboard = TensorBoard(log_dir='./logs/' + prefix)
reduce_lr = ReduceLROnPlateau(monitor='val_acc', mode = 'max',factor=0.2, patience=5, min_lr=0.00001, verbose=1)
early_stopping = EarlyStopping(monitor='val_acc', mode = 'max',patience=15, verbose=1)
callbacks_list = [checkpoint, tensorboard, reduce_lr, early_stopping]
model.fit_generator(
train_generator,
steps_per_epoch=40000 // batch_size,
epochs=num_epochs,
callbacks=callbacks_list,
validation_data=val_generator,
validation_steps=8000 // batch_size
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment