Складання прогнозів за допомогою моделі TensorFlow


82

Я дотримувався наведених підручників з mnist і мав змогу навчити модель та оцінити її точність. Однак підручники не показують, як робити прогнози за даною моделлю. Мене не цікавить точність, я просто хочу використати модель для прогнозування нового прикладу, а на виході побачити всі результати (мітки), кожен із присвоєним їм балом (відсортовано чи ні).


I made a repository where you can draw numbers and test the model with your own data. github.com/EddieOne/mnist-live-test It doesn't come with instructions. I did however make a video with a high level overview. youtube.com/watch?v=pudJU-cDkMo
Eddie

Відповіді:


73

In the "Deep MNIST for Experts" example, see this line:

Тепер ми можемо реалізувати нашу модель регресії. Це займає лише один рядок! Ми множимо векторизовані вхідні зображення x на матрицю ваги W, додаємо зсув b і обчислюємо ймовірності softmax, призначені кожному класу.

y = tf.nn.softmax(tf.matmul(x,W) + b)

Просто натягніть вузол y, і ви отримаєте те, що хочете.

feed_dict = {x: [your_image]}
classification = tf.run(y, feed_dict)
print classification

Це стосується практично будь-якої моделі, яку ви створюєте - ви розрахували ймовірності прогнозування як один із останніх кроків перед обчисленням втрат.


1
Під час тестування цієї пропозиції на прикладі convnet ( y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) я розумію Invalid argument: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float, для простого прикладу softmax це чудово працює. Будь-які ідеї, чому це так?
Даніель Закріссон,

3
Я можу відповісти на власний коментар: Приклад convnet має додаткову змінну в feed_dict, я пропустив це додати. У цьому випадку feed_dict повинен виглядати так:feed_dict = {x: [your_image], keep_prob:1.0}
Daniel Zakrisson

На виході з вашого коду буде щось на зразок [False True False ..., True False True], але я хочу перетворити це на [3 1 3 ..., 1 5 1], де неправильні мітки класів замість False . як ми можемо отримати те ярлик, який неправильно класифікується замість хибного?
Nomiluks

14
tf.run()здається, його видалили, але y.eval(feed_dict)працював у мене.
астром

більш повну думку цього питання можна знайти тут, github.com/tensorflow/tensorflow/issues/97 . Сподіваюся, це допоможе
Праміт

16

Як запропонував @dga, вам потрібно запустити новий екземпляр даних за допомогою вашої вже передбаченої моделі.

Ось приклад:

Припустимо, ви пройшли перший підручник і розрахували точність вашої моделі (модель така:) y = tf.nn.softmax(tf.matmul(x, W) + b). Тепер ви берете свою модель і застосовуєте до неї нову точку даних. У наступному коді я обчислюю вектор, отримуючи положення максимального значення. Покажіть зображення та надрукуйте максимальне положення.

from matplotlib import pyplot as plt
from random import randint
num = randint(0, mnist.test.images.shape[0])
img = mnist.test.images[num]

classification = sess.run(tf.argmax(y, 1), feed_dict={x: [img]})
plt.imshow(img.reshape(28, 28), cmap=plt.cm.binary)
plt.show()
print 'NN predicted', classification[0]

4

2.0 Сумісна відповідь : Припустимо, ви створили модель Keras, як показано нижче:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

Потім навчіть та оцініть модель, використовуючи наведений нижче код:

model.fit(train_images, train_labels, epochs=10)
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

Після цього, якщо ви хочете передбачити клас конкретного зображення, ви можете зробити це, використовуючи наведений нижче код:

predictions_single = model.predict(img)

Якщо ви хочете передбачити класи набору зображень, ви можете скористатися наведеним нижче кодом:

predictions = model.predict(new_images)

де new_images- масив зображень.

Для отримання додаткової інформації зверніться до цього посібника з Tensorflow .


2

Питання стосується спеціально підручника Google MNIST , який визначає предиктор, але не застосовує його. Використовуючи вказівки із допису блогу TensorFlow Estimator Джонатана Хуя , ось код, який точно відповідає навчальному посібнику Google і робить прогнози:

from matplotlib import pyplot as plt

images = mnist.test.images[0:10]

predict_input_fn = tf.estimator.inputs.numpy_input_fn(
      x={"x":images},
      num_epochs=1,
      shuffle=False)

mnist_classifier.predict(input_fn=predict_input_fn)

for image,p in zip(images,mnist_classifier.predict(input_fn=predict_input_fn)):
    print(np.argmax(p['probabilities']))
    plt.imshow(image.reshape(28, 28), cmap=plt.cm.binary)
    plt.show()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.