Тестирование изображения на модели MNIST, Python TensorFlow

Недавно я начал изучать python и tensorflow одновременно, в настоящее время работаю над MNIST, вот код, обучение модели и тестирование на наборе данных MNIST выполнено, моя следующая задача - взять изображение с компьютера, импортировать его в свою программу и протестировать это изображение на моей обученной модели. Итак, у меня есть 2 вопроса

  1. Как я могу сохранить свою модель, чтобы мне не приходилось запускать ее снова и снова?

  2. Как изображение можно импортировать и протестировать на этой модели, чтобы модель могла предсказать, какой номер это

    import tensorflow as tf`
    from tensorflow.examples.tutorials.mnist import input_data
    
    mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
    n_nodes_hl1 = 500
    n_nodes_hl2 = 500
    n_nodes_hl3 = 500
    n_classes = 10
    batch_size = 100
    x = tf.placeholder('float', [None, 784])
    y = tf.placeholder('float')
    
    def neural_network_model(data):
        hidden_1_layer = {'weights': tf.Variable(tf.random_normal([784, n_nodes_hl1])),
                          'biases': tf.Variable(tf.random_normal([n_nodes_hl1]))}
    hidden_2_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])),
                      'biases': tf.Variable(tf.random_normal([n_nodes_hl2]))}
    
    hidden_3_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])),
                      'biases': tf.Variable(tf.random_normal([n_nodes_hl3]))}
    
    output_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl3, n_classes])),
                    'biases': tf.Variable(tf.random_normal([n_classes])), }
    
    l1 = tf.add(
        tf.matmul(
            data,
            hidden_1_layer['weights']),
        hidden_1_layer['biases'])
    l1 = tf.nn.relu(l1)
    
    l2 = tf.add(
        tf.matmul(
            l1,
            hidden_2_layer['weights']),
        hidden_2_layer['biases'])
    l2 = tf.nn.relu(l2)
    
    l3 = tf.add(
        tf.matmul(
            l2,
            hidden_3_layer['weights']),
        hidden_3_layer['biases'])
    l3 = tf.nn.relu(l3)
    
    output = tf.matmul(l3, output_layer['weights']) + output_layer['biases']
    
    return output
    
    
    def train_neural_network(x):
        prediction = neural_network_model(x)
        cost = tf.reduce_mean(
            tf.nn.softmax_cross_entropy_with_logits(
                logits=prediction, labels=y))
        optimizer = tf.train.AdamOptimizer().minimize(cost)
    hm_epochs = 10
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
    
        for epoch in range(hm_epochs):
            epoch_loss = 0
            for _ in range(int(mnist.train.num_examples / batch_size)):
                epoch_x, epoch_y = mnist.train.next_batch(batch_size)
                _, c = sess.run([optimizer, cost], feed_dict={
                                x: epoch_x, y: epoch_y})
                epoch_loss += c
    
            print(
                'Epoch',
                epoch,
                'completed out of',
                hm_epochs,
                'loss:',
                epoch_loss)
    
        correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
    
        accuracy = tf.reduce_mean(tf.cast(correct, 'float'))
        print('Accuracy:', accuracy.eval(
            {x: mnist.test.images, y: mnist.test.labels}))
    
    train_neural_network(x)
    

person Daniyal Javaid    schedule 03.07.2017    source источник
comment
Я нашел решение для сохранения и повторного использования модели   -  person Daniyal Javaid    schedule 03.07.2017
comment
Ваши данные iamge в любом случае превращаются в массив чисел, представляющих изображение. Таким образом, вы всегда можете создать новый сценарий вывода, который загружает модель, а затем просто оценивает изображение. Нет необходимости создавать функции чтения больших наборов данных только для одного изображения.   -  person JCooke    schedule 03.07.2017


Ответы (1)


Ваша модель имеет выходной тензор prediction. Если вы скармливаете только изображение, оно должно содержать 10 цифр. Индекс наивысшего числа - это прогноз (для этого вы уже используете tf.argmax (prediction, 1)).

Чтобы получить только прогноз, вы можете сделать

sess.run(prediction, feed_dict={x: <numpy array or tensor containing the 784 floats representing your image>})`
person iga    schedule 13.07.2017
comment
Я преобразовал изображение в массив с плавающей запятой размером 784, и теперь он прогнозирует это конкретное изображение, но прогнозы в основном неверны. Как я могу нормализовать свои изображения, чтобы прогноз был точным? - person Daniyal Javaid; 14.07.2017
comment
точность модели составляет 92%, и она точно предсказывает набор тестовых данных, единственная проблема возникает, когда я использую собственное изображение для предсказания, предсказания в основном неверны - person Daniyal Javaid; 14.07.2017
comment
Это общий вопрос машинного обучения, который не совсем подходит для StackOverflow (более подходящим форумом является stats.stackexchange.com), но некоторые из возможных на что посмотреть. Ваш образ сильно отличается от тренировочного набора? Насколько точна конвертация? Вы можете посмотреть учебные материалы здесь github.com/ тензорный поток / тензорный поток / дерево / r1.2 / тензорный поток / примеры /. В нем есть несколько моделей от простых до более сложных. - person iga; 14.07.2017