Jadi, ini benar-benar komentar untuk jawaban desertnaut tetapi saya belum bisa mengomentarinya karena reputasi saya. Seperti yang ia tunjukkan, versi Anda hanya benar jika input Anda terdiri dari satu sampel tunggal. Jika input Anda terdiri dari beberapa sampel, itu salah. Namun, solusi desertnaut juga salah. Masalahnya adalah sekali dia mengambil input 1 dimensi dan kemudian dia mengambil input 2 dimensi. Biarkan saya menunjukkan ini kepada Anda.
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
Mari kita ambil contoh desertnaut:
x1 = np.array([[1, 2, 3, 6]]) # notice that we put the data into 2 dimensions(!)
Ini hasilnya:
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]])
Anda dapat melihat bahwa versi desernaut akan gagal dalam situasi ini. (Tidak akan jika input hanya satu dimensi seperti np.array ([1, 2, 3, 6]).
Sekarang mari kita gunakan 3 sampel karena itulah alasan mengapa kita menggunakan input 2 dimensi. X2 berikut ini tidak sama dengan yang dari contoh desernauts.
x2 = np.array([[1, 2, 3, 6], # sample 1
[2, 4, 5, 6], # sample 2
[1, 2, 3, 6]]) # sample 1 again(!)
Input ini terdiri dari batch dengan 3 sampel. Tetapi sampel satu dan tiga pada dasarnya sama. Kami sekarang mengharapkan 3 baris aktivasi softmax di mana yang pertama harus sama dengan yang ketiga dan juga sama dengan aktivasi x1 kami!
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]])
Saya harap Anda dapat melihat bahwa ini hanya masalah dengan solusi saya.
softmax(x1) == softmax(x2)[0]
array([[ True, True, True, True]], dtype=bool)
softmax(x1) == softmax(x2)[2]
array([[ True, True, True, True]], dtype=bool)
Selain itu, berikut adalah hasil implementasi softmax 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})
Dan hasilnya:
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)