Пример #1
0
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])
Пример #2
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]