Trying to compute softmax values, getting AttributeError: 'list' object has no attribute 'T'
Trying to compute softmax values, getting AttributeError: 'list' object has no attribute 'T'
首先,这是我的代码:
"""Softmax."""
scores = [3.0, 1.0, 0.2]
import numpy as np
def softmax(x):
"""Compute softmax values for each sets of scores in x."""
num = np.exp(x)
score_len = len(x)
y = [0] * score_len
for index in range(1,score_len):
y[index] = (num[index])/(sum(num))
return y
print(softmax(scores))
# Plot softmax curves
import matplotlib.pyplot as plt
x = np.arange(-2.0, 6.0, 0.1)
scores = np.vstack([x, np.ones_like(x), 0.2 * np.ones_like(x)])
plt.plot(x, softmax(scores).T, linewidth=2)
plt.show()
现在查看 this 问题,我可以看出 T 是我列表的转置。但是,我似乎遇到了错误:
AttributeError: 'list' object has no attribute 'T'
我不明白这是怎么回事。我对整个情况的理解是错误的吗?我正在努力完成 Google 深度学习课程,我认为我可以 Python 通过实施这些程序,但我可能是错的。我目前知道很多其他语言,如 C 和 Java,但新语法总是让我感到困惑。
如评论中所述,softmax(scores)
的输出必须是一个数组,因为列表没有 .T
属性。因此,如果我们用下面的代码替换问题中的相关位,我们就可以再次访问 .T
属性。
num = np.exp(x)
score_len = len(x)
y = np.array([0]*score_len)
必须注意,我们需要使用 np.array
,因为非 numpy
库通常不能与普通 python
库一起使用。
查看代码中变量的类型和形状
x
是一维数组; scores
是 2d(3 行):
In [535]: x.shape
Out[535]: (80,)
In [536]: scores.shape
Out[536]: (3, 80)
softmax
生成包含 3 个项目的列表;第一个是数字 0,其余的是形状像 x
.
的数组
In [537]: s=softmax(scores)
In [538]: len(s)
Out[538]: 3
In [539]: s[0]
Out[539]: 0
In [540]: s[1].shape
Out[540]: (80,)
In [541]: s[2].shape
Out[541]: (80,)
您是否期望 softmax
生成与其输入具有相同形状的数组,在本例中为 (3,80)
.
num=np.exp(scores)
res = np.zeros(scores.shape)
for i in range(1,3):
res[i,:]= num[i,:]/sum(num)
创建一个可以转置和绘制的二维数组。
但您不必逐行执行此操作。您真的希望 res
的第一行为 0 吗?
res = np.exp(scores)
res = res/sum(res)
res[0,:] = 0 # reset 1st row to 0?
为什么要对 scores
的每一行进行向量化运算,而不是对整行进行向量化运算?
首先,这是我的代码:
"""Softmax."""
scores = [3.0, 1.0, 0.2]
import numpy as np
def softmax(x):
"""Compute softmax values for each sets of scores in x."""
num = np.exp(x)
score_len = len(x)
y = [0] * score_len
for index in range(1,score_len):
y[index] = (num[index])/(sum(num))
return y
print(softmax(scores))
# Plot softmax curves
import matplotlib.pyplot as plt
x = np.arange(-2.0, 6.0, 0.1)
scores = np.vstack([x, np.ones_like(x), 0.2 * np.ones_like(x)])
plt.plot(x, softmax(scores).T, linewidth=2)
plt.show()
现在查看 this 问题,我可以看出 T 是我列表的转置。但是,我似乎遇到了错误:
AttributeError: 'list' object has no attribute 'T'
我不明白这是怎么回事。我对整个情况的理解是错误的吗?我正在努力完成 Google 深度学习课程,我认为我可以 Python 通过实施这些程序,但我可能是错的。我目前知道很多其他语言,如 C 和 Java,但新语法总是让我感到困惑。
如评论中所述,softmax(scores)
的输出必须是一个数组,因为列表没有 .T
属性。因此,如果我们用下面的代码替换问题中的相关位,我们就可以再次访问 .T
属性。
num = np.exp(x)
score_len = len(x)
y = np.array([0]*score_len)
必须注意,我们需要使用 np.array
,因为非 numpy
库通常不能与普通 python
库一起使用。
查看代码中变量的类型和形状
x
是一维数组; scores
是 2d(3 行):
In [535]: x.shape
Out[535]: (80,)
In [536]: scores.shape
Out[536]: (3, 80)
softmax
生成包含 3 个项目的列表;第一个是数字 0,其余的是形状像 x
.
In [537]: s=softmax(scores)
In [538]: len(s)
Out[538]: 3
In [539]: s[0]
Out[539]: 0
In [540]: s[1].shape
Out[540]: (80,)
In [541]: s[2].shape
Out[541]: (80,)
您是否期望 softmax
生成与其输入具有相同形状的数组,在本例中为 (3,80)
.
num=np.exp(scores)
res = np.zeros(scores.shape)
for i in range(1,3):
res[i,:]= num[i,:]/sum(num)
创建一个可以转置和绘制的二维数组。
但您不必逐行执行此操作。您真的希望 res
的第一行为 0 吗?
res = np.exp(scores)
res = res/sum(res)
res[0,:] = 0 # reset 1st row to 0?
为什么要对 scores
的每一行进行向量化运算,而不是对整行进行向量化运算?