Я реализовал softmax с numpy. Как видно из кода, у нас есть матрица, и мы хотим получить softmax для строки. Например, мягкий максимум для строки 1 вычисляется путем деления np.sum(np.exp([1,3,6,-3,1]) на 1,3,5,-3,1 Мягкий максимум для строки 2 состоит в том, чтобы найти мягкий максимум для np.sum(np.exp([5,2,1,4,3]). Как мне это сделать?
def softmax(x):
return np.exp(x)/np.sum(np.exp(x),axis=1)
x = np.array([[1,3,6,-3,1],
[5,2,1,4,3]])
print(softmax(x))
print(f"1:{softmax(x)[0]} sum : {np.sum(softmax(x)[0])}")
print(f"2:{softmax(x)[1]} sum : {np.sum(softmax(x)[1])}")
ValueError Traceback (most recent call last)
<ipython-input-261-eb8c9feae03f> in <module>
5
6
----> 7 print(softmax(x))
8 print(f"1:{softmax(x)[0]} sum : {np.sum(softmax(x)[0])}")
9 print(f"2:{softmax(x)[1]} sum : {np.sum(softmax(x)[1])}")
<ipython-input-261-eb8c9feae03f> in softmax(x)
1 def softmax(x):
----> 2 return np.exp(x)/np.sum(np.exp(x),axis=1)
3 x = np.array([[1,3,6,-3,1],
4 [5,2,1,4,3]])
5
ValueError: operands could not be broadcast together with shapes (2,5) (2,)
>
Вы должны reshape
np.sum
результат.
np.exp(x) / np.sum(np.exp(x), axis=1).reshape(2,1)
вместо
np.exp(x) / np.sum(np.exp(x), axis=1)
Более общий способ, вы можете использовать приведенный ниже оператор.
return np.exp(x) / np.sum(np.exp(x),axis=1).reshape(x.shape[0], -1)
Проблема здесь в том, что sum(exp(x), axis=1)
возвращает одномерный массив numpy. Измените его на sum(esp(x), axis=1, keepdims=True)
, чтобы numpy не удалял автоматически одно измерение.
def softmax(x):
return np.exp(x)/np.sum(np.exp(x),axis=1, keepdims=True)
x = np.array([[1,3,6,-3,1],
[5,2,1,4,3]])
print(softmax(x))
print(f"1:{softmax(x)[0]} sum : {np.sum(softmax(x)[0])}")
print(f"2:{softmax(x)[1]} sum : {np.sum(softmax(x)[1])}")
К вашему сведению: SciPy имеет функцию
softmax
начиная с версии 1.2.0: scipy.special.softmax