def do_train(sess,X_input, Y_input, X_validation, Y_validation):
    ground_truth_tensor_name = 'ground_truth'
    mini_batch_size = 256
    n_train = X_input.shape[0]

    graph = create_graph()

    train_step, cross_entropy = add_final_training_ops(
        graph, len(classes), FLAGS.final_tensor_name,
        ground_truth_tensor_name)

    init = tf.initialize_all_variables()
    sess.run(init)

    evaluation_step = add_evaluation_step(graph, FLAGS.final_tensor_name, ground_truth_tensor_name)

    bottleneck_tensor = graph.get_tensor_by_name(ensure_name_has_port(BOTTLENECK_TENSOR_NAME))
    ground_truth_tensor = graph.get_tensor_by_name(ensure_name_has_port(ground_truth_tensor_name))

    i=0
    epocs = 20
    validation_acc_vector = []
    training_acc_vector  = []
    cross_entropy_vector = []
    for epoch in xrange(epocs):
        shuffledRange = np.random.permutation(n_train)
        y_one_hot_train = encode_one_hot(len(classes), Y_input)
        y_one_hot_validation = encode_one_hot(len(classes), Y_validation)
        shuffledX = X_input[shuffledRange,:]
        shuffledY = y_one_hot_train[shuffledRange]
        for Xi, Yi in iterate_mini_batches(shuffledX, shuffledY, mini_batch_size):
            sess.run(train_step,
                     feed_dict={bottleneck_tensor: Xi,
                                ground_truth_tensor: Yi})

            is_last_step = (i + 1 == FLAGS.how_many_training_steps)
            if (i % FLAGS.eval_step_interval) == 0 or is_last_step:
                train_accuracy, cross_entropy_value = sess.run(
                  [evaluation_step, cross_entropy],
                  feed_dict={bottleneck_tensor: Xi,
                             ground_truth_tensor: Yi})
                validation_accuracy = sess.run(
                  evaluation_step,
                  feed_dict={bottleneck_tensor: X_validation,
                             ground_truth_tensor: y_one_hot_validation})
                print('%s: Step %d: Train accuracy = %.1f%%, Cross entropy = %f, Validation accuracy = %.1f%%' %
                    (datetime.now(), i, train_accuracy * 100, cross_entropy_value, validation_accuracy * 100))
                cross_entropy_vector.append(cross_entropy_value)
                training_acc_vector.append(train_accuracy * 100)
                validation_acc_vector.append(validation_accuracy * 100)
            i+=1
    print("cross entropy vector length is "+str(len(cross_entropy_vector)))

    """ plotting the training accuarcy vs iterations """
    x_ax = np.arange(0,len(cross_entropy_vector))
    fig, ax = plt.subplots(nrows = 1, ncols = 1)
    ax.plot(x_ax, training_acc_vector)
    plt.xlabel('Iterations')
    plt.ylabel('Training Accuracy')
    plt.title('Training Accuracy vs Number of Iterations')
    fig.savefig('training_acc.jpg')
    plt.close(fig)

    """ plotting the validation accuarcy vs iterations """
    x_ax = np.arange(0,len(cross_entropy_vector))
    fig, ax = plt.subplots(nrows = 1, ncols = 1)
    ax.plot(x_ax, validation_acc_vector)
    plt.xlabel('Iterations')
    plt.ylabel('Validation Accuracy')
    plt.title('Validation Accuracy vs Number of Iterations')
    fig.savefig('validation_acc.jpg')
    plt.close(fig)

    """ plotting the cross-entropy error vs iterations """
    x_ax = np.arange(0,len(cross_entropy_vector))
    fig, ax = plt.subplots(nrows = 1, ncols = 1)
    ax.plot(x_ax, cross_entropy_vector)
    plt.xlabel('Iterations')
    plt.ylabel('Cross Entropy value')
    plt.title('Cross Entropy Value vs Number of Iterations')
    fig.savefig('cross_entropy_value.jpg')
    plt.close(fig)

    """ calculating the test_set accuracy """
    test_accuracy = sess.run(
        evaluation_step,
        feed_dict={bottleneck_tensor: X_test_pool3,
                   ground_truth_tensor: encode_one_hot(len(classes), y_test_pool3)})
    print('Final test accuracy = %.1f%%' % (test_accuracy * 100))
