tl; dr যদিও এটি একটি চিত্র শ্রেণীবদ্ধ ডেটাসেট, এটি একটি খুব সহজ কাজ হিসাবে রয়ে গেছে , যার জন্য সহজেই ইনপুট থেকে পূর্বাভাসে সরাসরি ম্যাপিং পাওয়া যায়।
উত্তর:
এটি একটি খুব আকর্ষণীয় প্রশ্ন এবং লজিস্টিক রিগ্রেশনটির সরলতার জন্য ধন্যবাদ যা আপনি আসলে উত্তরটি খুঁজে পেতে পারেন।
লজিস্টিক রিগ্রেশন যা করে তা প্রতিটি চিত্রের জন্য ইনপুট গ্রহণ করে এবং এর পূর্বাভাস তৈরি করতে ওজন দিয়ে তাদের গুণ করে। মজার বিষয় হ'ল ইনপুট এবং আউটপুট (যেমন কোনও লুকানো স্তর নেই) এর মধ্যে সরাসরি ম্যাপিংয়ের কারণে, প্রতিটি শ্রেণীর সম্ভাব্যতা গণনা করার সময় প্রতিটি ওজনের মান ইনপুটগুলির প্রতিটি বিবেচনায় নেওয়া কতটা তার সাথে যায়। এখন, প্রতিটি শ্রেণীর জন্য ওজন নিয়ে এবং সেগুলি পুনরায় আকার দিয়ে (অর্থাত্ চিত্রের রেজোলিউশন) এর মাধ্যমে আমরা বলতে পারি যে প্রতিটি শ্রেণীর গণনার জন্য পিক্সেলগুলি সবচেয়ে গুরুত্বপূর্ণ ।78478428×28
আবার নোট করুন, এগুলি ওজন ।
এখন উপরের চিত্রটি একবার দেখুন এবং প্রথম দুটি সংখ্যায় (যেমন শূন্য এবং একটি) ফোকাস করুন। নীল ওজনের অর্থ এই পিক্সেলের তীব্রতা সেই শ্রেণীর জন্য প্রচুর অবদান রাখে এবং লাল মানগুলির অর্থ এটি নেতিবাচকভাবে অবদান রাখে।
এখন কল্পনা করুন, একজন ব্যক্তি কীভাবে আঁকেন ? তিনি একটি বৃত্তাকার আকার আঁকেন যা মাঝখানে ফাঁকা। ওজনটি ঠিক তেমনই উঠেছে। আসলে যদি কেউ চিত্রটির মাঝখানে আঁকেন তবে এটি শূন্য হিসাবে নেতিবাচকভাবে গণনা করা হয়। সুতরাং শূন্যগুলি সনাক্ত করতে আপনার কয়েকটি পরিশীলিত ফিল্টার এবং উচ্চ-স্তরের বৈশিষ্ট্যগুলির প্রয়োজন নেই। আপনি কেবল টানা পিক্সেলের অবস্থানগুলি দেখতে এবং এটি অনুসারে বিচার করতে পারেন।0
জন্য একই জিনিস । ইমেজের মাঝখানে এটি সর্বদা একটি সরল উল্লম্ব রেখা থাকে। অন্য সবগুলি নেতিবাচকভাবে গণনা করা হয়।1
ডিজিটের বাকি একটি বিট আরো জটিল, কিন্তু সামান্য কল্পনার সঙ্গে আপনি দেখতে পারেন , , ও । বাকী সংখ্যাগুলি কিছুটা বেশি কঠিন, যা আসলে লজিস্টিক রিগ্রেশনকে উচ্চ-90-এর দশকে পৌঁছানো থেকে সীমাবদ্ধ করে।2378
এর মাধ্যমে আপনি দেখতে পাচ্ছেন যে লজিস্টিক রিগ্রেশনটিতে অনেকগুলি চিত্র সঠিকভাবে পাওয়ার খুব ভাল সুযোগ রয়েছে এবং সে কারণেই এটি এত বেশি স্কোর করে।
উপরের চিত্রটি পুনরুত্পাদন করার কোডটি কিছুটা তারিখযুক্ত তবে এখানে আপনি যান:
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)