沿不同蒙版的Pytorch softmax,无for循环

时间:2019-01-21 05:46:34

标签: parallel-processing deep-learning pytorch softmax attention-model

假设我有一个向量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循环可以节省时间。

1 个答案:

答案 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

如果您对单笔损失感兴趣,可以按照文档中的说明,显然可以将BCELossreduction一起使用不同的参数。 让我知道是否可以为您澄清答案的某些部分。

编辑:此处需要记住的其他事项:BCELoss()要求您输入可能接近您要预测的值的值。如果您首先将值输入激活函数(例如Sigmoid或tanh),则这会特别成问题,因为激活值会被一个区间限制,因此它们永远不会达到您想要预测的值!