tl; dr Her ne kadar bu bir sınıflandırma veri seti olsa da , girdilerden tahminlere kadar kolayca doğrudan bir harita bulabilen çok kolay bir görevdir .
Cevap:
Bu çok ilginç bir sorudur ve lojistik regresyonun basitliği sayesinde cevabı gerçekten öğrenebilirsiniz.
Lojistik regresyonun yaptığı, her bir görüntü için girişi kabul etmekte ve öngörüsünü oluşturmak için bunları ağırlıklarla çarpmaktadır. İlginç olan, girdi ve çıktı arasındaki doğrudan eşlemeden dolayı (yani gizli katman yok), her ağırlığın değerinin , her sınıfın olasılığını hesaplarken girdiden her birinin ne kadar dikkate alındığına karşılık gelmesidir. Şimdi, her bir sınıf için ağırlıklar alarak ve bunları (yani görüntü çözünürlüğü) olarak yeniden şekillendirerek , her bir sınıfın hesaplanması için hangi piksellerin en önemli olduğunu söyleyebiliriz .78478428×28
Yine bunların ağırlık olduğuna dikkat edin .
Şimdi yukarıdaki resme bakın ve ilk iki haneye odaklanın (yani sıfır ve bir). Mavi ağırlıklar, bu pikselin yoğunluğunun o sınıfa çok katkıda bulunduğunu ve kırmızı değerlerin olumsuz katkıda bulunduğunu gösterir.
Şimdi düşünün, bir kişi nasıl ? Aralarında boş olan dairesel bir şekil çizer. Bu tam olarak ağırlığın aldığı şeydi. Aslında eğer biri görüntünün ortasını çizerse, sıfır olarak negatif sayılır . Bu nedenle sıfırları tanımak için bazı karmaşık filtrelere ve üst düzey özelliklere ihtiyacınız yoktur. Çizilen piksel konumlarına bakabilir ve buna göre karar verebilirsiniz.0
için aynı şey . Görüntünün ortasında her zaman düz bir dikey çizgi vardır. Diğer her şey olumsuz sayılır.1
Rakamların geri kalanı biraz daha karmaşık, ancak küçük hayallerde , , ve . Sayıların geri kalanı biraz daha zor, bu da lojistik regresyonun 90'lara ulaşmasını engelleyen şey.2378
Bu sayede lojistik regresyonun birçok görüntüyü doğru bir şekilde elde etme şansının yüksek olduğunu ve bu yüzden çok yüksek puan aldığını görebilirsiniz.
Yukarıdaki rakamın çoğaltılması için kod biraz tarihli, ama işte gidiyorsunuz:
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)