def do_train(sess, X_input, Y_input, X_validation, Y_validation):
    mini_batch_size = 10
    n_train = X_input.shape[0]

    graph = create_graph()

    LAYER_WEIGHTS_NAME = "layer_weights"
    LAYER_BIASES_NAME = "layer_biases"

    # Initialize tensorflow variable for the training process
    bottleneck_tensor_train = tf.placeholder(
        tf.float32, [mini_batch_size, BOTTLENECK_TENSOR_SIZE],
        name=BOTTLENECK_TENSOR_TRAIN_NAME)
    ground_truth_tensor_train = tf.placeholder(
        tf.float32, [mini_batch_size, len(classes)],
        name=GROUND_TRUTH_TENSOR_TRAIN)

    layer_weights = tf.Variable(tf.truncated_normal(
        [BOTTLENECK_TENSOR_SIZE, len(classes)], stddev=0.001),
                                name=LAYER_WEIGHTS_NAME)
    layer_biases = tf.Variable(tf.zeros([len(classes)]),
                               name=LAYER_BIASES_NAME)

    # Initialize tensorflow variable for the validating process
    bottleneck_tensor_validation = tf.placeholder(
        tf.float32, [mini_batch_size, BOTTLENECK_TENSOR_SIZE])
    ground_truth_tensor_validation = tf.placeholder(
        tf.float32, [mini_batch_size, len(classes)])

    # Initialize tensorflow variable for the testing process
    bottleneck_tensor_test = tf.placeholder(tf.float32,
                                            [10000, BOTTLENECK_TENSOR_SIZE],
                                            name=BOTTLENECK_TENSOR_TEST_NAME)
    ground_truth_tensor_test = tf.placeholder(tf.float32,
                                              [10000, len(classes)],
                                              name=GROUND_TRUTH_TENSOR_TEST)

    # draw the graph for the last layer
    train_step, cross_entropy = add_final_training_ops(
        graph, bottleneck_tensor_train, ground_truth_tensor_train,
        layer_weights, layer_biases)
    evaluation_step_validation = add_evaluation_step(
        graph, bottleneck_tensor_validation, ground_truth_tensor_validation,
        layer_weights, layer_biases)
    evaluation_step_test = add_evaluation_step(graph, bottleneck_tensor_test,
                                               ground_truth_tensor_test,
                                               layer_weights, layer_biases)

    init = tf.initialize_all_variables()
    sess.run(init)

    i = 0
    epocs = 1
    for epoch in range(epocs):
        shuffledRange = np.random.permutation(n_train)
        y_one_hot_train = encode_one_hot(len(classes), Y_input)
        y_one_hot_validation = encode_one_hot(len(classes), Y_validation)
        shuffledX = X_input[shuffledRange, :]
        shuffledY = y_one_hot_train[shuffledRange]
        for Xi, Yi in iterate_mini_batches(shuffledX, shuffledY,
                                           mini_batch_size):
            _, cross_entropy_value = sess.run([train_step, cross_entropy],
                                              feed_dict={
                                                  bottleneck_tensor_train: Xi,
                                                  ground_truth_tensor_train: Yi
                                              })
            # Every so often, print out how well the graph is training.
            is_last_step = (i + 1 == FLAGS.how_many_training_steps)
            if (i % FLAGS.eval_step_interval) == 0 or is_last_step:
                train_accuracy = sess.run(evaluation_step_validation,
                                          feed_dict={
                                              bottleneck_tensor_validation: Xi,
                                              ground_truth_tensor_validation:
                                              Yi
                                          })
                validation_accuracy = sess.run(evaluation_step_test,
                                               feed_dict={
                                                   bottleneck_tensor_test:
                                                   X_validation,
                                                   ground_truth_tensor_test:
                                                   y_one_hot_validation
                                               })
                print(
                    '%s: Step %d: Train accuracy = %.1f%%, Cross entropy = %f, Validation accuracy = %.1f%%'
                    % (datetime.now(), i, train_accuracy * 100,
                       cross_entropy_value, validation_accuracy * 100))
            i += 1

    test_accuracy = sess.run(evaluation_step_test,
                             feed_dict={
                                 bottleneck_tensor_test:
                                 X_test_pool3,
                                 ground_truth_tensor_test:
                                 encode_one_hot(len(classes), y_test_pool3)
                             })
    print('Final test accuracy = %.1f%%' % (test_accuracy * 100))
