সুতরাং, এটি সত্যিই মরুভূমির উত্তরের একটি মন্তব্য তবে আমি আমার খ্যাতির কারণে এটি নিয়ে এখনও মন্তব্য করতে পারি না। যেমনটি তিনি উল্লেখ করেছেন, আপনার ইনপুটটি কেবলমাত্র সঠিক যদি আপনার ইনপুটটিতে কোনও একক নমুনা থাকে। যদি আপনার ইনপুটটিতে বেশ কয়েকটি নমুনা থাকে তবে এটি ভুল। তবে মরুভূমির সমাধানও ভুল wrong সমস্যাটি হ'ল একবার তিনি 1-মাত্রিক ইনপুট নেন এবং তারপরে তিনি 2-মাত্রিক ইনপুট নেন। আমি আপনাকে এটি দেখাতে দিন।
import numpy as np
# your solution:
def your_softmax(x):
"""Compute softmax values for each sets of scores in x."""
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum()
# desertnaut solution (copied from his answer):
def desertnaut_softmax(x):
"""Compute softmax values for each sets of scores in x."""
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum(axis=0) # only difference
# my (correct) solution:
def softmax(z):
assert len(z.shape) == 2
s = np.max(z, axis=1)
s = s[:, np.newaxis] # necessary step to do broadcasting
e_x = np.exp(z - s)
div = np.sum(e_x, axis=1)
div = div[:, np.newaxis] # dito
return e_x / div
মরুভূমির উদাহরণ নিতে দাও:
x1 = np.array([[1, 2, 3, 6]]) # notice that we put the data into 2 dimensions(!)
এটি আউটপুট:
your_softmax(x1)
array([[ 0.00626879, 0.01704033, 0.04632042, 0.93037047]])
desertnaut_softmax(x1)
array([[ 1., 1., 1., 1.]])
softmax(x1)
array([[ 0.00626879, 0.01704033, 0.04632042, 0.93037047]])
আপনি দেখতে পাচ্ছেন যে এই পরিস্থিতিতে মরুভূমি সংস্করণ ব্যর্থ হবে। (ইনপুটটি এনপি.আর্রে ([1, 2, 3, 6]) এর মতো মাত্র এক মাত্রিক হলে তা হবে না।
আমরা 2 মাত্রিক ইনপুট কেন ব্যবহার করি তার কারণেই এখন 3 টি নমুনা ব্যবহার করা যাক। নিম্নলিখিত x2 মরুভূমি উদাহরণ থেকে এক হিসাবে একই নয়।
x2 = np.array([[1, 2, 3, 6], # sample 1
[2, 4, 5, 6], # sample 2
[1, 2, 3, 6]]) # sample 1 again(!)
এই ইনপুটটিতে 3 টি নমুনা সহ একটি ব্যাচ রয়েছে। তবে নমুনা এক এবং তিনটি মূলত একই। আমরা এখন 3 সারি সফটম্যাক্স অ্যাক্টিভেশনগুলি আশা করি যেখানে প্রথমটি তৃতীয় এবং আমাদের এক্স 1 এর অ্যাক্টিভেশন হিসাবে একই হওয়া উচিত!
your_softmax(x2)
array([[ 0.00183535, 0.00498899, 0.01356148, 0.27238963],
[ 0.00498899, 0.03686393, 0.10020655, 0.27238963],
[ 0.00183535, 0.00498899, 0.01356148, 0.27238963]])
desertnaut_softmax(x2)
array([[ 0.21194156, 0.10650698, 0.10650698, 0.33333333],
[ 0.57611688, 0.78698604, 0.78698604, 0.33333333],
[ 0.21194156, 0.10650698, 0.10650698, 0.33333333]])
softmax(x2)
array([[ 0.00626879, 0.01704033, 0.04632042, 0.93037047],
[ 0.01203764, 0.08894682, 0.24178252, 0.65723302],
[ 0.00626879, 0.01704033, 0.04632042, 0.93037047]])
আমি আশা করি আপনি দেখতে পাচ্ছেন যে এটি কেবলমাত্র আমার সমাধানের ক্ষেত্রে।
softmax(x1) == softmax(x2)[0]
array([[ True, True, True, True]], dtype=bool)
softmax(x1) == softmax(x2)[2]
array([[ True, True, True, True]], dtype=bool)
অতিরিক্তভাবে, এখানে টেনসরফ্লোস সফটম্যাক্স বাস্তবায়নের ফলাফল রয়েছে:
import tensorflow as tf
import numpy as np
batch = np.asarray([[1,2,3,6],[2,4,5,6],[1,2,3,6]])
x = tf.placeholder(tf.float32, shape=[None, 4])
y = tf.nn.softmax(x)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(y, feed_dict={x: batch})
এবং ফলাফল:
array([[ 0.00626879, 0.01704033, 0.04632042, 0.93037045],
[ 0.01203764, 0.08894681, 0.24178252, 0.657233 ],
[ 0.00626879, 0.01704033, 0.04632042, 0.93037045]], dtype=float32)