假设我有一个向量int main() {
printf("t");
// fflush(stdout);
while(1);
return 0;
}
,并且索引向量fflush
的长度相同。索引范围为0〜N-1,对应N组。如何在没有for循环的情况下为每个组执行softmax?
我在这里进行某种注意操作。每个组的数字都不相同,因此我无法将a
整形为矩阵并在标准b
API中使用a
。
玩具示例:
dim
我想做softmax之类的
Softmax()
但没有for循环可以节省时间。
答案 0 :(得分:0)
基于对我的评论的潜在回应,也许答案将不得不稍作更改,但是我只是继续前进,并在Softmax
上投入了2美分。
通常,在PyTorch documentation中可以很好地解释softmax的公式,在该公式中,我们可以看到这是当前值的指数,除以所有类的总和。
这样做的原因是建立在概率论基础上的,可能在我的舒适范围之外,但是从本质上讲,当它与一种流行的损失策略“交叉熵损失”结合使用时,它可以帮助您维持一个相当简单的反向传播导数。 (CE)(请参阅PyTorch here中的相应功能。
此外,您还可以在CE的说明中看到它自动结合了两个功能,即softmax函数的(数字稳定)版本,以及负对数似然损失(NLLL) )。
现在,回到您的原始问题,并希望解决您的问题:
出于这个问题(以及您的询问方式)的原因,似乎您正在使用流行的MNIST数字数字数据集,其中我们希望为当前输入图像预测一些值。
我还假设您的输出a
在某个时候将是神经网络中某个图层的输出。不论是否将其压缩到特定范围都没有关系(例如,通过应用某种形式的激活函数),因为softmax基本上是归一化的。具体来说,它将为我们提供如前所述的所有预测值的某种形式的分布,并在所有类别中总计为1。为此,我们可以简单地应用
soft_a = softmax(a, dim=0) # otherwise throws error if we don't specify axis
print(torch.sum(soft_a)) # should return "Tensor(1.)"
现在,如果我们假设您要进行“经典的” MNIST示例,则可以使用argmax()
函数来预测系统认为哪个值是正确的答案,并根据该值计算错误,例如,使用nn.NLLLoss()
函数。
如果您确实要在单个输出中预测每个位置的值,则必须对此稍作考虑。
首先,softmax()
在这里不再有意义,因为您正在计算跨多个输出的概率分布 ,并且除非您非常确定它们的分布在很大程度上相互依赖。具体而言,我认为这里不是这种情况。
此外,请记住,您正在寻找计算成对损耗的方法,即针对输出的每个索引进行计算。为此特定功能而想到的功能是nn.BCELoss()
,它可以计算交叉熵的二值化(逐元素)版本。
为此,您可以简单地“引入”原始预测张量a
以及地面真实张量b
。一个最小的例子如下:
bce = torch.nn.BCELoss(reduction="none") + to keep losses for each element separate
loss = bce(a,b) # returns tensor with respective pairwise loss
如果您对单笔损失感兴趣,可以按照文档中的说明,显然可以将BCELoss
与reduction
一起使用不同的参数。
让我知道是否可以为您澄清答案的某些部分。
编辑:此处需要记住的其他事项:BCELoss()
要求您输入可能接近您要预测的值的值。如果您首先将值输入激活函数(例如Sigmoid或tanh),则这会特别成问题,因为激活值会被一个区间限制,因此它们永远不会达到您想要预测的值!