import keras from keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, Lambda, MaxPool2D, BatchNormalization from keras.utils import np_utils from keras.utils.np_utils import to_categorical from keras.preprocessing.image import ImageDataGenerator from keras import models, layers, optimizers from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, accuracy_score from sklearn.utils import class_weight from keras.optimizers import SGD, RMSprop, Adam, Adagrad, Adadelta, RMSprop from keras.models import Sequential, model_from_json from keras.layers import Activation,Dense, Dropout, Flatten, Conv2D, MaxPool2D,MaxPooling2D,AveragePooling2D, BatchNormalization from keras.preprocessing.image import ImageDataGenerator from keras.callbacks import ReduceLROnPlateau, ModelCheckpoint from keras import backend as K from keras.applications.vgg16 import VGG16 from keras.models import Model from keras.applications.inception_v3 import InceptionV3 import os from glob import glob import matplotlib.pyplot as plt import random import cv2 import pandas as pd import numpy as np import matplotlib.gridspec as gridspec import seaborn as sns import zlib import itertools import sklearn import itertools import scipy import skimage from skimage.transform import resize import csv from tqdm import tqdm from sklearn import model_selection from sklearn.model_selection import train_test_split, learning_curve,KFold,cross_val_score,StratifiedKFold from sklearn.utils import class_weight from sklearn.metrics import confusion_matrix from imblearn.over_sampling import RandomOverSampler from imblearn.under_sampling import RandomUnderSampler #from keras.applications.mobilenet import MobileNet #from sklearn.metrics import roc_auc_score #from sklearn.metrics import roc_curve #from sklearn.metrics import auc #import warnings #warnings.filterwarnings("ignore") %matplotlib inline imageSize=50 train_dir = "../input/asl-alphabet/asl_alphabet_train/asl_alphabet_train/" test_dir = "../input/asl-alphabet/asl_alphabet_test/asl_alphabet_test/" from tqdm import tqdm def get_data(folder): """ Load the data and labels from the given folder. """ X = [] y = [] for folderName in os.listdir(folder): if not folderName.startswith('.'): if folderName in ['A']: label = 0 elif folderName in ['B']: label = 1 elif folderName in ['C']: label = 2 elif folderName in ['D']: label = 3 elif folderName in ['E']:import itertools import os import random from glob import glob import cv2 import keras import matplotlib.pyplot as plt import numpy as np import pandas as pd import skimage import sklearn from IPython import get_ipython from keras.applications.vgg16 import VGG16 from keras.layers import Dense, Flatten from keras.models import Model from sklearn.metrics import confusion_matrix from sklearn.metrics import confusion_matrix from sklearn.utils import class_weight label = 4 elif folderName in ['F']: label = 5 elif folderName in ['G']: label = 6 elif folderName in ['H']: label = 7 elif folderName in ['I']: label = 8 elif folderName in ['J']: label = 9 elif folderName in ['K']: label = 10 elif folderName in ['L']: label = 11 elif folderName in ['M']: label = 12 elif folderName in ['N']: label = 13 elif folderName in ['O']: label = 14 elif folderName in ['P']: label = 15 elif folderName in ['Q']: label = 16 elif folderName in ['R']: label = 17 elif folderName in ['S']: label = 18 elif folderName in ['T']: label = 19 elif folderName in ['U']: label = 20 elif folderName in ['V']: label = 21 elif folderName in ['W']: label = 22 elif folderName in ['X']: label = 23 elif folderName in ['Y']: label = 24 elif folderName in ['Z']: label = 25 elif folderName in ['del']: label = 26 elif folderName in ['nothing']: label = 27 elif folderName in ['space']: label = 28 else: label = 29 for image_filename in tqdm(os.listdir(folder + folderName)): img_file = cv2.imread(folder + folderName + '/' + image_filename) if img_file is not None: img_file = skimage.transform.resize(img_file, (imageSize, imageSize, 3)) img_arr = np.asarray(img_file) X.append(img_arr) y.append(label) X = np.asarray(X) y = np.asarray(y) return X,y X_train, y_train = get_data(train_dir) #X_test, y_test= get_data(test_dir) # Too few images from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.2) # Encode labels to hot vectors (ex : 2 -> [0,0,1,0,0,0,0,0,0,0]) from keras.utils.np_utils import to_categorical y_trainHot = to_categorical(y_train, num_classes = 30) y_testHot = to_categorical(y_test, num_classes = 30) # %% # Shuffle data to permit further subsampling from sklearn.utils import shuffle X_train, y_trainHot = shuffle(X_train, y_trainHot, random_state=13) X_test, y_testHot = shuffle(X_test, y_testHot, random_state=13) X_train = X_train[:30000] X_test = X_test[:30000] y_trainHot = y_trainHot[:30000] y_testHot = y_testHot[:30000] map_characters1 = map_characters class_weight1 = class_weight.compute_class_weight('balanced', np.unique(y_train), y_train) weight_path1 = '../input/keras-pretrained-models/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5' weight_path2 = '../input/keras-pretrained-models/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5' pretrained_model_1 = VGG16(weights = weight_path1, include_top=False, input_shape=(imageSize, imageSize, 3)) #pretrained_model_2 = InceptionV3(weights = weight_path2, include_top=False, input_shape=(imageSize, imageSize, 3)) optimizer1 = keras.optimizers.Adam() optimizer2 = keras.optimizers.RMSprop(lr=0.0001) def pretrainedNetwork(xtrain,ytrain,xtest,ytest,pretrainedmodel,pretrainedweights,classweight,numclasses,numepochs,optimizer,labels): base_model = pretrained_model_1 # Topless # Add top layer x = base_model.output x = Flatten()(x) predictions = Dense(numclasses, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) # Train top layer for layer in base_model.layers: layer.trainable = False model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) callbacks_list = [keras.callbacks.EarlyStopping(monitor='val_acc', patience=3, verbose=1)] model.summary() # Fit model history = model.fit(xtrain,ytrain, epochs=numepochs, class_weight=classweight, validation_data=(xtest,ytest), verbose=1,callbacks = [MetricsCheckpoint('logs')]) # Evaluate model score = model.evaluate(xtest,ytest, verbose=0) print('\nKeras CNN - accuracy:', score[1], '\n') y_pred = model.predict(xtest) print('\n', sklearn.metrics.classification_report(np.where(ytest > 0)[1], np.argmax(y_pred, axis=1), target_names=list(labels.values())), sep='') Y_pred_classes = np.argmax(y_pred,axis = 1) Y_true = np.argmax(ytest,axis = 1) confusion_mtx = confusion_matrix(Y_true, Y_pred_classes) plotKerasLearningCurve() plt.show() plot_learning_curve(history) plt.show() plot_confusion_matrix(confusion_mtx, classes = list(labels.values())) plt.show() return model pretrainedNetwork(X_train, y_trainHot, X_test, y_testHot,pretrained_model_1,weight_path1,class_weight1,30,10,optimizer1,map_characters1)