Yani, bu gerçekten çölcülüğün cevabına bir yorum ama itibarım nedeniyle henüz yorum yapamam. Belirttiği gibi, sürümünüz yalnızca girdiniz tek bir örnek içeriyorsa doğrudur. Girişiniz birkaç örnekten oluşuyorsa, yanlıştır. Ancak, çölün çözümü de yanlıştır. Sorun şu ki, 1-boyutlu girdi aldıktan sonra 2-boyutlu girdi alıyor. Bunu size göstereyim.
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
Çöl örnekleri alalım:
x1 = np.array([[1, 2, 3, 6]]) # notice that we put the data into 2 dimensions(!)
Bu çıktı:
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]])
Bu durumda ıssızlık versiyonunun başarısız olacağını görebilirsiniz. (Girdi, np.array ([1, 2, 3, 6] gibi) sadece bir boyutlu olsaydı olmaz.
Şimdi 2 örnek kullanmamızın nedeni bu yüzden 3 örnek kullanalım. Aşağıdaki x2, desernauts örneğindekiyle aynı değildir.
x2 = np.array([[1, 2, 3, 6], # sample 1
[2, 4, 5, 6], # sample 2
[1, 2, 3, 6]]) # sample 1 again(!)
Bu girdi 3 numuneli bir gruptan oluşur. Ancak bir ve üç numaralı örnek aslında aynıdır. Şimdi birincisinin üçüncü ile aynı olması ve aynı zamanda x1 aktivasyonumuzla aynı olması gereken 3 sıra softmax aktivasyonu bekliyoruz!
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]])
Umarım bu benim çözümümde sadece durumdur.
softmax(x1) == softmax(x2)[0]
array([[ True, True, True, True]], dtype=bool)
softmax(x1) == softmax(x2)[2]
array([[ True, True, True, True]], dtype=bool)
Ayrıca, TensorFlows softmax uygulamasının sonuçları:
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})
Ve sonuç:
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)