तो, यह वास्तव में रेगिस्तान के जवाब के लिए एक टिप्पणी है लेकिन मैं अपनी प्रतिष्ठा के कारण अभी तक इस पर टिप्पणी नहीं कर सकता। जैसा कि उन्होंने बताया, यदि आपके इनपुट में एक ही नमूना है, तो आपका संस्करण केवल सही है। यदि आपके इनपुट में कई नमूने हैं, तो यह गलत है। हालांकि, डेजर्टनॉट का समाधान भी गलत है। समस्या यह है कि एक बार वह 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]])
आप देख सकते हैं कि desernauts संस्करण इस स्थिति में विफल हो जाएगा। (यह नहीं होगा कि इनपुट np.array ([1, 2, 3, 6]) की तरह केवल एक आयामी था।
अब हम 3 नमूनों का उपयोग करते हैं यही कारण है कि हम एक 2 आयामी इनपुट का उपयोग करते हैं। निम्नलिखित एक्स 2 desernauts उदाहरण से एक के रूप में ही नहीं है।
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)
इसके अतिरिक्त, यहाँ TensorFlows सॉफ्टमैक्स कार्यान्वयन के परिणाम हैं:
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)