В вычитании встречается недопустимое значение - Softmax, Python - PullRequest
0 голосов
/ 17 марта 2019

Я использую численно стабилизированную версию softmax как: -

def softmax(arr):
    print(arr)
    expArr=np.exp(arr-np.max(arr))
    print(expArr)
    return expArr/np.sum(expArr)

Он используется как: -

def feedforward(x_i,W):
    ...
    outputLayer = softmax(np.dot(network[-1],W[-1]))
    ...

И эта функция вызывается итеративно: -

for j in range(len(x)):
    ....
    network = feedforward(x[j],weights)
    ....

Тем не менее, для некоторой последовательности массивов я получаю предупреждение: -

RuntimeWarning: invalid value encountered in subtract
  expArr=np.exp(arr-np.max(arr))

Входы (и выходы), идущие к функции непосредственно перед предупреждением: -

input
[-1.36678160e+211 -1.97916134e+206 -5.44472726e+204 -5.47948095e+276
 -6.30134248e+251 -4.04707279e+210  7.72371508e+204  1.34861349e+268
  5.47948093e+276  1.06699784e+206]
output
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
input
[-7.06701455e+257  1.47067222e+250              inf             -inf
 -1.13669521e+298 -6.54589076e+254  8.22221348e+250              inf
             -inf -5.44761594e+251]
digit.py:22: RuntimeWarning: invalid value encountered in subtract
  expArr=np.exp(arr-np.max(arr))
output
[ 0.  0. nan  0.  0.  0.  0. nan  0.  0.]
input
[nan nan nan nan nan nan nan nan nan nan]
output
[nan nan nan nan nan nan nan nan nan nan]

Я хочу знать, что хотя я стабилизировал функцию softmax, введя термин np.max(arr), почему я все еще получаю эту ошибку, и как я могу ее исправить?Спасибо!

Кроме того, я также использовал функцию softmax, приведенную в scipy.special, но все равно получал то же предупреждение.

1 Ответ

0 голосов
/ 17 марта 2019

"inf" во входном массиве делает деление равным

"<non inf number>/inf"

, который дает "0" и

"inf/inf" 

, что дает "нан"

Вы должны исключить "inf" из входного массива.

...