021/mini-project
/mini-project/mini-project/mini-project/models/keras_model.py
from __future__ import print_function
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from keras.layers import Input, Dense, Flatten, Dropout, Conv2D, MaxPooling2D, BatchNormalization, AveragePooling2D, Activation, ZeroPadding2D, Concatenate
from keras.models import Model, Sequential
from keras.layers.merge import add
from keras.regularizers import l2
from keras.optimizers import Adam, RMSprop
from keras.callbacks import ReduceLROnPlateau, EarlyStopping, TensorBoard, ModelCheckpoint
from keras.layers.advanced_activations import LeakyReLU
from keras.datasets import cifar10
from keras.utils import np_utils, plot_model
from keras.preprocessing.image import ImageDataGenerator
from keras.applications import VGG19, ResNet50, InceptionV3
from sklearn.utils import class_weight
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, roc_curve, auc, roc_auc_score
from keras.callbacks import CSVLogger
from keras import backend as K
from keras import initializers
from keras import regularizers
from keras import constraints
from keras import activations
from keras.utils.generic_utils import get_custom_objects
import os
import sys
import argparse
parser = argparse.ArgumentParser(description='mini-project')
parser.add_argument('--batch_size', type=int, default=200, help='batch size for train and validation')
parser.add_argument('--epochs', type=int, default=100, help='epochs for train and validation')
parser.add_argument('--num_classes', type=int, default=10, help='number of classes')
parser.add_argument('--data_augmentation', type=bool, default=True, help='data augmentation')
parser.add_argument('--load_pretrained', type=bool, default=True, help='load pretrained model')
parser.add_argument('--model_name', type=str, default='vgg19', help='model name')
parser.add_argument('--lr', type=float, default=0.001, help='learning rate')
parser.add_argument('--weight_decay', type=float, default=0.0005, help='weight decay')
args = parser.parse_args()
batch_size = args.batch_size
epochs = args.epochs
num_classes = args.num_classes
data_augmentation = args.data_augmentation
load_pretrained = args.load_pretrained
model_name = args.model_name
learning_rate = args.lr
weight_decay = args.weight_decay
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
os.environ["CUDA_VISIBLE_DEVICES"] = '0'
config = tf.ConfigProto(allow_soft_placement=True)
config.gpu_options.allow_growth = True
session = tf.Session(config=config)
data_dir = './data/'
train_dir = os.path.join(data_dir, 'train')
val_dir = os.path.join(data_dir, 'val')
test_dir = os.path.join(data_dir, 'test')
# model
if model_name == 'vgg19':
input_shape = (32, 32, 3)
model = VGG19.VGG19(weights='imagenet', include_top=False, input_shape=input_shape)
elif model_name == 'resnet50':
input_shape = (32, 32, 3)
model = ResNet50.ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)
elif model_name == 'inception':
input_shape = (32, 32, 3)
model = InceptionV3.InceptionV3(weights='imagenet', include_top=False, input_shape=input_shape)
else:
input_shape = (32, 32, 3)
model = Sequential()
model.add(Conv2D(64, (3, 3), padding='same', input_shape=input_shape))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(256, (3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(512, (3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024, kernel_regularizer=l2(weight_decay), activation='relu'))
model.add(Dense(1024, kernel_regularizer=l2(weight_decay), activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(optimizer=Adam(lr=learning_rate), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
#model.summary()
# data
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255