tl; dr Mặc dù đây là một bộ dữ liệu phân loại hình ảnh, nó vẫn là một nhiệm vụ rất dễ dàng , mà người ta có thể dễ dàng tìm thấy một ánh xạ trực tiếp từ đầu vào đến dự đoán.
Câu trả lời:
Đây là một câu hỏi rất thú vị và nhờ sự đơn giản của hồi quy logistic mà bạn thực sự có thể tìm ra câu trả lời.
Những gì hồi quy logistic làm là cho mỗi hình ảnh chấp nhận đầu vào và nhân chúng với trọng số để tạo dự đoán của nó. Điều thú vị là do ánh xạ trực tiếp giữa đầu vào và đầu ra (nghĩa là không có lớp ẩn), giá trị của mỗi trọng số tương ứng với mỗi một trong số đầu vào được tính đến khi tính toán xác suất của mỗi lớp. Bây giờ, bằng cách lấy các trọng số cho mỗi lớp và định hình lại chúng thành (tức là độ phân giải hình ảnh), chúng ta có thể biết pixel nào là quan trọng nhất cho tính toán của mỗi lớp .78478428×28
Lưu ý, một lần nữa, đây là những trọng lượng .
Bây giờ hãy xem hình ảnh trên và tập trung vào hai chữ số đầu tiên (tức là 0 và một). Trọng lượng màu xanh có nghĩa là cường độ của pixel này đóng góp rất nhiều cho lớp đó và các giá trị màu đỏ có nghĩa là nó đóng góp tiêu cực.
Bây giờ hãy tưởng tượng, làm thế nào để một người vẽ ? Anh ta vẽ một hình tròn trống rỗng ở giữa. Đó chính xác là những gì các trọng lượng nhặt được trên. Trong thực tế, nếu một người nào đó thu hút giữa của hình ảnh, nó đếm tiêu cực như một số không. Vì vậy, để nhận ra số không, bạn không cần một số bộ lọc tinh vi và các tính năng cấp cao. Bạn chỉ có thể nhìn vào các vị trí pixel được vẽ và đánh giá theo điều này.0
Điều tương tự cho . Nó luôn có một đường thẳng đứng ở giữa hình ảnh. Tất cả những thứ khác được tính tiêu cực.1
Các chữ số còn lại phức tạp hơn một chút, nhưng với trí tưởng tượng nhỏ, bạn có thể thấy , , và . Các con số còn lại khó khăn hơn một chút, đó là điều thực sự hạn chế hồi quy logistic khi đạt đến những năm 90 cao.2378
Thông qua điều này, bạn có thể thấy rằng hồi quy logistic có cơ hội rất tốt để có được nhiều hình ảnh đúng và đó là lý do tại sao nó đạt điểm rất cao.
Mã để tái tạo hình trên có một chút ngày, nhưng ở đây bạn đi:
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
# Load MNIST:
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# Create model
x = tf.placeholder(tf.float32, shape=(None, 784))
y = tf.placeholder(tf.float32, shape=(None, 10))
W = tf.Variable(tf.zeros((784,10)))
b = tf.Variable(tf.zeros((10)))
z = tf.matmul(x, W) + b
y_hat = tf.nn.softmax(z)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(y_hat), reduction_indices=[1]))
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) #
correct_pred = tf.equal(tf.argmax(y_hat, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# Train model
batch_size = 64
with tf.Session() as sess:
loss_tr, acc_tr, loss_ts, acc_ts = [], [], [], []
sess.run(tf.global_variables_initializer())
for step in range(1, 1001):
x_batch, y_batch = mnist.train.next_batch(batch_size)
sess.run(optimizer, feed_dict={x: x_batch, y: y_batch})
l_tr, a_tr = sess.run([cross_entropy, accuracy], feed_dict={x: x_batch, y: y_batch})
l_ts, a_ts = sess.run([cross_entropy, accuracy], feed_dict={x: mnist.test.images, y: mnist.test.labels})
loss_tr.append(l_tr)
acc_tr.append(a_tr)
loss_ts.append(l_ts)
acc_ts.append(a_ts)
weights = sess.run(W)
print('Test Accuracy =', sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}))
# Plotting:
for i in range(10):
plt.subplot(2, 5, i+1)
weight = weights[:,i].reshape([28,28])
plt.title(i)
plt.imshow(weight, cmap='RdBu') # as noted by @Eric Duminil, cmap='gray' makes the numbers stand out more
frame1 = plt.gca()
frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)