Wykonywanie prognoz za pomocą modelu TensorFlow


82

Postępowałem zgodnie z podanymi samouczkami mnist i byłem w stanie wytrenować model i ocenić jego dokładność. Jednak samouczki nie pokazują, jak tworzyć prognozy na podstawie modelu. Nie interesuje mnie dokładność, chcę tylko użyć modelu do przewidzenia nowego przykładu, a na wyjściu zobaczyć wszystkie wyniki (etykiety), każdy z przypisaną oceną (posortowaną lub nie).


Stworzyłem repozytorium, w którym możesz rysować liczby i testować model na własnych danych. github.com/EddieOne/mnist-live-test Nie zawiera instrukcji. Zrobiłem jednak film z ogólnym omówieniem. youtube.com/watch?v=pudJU-cDkMo
Eddie

Odpowiedzi:


73

W przykładzie „ Deep MNIST for Experts ” zobacz ten wiersz:

Możemy teraz zaimplementować nasz model regresji. Wystarczy jedna linia! Mnożymy wektoryzowane obrazy wejściowe x przez macierz wag W, dodajemy odchylenie b i obliczamy prawdopodobieństwa softmax przypisane do każdej klasy.

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

Po prostu pociągnij węzeł y, a będziesz mieć to, czego chcesz.

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

Odnosi się to do prawie każdego utworzonego modelu - prawdopodobieństwo przewidywania zostanie obliczone jako jeden z ostatnich kroków przed obliczeniem straty.


1
Podczas testowania tej sugestii na przykładzie convnet (z y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) otrzymałem Invalid argument: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float, w przypadku prostego przykładu softmax działa dobrze. Jakieś pomysły, dlaczego tak jest?
Daniel Zakrisson

3
Mogę odpowiedzieć na swój własny komentarz: przykład convnet ma dodatkową zmienną w feed_dict, nie dodałem tego. W tym przypadku feed_dict powinien wyglądać tak:feed_dict = {x: [your_image], keep_prob:1.0}
Daniel Zakrisson

Wynik twojego kodu będzie czymś takim jak [False True False ..., True False True], ale chcę przekonwertować to na [3 1 3 ..., 1 5 1], które zawierają niepoprawne etykiety klas zamiast False . Jak możemy uzyskać etykietę, która jest błędnie sklasyfikowana zamiast fałszywej?
Nomiluks

14
tf.run()wydaje się, że został usunięty, ale y.eval(feed_dict)działał dla mnie.
astromme

dokładniejszą myśl o tym pytaniu można znaleźć tutaj, github.com/tensorflow/tensorflow/issues/97 . Mam nadzieję, że to pomoże
Pramit

16

Jak zasugerował @dga, musisz uruchomić nową instancję danych, korzystając z już przewidywanego modelu.

Oto przykład:

Załóżmy, że przeszedłeś przez pierwszy samouczek i obliczyłeś dokładność swojego modelu (model jest taki y = tf.nn.softmax(tf.matmul(x, W) + b):). Teraz chwyć model i zastosuj do niego nowy punkt danych. W poniższym kodzie obliczam wektor, uzyskując położenie maksymalnej wartości. Pokaż obraz i wydrukuj to maksymalne położenie.

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

Zgodna odpowiedź 2.0 : Załóżmy, że zbudowałeś model Keras, jak pokazano poniżej:

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'])

Następnie wytrenuj i oceń model za pomocą poniższego kodu:

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

Następnie, jeśli chcesz przewidzieć klasę konkretnego obrazu, możesz to zrobić za pomocą poniższego kodu:

predictions_single = model.predict(img)

Jeśli chcesz przewidzieć klasy zbioru obrazów, możesz użyć poniższego kodu:

predictions = model.predict(new_images)

gdzie new_imagesjest tablica obrazów.

Więcej informacji można znaleźć w tym samouczku Tensorflow .


2

Pytanie dotyczy w szczególności samouczka Google MNIST , który definiuje predyktor, ale go nie stosuje. Korzystając ze wskazówek z posta na blogu Jonathana Hui TensorFlow Estimator , oto kod, który dokładnie pasuje do samouczka Google i zawiera prognozy:

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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.