我正在尝试为我的反向传播和梯度下降程序开发一个Python中的Softmax函数。我在获取输出层(2个输出)的输出后调用Softmax函数,输出类似于向量[0.844521, 0.147048]
,我目前实现的Softmax函数如下:
import mathvector = [0.844521, 0.147048]def soft_max(x): e = math.exp(x) return e / e.sum()print(soft_max(vector))
然而,当我运行它时,我得到了以下错误
TypeError: must be real number, not list
注意:我只想使用math库,不使用其他库
回答:
函数math.exp
只能对标量操作,不能应用于整个数组。如果你只想使用math
,那么你需要逐元素实现它:
import mathdef soft_max(x): exponents = [] for element in x: exponents.append(math.exp(element)) summ = sum(exponents) for i in range(len(exponents)): exponents[i] = exponents[i] / summ return exponents if __name__=="__main__": arr = [0.844521, 0.147048] output = soft_max(arr) print(output)
然而,我仍然想强调,使用numpy
会更容易解决这个问题:
import numpy as npdef soft_max(x): e = np.exp(x) return e / np.sum(e)if __name__=="__main__": arr = [0.844521, 0.147048] output = soft_max(arr) print(output)