def train_keras_classifier(): from cifar10_classifier import Classifier from keras.optimizers import SGD from keras import backend as K batch_size = 128 epochs = 50 data_augmentation = True opt = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) with tf.variable_scope('conv') as scope: model = Classifier().model model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) # load data and start training if data_augmentation: print('Using real-time data augmentation.') datagen, (x_train, y_train), (x_test, y_test) = data_loader.load_augmented_data() model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size), epochs=epochs, validation_data=(x_test, y_test), workers=4, callbacks=[SGDLearningRateTracker()]) else: print('Not using data augmentation.') (x_train, y_train), (x_test, y_test) = data_loader.load_original_data() model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test), shuffle=True) # save as tensorflow model if not os.path.isdir(SAVE_DIR): os.makedirs(SAVE_DIR) model.save(CLASSIFIER_PATH) from keras.backend import get_session sess = get_session() saver = tf.train.Saver() saver.save(sess, PRETRAINED_PATH) print('Saved trained model at %s ' % (PRETRAINED_PATH)) # evaluate on test set scores = model.evaluate(x_test, y_test, verbose=1) print('Test loss:', scores[0])
def kfold(orig_data, orig_labels, test_data, clf: classifiers.Classifier): results = [] predictions = [] best_k = 0 for k in range(len(orig_data)): print("Iteration", k + 1, "over", len(orig_data)) data, labels = orig_data[:], orig_labels[:] val_data = data.pop(k) val_labels = labels.pop(k) train_data = np.concatenate(data) train_labels = np.concatenate(labels) print("Fitting...") clf.fit(train_data, train_labels) print("Evaluating...") results.append(clf.evaluate(val_data, val_labels)) print(results[k]) print("Predicting...") predictions.append(clf.predict(test_data)) print(predictions[k]) if results[k]["Accuracy"] > results[best_k]["Accuracy"]: best_k = k return results[best_k], predictions[best_k]