关于python:尝试计算softmax值,得到AttributeError:’list’对象没有属性’T’

Trying to compute softmax values, getting AttributeError: 'list' object has no attribute 'T'

首先,我的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
"""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()

现在看这个问题,我可以知道t是我列表的转置。但是,我似乎得到了错误:

AttributeError: 'list' object has no attribute 'T'

我不明白这是怎么回事。我对整个情况的理解是错误的吗?我正在努力通过谷歌深度学习课程,我想我可以通过实现程序来实现python,但我可能错了。我现在知道很多其他语言,如C和Java,但新的语法总是让我困惑。


如注释所述,由于列表没有.T属性,因此softmax(scores)的输出必须是一个数组。因此,如果用下面的代码替换问题中的相关位,我们可以再次访问.T属性。

1
2
3
num = np.exp(x)
score_len = len(x)
y = np.array([0]*score_len)

必须指出的是,我们需要使用np.array库,因为非numpy库通常不与普通python库一起使用。


查看代码中变量的类型和形状

x是一维数组;scores是二维(3行):

1
2
3
4
In [535]: x.shape
Out[535]: (80,)
In [536]: scores.shape
Out[536]: (3, 80)

softmax生成3个项目的列表;第一个是数字0,其余是形状类似x的数组。

1
2
3
4
5
6
7
8
9
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)

1
2
3
4
num=np.exp(scores)
res = np.zeros(scores.shape)
for i in range(1,3):
    res[i,:]= num[i,:]/sum(num)

创建可转置和打印的二维数组。

但你不应该一行一行地做。你真的希望res的第一行是0吗?

1
2
3
res = np.exp(scores)
res = res/sum(res)
res[0,:] = 0    # reset 1st row to 0?

你为什么要对每一行的scores进行矢量化操作,而不是整个操作?