Kur*_*eek 3 python arrays numpy softmax
在https://classroom.udacity.com/courses/ud730/lessons/6370362152/concepts/63815621490923之后,我正在尝试编写一个"softmax"函数,当给定一个二维数组作为输入时,计算softmax每一栏.我编写了以下脚本来测试它:
import numpy as np
#scores=np.array([1.0,2.0,3.0])
scores=np.array([[1,2,3,6],
[2,4,5,6],
[3,8,7,6]])
def softmax(x):
if x.ndim==1:
S=np.sum(np.exp(x))
return np.exp(x)/S
elif x.ndim==2:
result=np.zeros_like(x)
M,N=x.shape
for n in range(N):
S=np.sum(np.exp(x[:,n]))
result[:,n]=np.exp(x[:,n])/S
return result
else:
print("The input array is not 1- or 2-dimensional.")
s=softmax(scores)
print(s)
Run Code Online (Sandbox Code Playgroud)
但是,结果"s"结果是一个零数组:
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
Run Code Online (Sandbox Code Playgroud)
如果我删除for循环中的"/ S",那么'未规范化'的结果就像我预期的那样; 某种程度上,"/ S"除法似乎使所有元素为零,而不是像我期望的那样将每个元素除以S. 代码有什么问题?
"零"的原因在于输入的数据类型,它们是"int"类型.将输入转换为"float"解决了以下问题:
import numpy as np
#scores=np.array([1.0,2.0,3.0])
scores=np.array([[1,2,3,6],
[2,4,5,6],
[3,8,7,6]])
def softmax(x):
x=x.astype(float)
if x.ndim==1:
S=np.sum(np.exp(x))
return np.exp(x)/S
elif x.ndim==2:
result=np.zeros_like(x)
M,N=x.shape
for n in range(N):
S=np.sum(np.exp(x[:,n]))
result[:,n]=np.exp(x[:,n])/S
return result
else:
print("The input array is not 1- or 2-dimensional.")
s=softmax(scores)
print(s)
Run Code Online (Sandbox Code Playgroud)
请注意,我已将"x = x.astype(float)"添加到函数定义的第一行.这产生了预期的输出:
[[ 0.09003057 0.00242826 0.01587624 0.33333333]
[ 0.24472847 0.01794253 0.11731043 0.33333333]
[ 0.66524096 0.97962921 0.86681333 0.33333333]]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2360 次 |
最近记录: |