Esempio n. 3
0
def do_train(sess, X_input, Y_input, X_validation, Y_validation,
             X_sample_pool3):
    ground_truth_tensor_name = 'ground_truth'
    mini_batch_size = 1
    n_train = X_input.shape[0]

    graph = create_graph()

    train_step, cross_entropy = add_final_training_ops(
        graph, len(classes), FLAGS.final_tensor_name, ground_truth_tensor_name)
    t_vars = tf.trainable_variables()
    final_vars = [var for var in t_vars if 'final_' in var.name]
    saver = tf.train.Saver(final_vars, max_to_keep=10)
    init = tf.initialize_all_variables()
    sess.run(init)

    evaluation_step = add_evaluation_step(graph, FLAGS.final_tensor_name,
                                          ground_truth_tensor_name)

    # Get some layers we'll need to access during training.
    bottleneck_tensor = graph.get_tensor_by_name(
        ensure_name_has_port(BOTTLENECK_TENSOR_NAME))
    ground_truth_tensor = graph.get_tensor_by_name(
        ensure_name_has_port(ground_truth_tensor_name))
    saver.restore(sess,
                  tf.train.latest_checkpoint(os.getcwd() + "/train/test2/"))
    result_tensor = graph.get_tensor_by_name(
        ensure_name_has_port(FLAGS.final_tensor_name))
    '''			# Uncomment this line for calculating the inception score
    splits=10
    preds=[]
    print(X_sample_pool3)
    for Xj, Yj in iterate_mini_batches(X_sample_pool3,np.zeros([X_sample_pool3.shape[0],10]),mini_batch_size):
        pred = sess.run(result_tensor,feed_dict={bottleneck_tensor: Xj})
        preds.append(pred)
    preds = np.concatenate(preds, 0)
    argmax = preds.argmax(axis=1)
    scores = []
    # Calculating the inception score
    for i in range(splits):
        part = preds[argmax==i]
        logp= np.log(part)
        self = np.sum(part*logp,axis=1)
        cross = np.mean(np.dot(part,np.transpose(logp)),axis=1)
	diff = self - cross
        kl = np.mean(self - cross)
        kl1 = []
        for j in range(splits):
            diffj = diff[(j * diff.shape[0] // splits):((j+ 1) * diff.shape[0] //splits)]
            kl1.append(np.exp(diffj.mean()))
        print("category: %s scores_mean = %.2f, scores_std = %.2f" % (classes[i], np.mean(kl1),np.std(kl1)))
        scores.append(np.exp(kl))
    print("scores_mean = %.2f, scores_std = %.2f" % (np.mean(scores),
                                                     np.std(scores)))
    
    '''   # Uncomment this line for calculating the inception score
    # The block commented out below has to be uncommented for transfer learning and the block above has to be commented
    # '''           # Comment this line when doing transfer learning
    i = 0
    epocs = 1
    for epoch in range(epocs):
        shuffledRange = np.random.permutation(n_train)
        y_one_hot_train = encode_one_hot(len(classes), Y_input)
        y_one_hot_validation = encode_one_hot(len(classes), Y_validation)
        shuffledX = X_input[shuffledRange, :]
        shuffledY = y_one_hot_train[shuffledRange]
        for Xi, Yi in iterate_mini_batches(shuffledX, shuffledY,
                                           mini_batch_size):
            sess.run(train_step,
                     feed_dict={
                         bottleneck_tensor: Xi,
                         ground_truth_tensor: Yi
                     })
            # Every so often, print out how well the graph is training.
            is_last_step = (i + 1 == FLAGS.how_many_training_steps)
            if (i % FLAGS.eval_step_interval) == 0 or is_last_step:
                train_accuracy, cross_entropy_value = sess.run(
                    [evaluation_step, cross_entropy],
                    feed_dict={
                        bottleneck_tensor: Xi,
                        ground_truth_tensor: Yi
                    })
            if (i % 1000) == 0:
                saver.save(sess, os.getcwd() + "/train/test2/", global_step=i)
            i += 1
        validation_accuracy = 0
        for Xj, Yj in iterate_mini_batches(X_validation, y_one_hot_validation,
                                           mini_batch_size):
            validation_accuracy = validation_accuracy + sess.run(
                evaluation_step,
                feed_dict={
                    bottleneck_tensor: Xj,
                    ground_truth_tensor: Yj
                })
        validation_accuracy = validation_accuracy / X_validation.shape[0]
        print(
            '%s: Step %d: Train accuracy = %.1f%%, Cross entropy = %f, Validation accuracy = %.1f%%'
            % (datetime.now(), i, train_accuracy * 100, cross_entropy_value,
               validation_accuracy * 100))
    for Xi, Yi in iterate_mini_batches(
            X_test_pool3, encode_one_hot(len(classes), y_test_pool3),
            mini_batch_size):
        test_accuracy = sess.run(evaluation_step,
                                 feed_dict={
                                     bottleneck_tensor: Xi,
                                     ground_truth_tensor: Yi
                                 })
    print('Final test accuracy = %.1f%%' % (test_accuracy * 100))