こんにちは。Python初学者のものです。
活性化関数(softmax関数)についての質問になるのですが、以下のような配列arrを用意したとき、axisで指定したうえで、配列の要素の最大値を返すよう実装する実験をしたいと考えています。
arr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,12,13],[73,72,71],[90,93,92],[100,101,102]])
プログラムは以下の通りです。
Python
1import numpy as np 2 3def softmax(x): 4 if x.ndim == 2: 5 x = x.T 6 x = x - np.max(x, axis=0) 7 y = np.exp(x) / np.sum(np.exp(x), axis=0) 8 return y.T 9 10 x = x - np.max(x) 11 return np.exp(x) / np.sum(np.exp(x)) 12 13arr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,12,13],[73,72,71],[90,93,92],[100,101,102]]) 14 15 16sum_arr = np.sum(arr,axis=1) 17sum_arr = sum_arr.reshape(7,1) 18new_arr = arr/sum_arr 19new_arr = softmax(new_arr) 20 21for i in range(40): 22 sum_arr = np.sum(new_arr,axis=1) 23 sum_arr = sum_arr.reshape(7,1) 24 new_arr = new_arr/sum_arr 25 new_arr = softmax(new_arr) 26 27print(new_arr) 28 29max_index = np.argmax(new_arr,axis=1) 30print('max_index=',max_index) 31
例えば上記のようなプログラムで、softmax関数を20回程度適用するだけならば、結果としては、
max_index= [2 2 2 2 0 1 2]
となります。
しかし、例として40回ほど適用すると、値が丸め込まれすぎているのか、
max_index= [0 0 0 0 0 0 0]
と表示されてしまいます。
なぜ、活性化関数を複数回適用するかについてですが、ニューラルネットワーク(CNNなど)の各層で得られた活性値を次の層への受け渡しとできないか考えているためです。
値の大小関係を継承しながら、活性化関数を適用するにはどのような案があるでしょうか?
ご回答よろしくお願いいたします。