I tried to implement soft-max with the following code (out_vec
is a numpy
vector of floats):
numerator = np.exp(out_vec)
denominator = np.sum(np.exp(out_vec))
out_vec = numerator/denominator
However, I got an overflow error because of np.exp(out_vec)
. Therefore, I checked (manually) what the upper limit of np.exp()
is, and found that np.exp(709)
is a number, but np.exp(710)
is considered to be np.inf
. Thus, to try to avoid the overflow error, I modified my code as follows:
out_vec[out_vec > 709] = 709 #prevent np.exp overflow
numerator = np.exp(out_vec)
denominator = np.sum(np.exp(out_vec))
out_vec = numerator/denominator
Now, I get a different error:
RuntimeWarning: invalid value encountered in greater out_vec[out_vec > 709] = 709
What's wrong with the line I added? I looked up this specific error and all I found is people's advice on how to ignore the error. Simply ignoring the error won't help me, because every time my code encounters this error it does not give the usual results.
Your problem is caused by the NaN
or Inf
elements in your out_vec
array. You could use the following code to avoid this problem:
if np.isnan(np.sum(out_vec)):
out_vec = out_vec[~numpy.isnan(out_vec)] # just remove nan elements from vector
out_vec[out_vec > 709] = 709
...
or you could use the following code to leave the NaN
values in your array:
out_vec[ np.array([e > 709 if ~np.isnan(e) else False for e in out_vec], dtype=bool) ] = 709