2017-04-16 11 views
1

スタンフォードcs244nクラスのassignment 1を調べようとしています。問題1bはSoftmax関数の最適化を強く推奨します。私はN次元ベクトルのSoftmaxを得ることができました。私はMxN次元行列のSoftmaxを得ましたが、列を使ってforループを使いました。私は次のコードを持っています:多次元行列のSoftmax確率をベクトル化する方法

​​

もっと最適化されたMatrix実装を実装できますか?

答えて

3

、それは次元の一般的な数のndarraysをカバー -

exp_max = np.exp(x - np.max(x,axis=-1,keepdims=True)) 
out = exp_max/np.sum(exp_max,axis=-1,keepdims=True) 
+0

答えをありがとう。私はあなたの答えを答えとしてマークしました。 –

1

np.apply_along_axisを使用すると、コードを実行する軸(ケースaxis=1)を指定する必要があります。関連ufuncsNumPy broadcastingを使用して

In [1]: import numpy as np 

In [2]: def softmax(x): 
    ...:  orig_shape = x.shape 
    ...: 
    ...:  # Matrix 
    ...:  if len(x.shape) > 1: 
    ...:   softmax = np.zeros(orig_shape) 
    ...:   for i,col in enumerate(x): 
    ...:    softmax[i] = np.exp(col - np.max(col))/np.sum(np.exp(col - np.max(col))) 
    ...:  # Vector 
    ...:  else: 
    ...:   softmax = np.exp(x - np.max(x))/np.sum(np.exp(x - np.max(x))) 
    ...:  return softmax 
    ...: 

In [3]: def softmax_vectorize(x): 
    ...:  return np.exp(x - np.max(x))/np.sum(np.exp(x - np.max(x))) 
    ...: 

In [4]: X = np.array([[1, 0, 0, 4, 5, 0, 7], 
    ...:   [1, 0, 0, 4, 5, 0, 7], 
    ...:   [1, 0, 0, 4, 5, 0, 7]]) 

In [5]: print softmax(X) 
[[ 2.08239574e-03 7.66070581e-04 7.66070581e-04 4.18260365e-02 
    1.13694955e-01 7.66070581e-04 8.40098401e-01] 
[ 2.08239574e-03 7.66070581e-04 7.66070581e-04 4.18260365e-02 
    1.13694955e-01 7.66070581e-04 8.40098401e-01] 
[ 2.08239574e-03 7.66070581e-04 7.66070581e-04 4.18260365e-02 
    1.13694955e-01 7.66070581e-04 8.40098401e-01]] 

In [6]: print np.apply_along_axis(softmax_vecorize, axis=1, arr=X) 
[[ 2.08239574e-03 7.66070581e-04 7.66070581e-04 4.18260365e-02 
    1.13694955e-01 7.66070581e-04 8.40098401e-01] 
[ 2.08239574e-03 7.66070581e-04 7.66070581e-04 4.18260365e-02 
    1.13694955e-01 7.66070581e-04 8.40098401e-01] 
[ 2.08239574e-03 7.66070581e-04 7.66070581e-04 4.18260365e-02 
    1.13694955e-01 7.66070581e-04 8.40098401e-01]] 
+0

うわー、これはそれを行うための別の興味深い方法である: ここで働い例です。ありがとう。 –

関連する問題