https://classroom.udacity.com/courses/ud730/lessons/6370362152/concepts/63815621490923に従って、入力として 2 次元配列を指定すると、次のソフトマックスを計算する「ソフトマックス」関数を作成しようとしています。各列。テストするために次のスクリプトを作成しました。
import numpy as np
#scores=np.array([1.0,2.0,3.0])
scores=np.array([[1,2,3,6],
[2,4,5,6],
[3,8,7,6]])
def softmax(x):
if x.ndim==1:
S=np.sum(np.exp(x))
return np.exp(x)/S
elif x.ndim==2:
result=np.zeros_like(x)
M,N=x.shape
for n in range(N):
S=np.sum(np.exp(x[:,n]))
result[:,n]=np.exp(x[:,n])/S
return result
else:
print("The input array is not 1- or 2-dimensional.")
s=softmax(scores)
print(s)
ただし、結果の "s" はゼロの配列であることがわかります。
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
for ループで「/S」を削除すると、「正規化されていない」結果が期待どおりになります。どういうわけか、「/ S」除算は、各要素を S で除算する代わりに、すべての要素をゼロにするように見えます。コードの何が問題になっていますか?