为什么我们在最后一层使用 softmax 激活函数?
认为是具有最高值的索引(在我们根本不使用 softmax 的情况下)。如果我们使用 softmax 并取th 值,它将是最高值,因为是一个递增函数,所以这就是我问这个问题的原因。取argmax(vec)
并argmax(softmax(vec))
会给我们相同的价值。
为什么我们在最后一层使用 softmax 激活函数?
认为是具有最高值的索引(在我们根本不使用 softmax 的情况下)。如果我们使用 softmax 并取th 值,它将是最高值,因为是一个递增函数,所以这就是我问这个问题的原因。取argmax(vec)
并argmax(softmax(vec))
会给我们相同的价值。
简短回答:通常,softmax
如果不需要概率,则不需要这样做。并且使用原始 logits 会导致在数值上更稳定的代码。
长答案:首先,softmax
层的输入称为logits。
在评估期间,如果您只对概率最高的类别感兴趣,那么您可以argmax(vec)
在 logits 上进行。如果你想要类的概率分布,那么你需要取幂并归一化为 1 - 这就是这样softmax
做的。
在训练期间,您需要有一个损失函数来优化。您的训练数据包含真实的类,因此您有目标概率分布,在您的真实班级为 1,在所有其他班级为 0。您训练网络以产生概率分布作为输出。它应该尽可能接近目标分布尽可能。两个概率分布之间的“距离”度量称为交叉熵:
如您所见,您只需要输出概率的日志 - 因此日志足以计算损失。例如,可以配置keras
标准CategoricalCrossentropy
损失from_logits
来计算它,它提到:
使用 from_logits=True 在数值上更稳定。