Đưa ra dự đoán với mô hình TensorFlow


81

Tôi đã làm theo các hướng dẫn mnist đã cho và có thể đào tạo một mô hình và đánh giá độ chính xác của nó. Tuy nhiên, các hướng dẫn không chỉ ra cách đưa ra dự đoán cho một mô hình. Tôi không quan tâm đến độ chính xác, tôi chỉ muốn sử dụng mô hình để dự đoán một ví dụ mới và trong đầu ra xem tất cả các kết quả (nhãn), mỗi kết quả có điểm được chỉ định (được sắp xếp hoặc không).


Tôi đã tạo một kho lưu trữ nơi bạn có thể vẽ các con số và kiểm tra mô hình bằng dữ liệu của riêng bạn. github.com/EddieOne/mnist-live-test Nó không đi kèm với hướng dẫn. Tuy nhiên, tôi đã làm một video với cái nhìn tổng quan ở cấp độ cao. youtube.com/watch?v=pudJU-cDkMo
Eddie

Câu trả lời:


73

Trong ví dụ " MNIST sâu dành cho chuyên gia ", hãy xem dòng này:

Bây giờ chúng ta có thể triển khai mô hình hồi quy của mình. Nó chỉ mất một dòng! Chúng tôi nhân các hình ảnh đầu vào được vector hóa x với ma trận trọng số W, thêm độ lệch b và tính toán xác suất softmax được gán cho mỗi lớp.

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

Chỉ cần kéo nút y và bạn sẽ có những gì bạn muốn.

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

Điều này chỉ áp dụng cho bất kỳ mô hình nào bạn tạo - bạn sẽ tính toán các xác suất dự đoán như một trong những bước cuối cùng trước khi tính toán khoản lỗ.


1
Khi kiểm tra đề nghị này vào ví dụ convnet (với y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) tôi nhận được Invalid argument: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float, cho ví dụ softmax đơn giản, nó hoạt động tốt Bất kỳ ý tưởng tại sao điều này là như vậy.?
Daniel Zakrisson

3
Tôi có thể trả lời nhận xét của riêng mình: Ví dụ về đối tượng có một biến bổ sung trong feed_dict, tôi đã bỏ lỡ thêm biến đó. Trong trường hợp này, feed_dict sẽ trông như thế này:feed_dict = {x: [your_image], keep_prob:1.0}
Daniel Zakrisson,

Đầu ra mã của bạn sẽ là một số thứ như [False True False ..., True False True], nhưng tôi muốn chuyển đổi mã này thành [3 1 3 ..., 1 5 1], nhãn lớp không chính xác thay vì False . Làm thế nào chúng ta có thể nhận được nhãn được phân loại sai thay vì sai?
Nomiluks

14
tf.run()dường như đã được gỡ bỏ, nhưng y.eval(feed_dict)đã làm việc cho tôi.
astromme

bạn có thể tìm thấy suy nghĩ đầy đủ hơn về câu hỏi này tại đây, github.com/tensorflow/tensorflow/issues/97 . Hy vọng nó giúp
Pramit

16

Như @dga đã đề xuất, bạn cần chạy phiên bản mới của dữ liệu thông qua mô hình đã dự đoán của bạn.

Đây là một ví dụ:

Giả sử bạn đã xem qua hướng dẫn đầu tiên và tính toán độ chính xác của mô hình của bạn (mô hình là: y = tf.nn.softmax(tf.matmul(x, W) + b) :). Bây giờ bạn lấy mô hình của mình và áp dụng điểm dữ liệu mới cho nó. Trong đoạn mã sau, tôi tính toán vector, nhận vị trí của giá trị lớn nhất. Hiển thị hình ảnh và in vị trí tối đa đó.

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 Câu trả lời tương thích : Giả sử bạn đã xây dựng Mô hình Keras như hình dưới đây:

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

Sau đó đào tạo và đánh giá mô hình bằng cách sử dụng mã dưới đây:

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

Sau đó, nếu bạn muốn dự đoán lớp của một hình ảnh cụ thể, bạn có thể thực hiện bằng cách sử dụng đoạn mã dưới đây:

predictions_single = model.predict(img)

Nếu bạn muốn dự đoán các lớp của một tập hợp Hình ảnh, bạn có thể sử dụng mã dưới đây:

predictions = model.predict(new_images)

đâu new_imageslà Mảng Hình ảnh.

Để biết thêm thông tin, hãy tham khảo Hướng dẫn về Tensorflow này .


2

Câu hỏi đặc biệt là về hướng dẫn Google MNIST , định nghĩa một công cụ dự đoán nhưng không áp dụng nó. Sử dụng hướng dẫn từ bài đăng trên blog Công cụ ước tính TensorFlow của Jonathan Hui , đây là mã hoàn toàn phù hợp với hướng dẫn của Google và thực hiện dự đoán:

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.