3

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 で除算する代わりに、すべての要素をゼロにするように見えます。コードの何が問題になっていますか?

4

3 に答える 3

6

「ゼロ」の理由は、「int」型の入力のデータ型にあります。入力を「float」に変換すると、問題が解決しました。

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):
    x=x.astype(float)
    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)

関数定義の最初の行に「x=x.astype(float)」を追加したことに注意してください。これにより、期待される出力が得られます。

[[ 0.09003057  0.00242826  0.01587624  0.33333333]
 [ 0.24472847  0.01794253  0.11731043  0.33333333]
 [ 0.66524096  0.97962921  0.86681333  0.33333333]]
于 2016-04-20T09:10:38.970 に答える