2 回答

TA贡献1816条经验 获得超6个赞
这个表达式的意思是:对一个softmax_output形状数组进行切片,(N, C)从中只提取与训练标签相关的值y。
二维numpy.array可以用包含适当值的两个列表进行切片(即它们不应导致索引错误)
range(num_train)为第一个轴创建一个索引,允许使用第二个索引 - 选择每行中的特定值list(y)。你可以在numpy 的 indexing 文档中找到它。
第一个索引 range_num 的长度等于softmax_output(= N)的第一个维度。它指向矩阵的每一行;然后对于每一行,它通过索引的第二部分中的相应值选择目标值 - list(y)。
例子:
softmax_output = np.array( # dummy values, not softmax
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]]
)
num_train = 4 # length of the array
y = [2, 1, 0, 2] # a labels; values for indexing along the second axis
softmax_output[range(num_train), list(y)]
Out:
[3, 5, 7, 12]
因此,它从第一行中选择第三个元素,从第二行中选择第二个元素,等等。这就是它的工作原理。
(ps 我误解了你,你对“为什么”感兴趣,而不是“如何”?)

TA贡献1801条经验 获得超16个赞
这里的损失由以下等式定义
这里,对于数据点所属的类,y 为 1,对于所有其他类,y 为 0。因此,我们只对数据点类的 softmax 输出感兴趣。因此上面的方程可以改写为
因此,下面的代码表示上述等式。
loss = -np.sum(np.log(softmax_output[range(num_train), list(y)]))
该代码softmax_output[range(num_train), list(y)]
用于为各个类选择 softmax 输出。range(num_train)
代表所有训练样本并list(y)
代表各自的类别。
Mikhail 在他的回答中很好地解释了这种索引。
添加回答
举报