- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习使用 PyTorch
的二元分类教程,在这里,网络的最后一层是 torch.Linear()
,只有一个神经元。 (有道理)这会给我们一个神经元。作为 pred=network(input_batch)
之后损失函数的选择是loss_fn=BCEWithLogitsLoss()
(这比先使用softmax再计算损失在数值上更稳定)将应用Softmax
函数到最后一层的输出给我们一个概率。所以在那之后,它会计算二元交叉熵来最小化损失。
loss=loss_fn(pred,true)
我担心的是,在这之后,作者使用了 torch.round(torch.sigmoid(pred))
为什么会这样?我的意思是我知道它将获得 [0,1]
范围内的预测概率,然后使用默认阈值 0.5 对值进行舍入。
在网络的最后一层之后使用一次 sigmoid
而不是在 2 个不同的地方使用 softmax 和 sigmoid 是不是更好?
这样不是更好吗
out = self.linear(batch_tensor)
return self.sigmoid(out)
然后计算BCE
损失并使用argmax()
检查准确性??
我很好奇这会是一个有效的策略吗?
最佳答案
您似乎将二元分类视为具有两个类的多类分类,但在使用二元交叉熵方法时这并不完全正确。在查看任何实现细节之前,让我们首先阐明二元分类的目标。
从技术上讲,有两个类,0 和 1,但您可以将它们视为彼此相反的两个类,而不是将它们视为两个单独的类。例如,您想要对 StackOverflow 答案是否有帮助进行分类。这两个类将“有帮助” 和“无帮助”。自然地,您会简单地问“答案有用吗?”,负面的方面被忽略了,如果不是这样,您可以推断它“没有帮助” 。 (请记住,这是一个二元案例,没有中间立场)。
因此,您的模型只需要预测一个类,但为了避免与实际的两个类混淆,可以表示为:模型预测正例发生的概率。在上一个示例的上下文中:StackOverflow 答案有帮助的概率是多少?
Sigmoid 为您提供 [0, 1] 范围内的值,这是概率。现在您需要通过定义阈值来确定模型何时有足够的信心使其为正。为了使其平衡,阈值为 0.5,因此只要概率大于 0.5 就是正的(第 1 类:“有帮助”),否则就是负的(第 0 类:“没有”有帮助”),这是通过舍入实现的(即 torch.round(torch.sigmoid(pred))
)。
After that the choice of Loss function is
loss_fn=BCEWithLogitsLoss()
(which is numerically stable than using the softmax first and then calculating loss) which will applySoftmax
function to the output of last layer to give us a probability.Isn't it better to use the sigmoid once after the last layer within the network rather using a softmax and a sigmoid at 2 different places given it's a binary classification??
BCEWithLogitsLoss
应用 Sigmoid 而不是 Softmax,根本不涉及 Softmax。来自nn.BCEWithLogitsLoss
documentation :
This loss combines a Sigmoid layer and the BCELoss in one single class. This version is more numerically stable than using a plain Sigmoid followed by a BCELoss as, by combining the operations into one layer, we take advantage of the log-sum-exp trick for numerical stability.
通过在模型中不应用 Sigmoid,您可以获得数值更稳定的二元交叉熵版本,但这意味着如果您想在训练之外进行实际预测,则必须手动应用 Sigmoid。
[...] and use the
argmax()
for checking accuracy??
同样,您正在考虑多类场景。您只有一个输出类,即输出的大小为 [batch_size, 1]。取其中的 argmax,将始终为您提供 0,因为这是唯一可用的类。
关于deep-learning - 从 BCEWithLogitLoss(二元交叉熵 + Sigmoid 激活)计算损失后使用 Softmax 激活函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62045186/
如前所述 here ,交叉熵不是多标签分类的合适损失函数。我的问题是“这个事实是否也适用于 softmax 的交叉熵?”。如果是,如何与this part匹配的文件。 我应该提到我的问题的范围在cnt
这两个函数之间的区别已在这篇 pytorch 帖子中描述:What is the difference between log_softmax and softmax? 是:exp(x_i) / ex
我正在使用 tensorflow 编写一个简单的逻辑回归。我发现当使用 tf.nn.softmax 时,算法收敛得更快,最终精度更高。如果切换到我自己的 softmax 实现,网络收敛速度较慢,最终精
使用 softmax 作为 tf.keras 中的连续层和使用 softmax 作为密集层的激活函数有什么区别? tf.keras.layers.Dense(10, activation=tf.nn.
keras.activations.softmax 和 keras.layers.Softmax 之间有什么区别?为什么同一个激活函数有两种定义? keras.activations.softmax:
我正在使用带有二进制交叉熵的 Sigmoid 激活函数训练一个二进制分类器,它提供了大约 98% 的良好准确度。 当我使用带有 categorical_crossentropy 的 softmax 进
我正在尝试实现类似完全卷积网络的东西,其中最后一个卷积层使用过滤器大小 1x1 并输出“分数”张量。分数张量的形状为 [Batch, height, width, num_classes]。 我的问题
我目前正在用 Java 实现我自己的神经网络。我已经实现了一些常见的激活函数,例如 Sigmoid 或 ReLU,但我不知道如何实现 Softmax。 我想要一个像这样的方法 private doub
我目前正在用 Java 实现我自己的神经网络。我已经实现了一些常见的激活函数,例如 Sigmoid 或 ReLU,但我不知道如何实现 Softmax。 我想要一个像这样的方法 private doub
我在 github 上找到了一个很好的强化学习示例,我想使用它。我的问题是输出是正态分布层(下面的代码),因为它用于连续 Action 空间,而我想将它用于离散 Action 空间,其中模型有 4 个
我已经学习了 ML,并且一直在 Andrew N.G 的 coursera 类(class)中学习 DL,每次他谈到线性分类器时,权重都只是一个一维向量。即使在分配期间,当我们将图像滚动到一维向量(像
我一直在研究斯坦福的深度学习教程,但我在其中一个练习(带有 softmax 输出层的神经网络)上遇到了问题。这是我在 R 中的实现: train <- function(training.set, l
我正在 Octave 中实现 softmax 回归。目前,我正在使用使用以下成本函数和导数的非矢量化实现。 来源:Softmax Regression 现在我想在 Octave 中实现它的矢量化版本。
我是机器学习的新手,正在学习如何在 python 中实现 softmax,我正在关注以下线程 Softmax function - python 我在做一些分析,如果我们有一个数组 batch = n
下面是我尝试计算 softmax 的一小段代码。它适用于单个阵列。但是对于更大的数字,比如 1000 等,它会爆炸 import numpy as np def softmax(x): print
例如,我有一个 CNN,它试图从 MNIST 数据集(使用 Keras 编写的代码)中预测数字。它有 10 个输出,形成 softmax 层。只有一个输出可以为真(独立于 0 到 9 的每个数字):
pytorch教程 ( https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-bli
我找到了一些 MNIST 手写字符分类问题的示例代码。代码开头如下: import tensorflow as tf # Load in the data mnist = tf.keras.datas
这是 Keras 模型的最后一层。 model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossent
在神经网络的输出层中,通常使用softmax函数来近似概率分布: 由于指数的原因,计算成本很高。为什么不简单地执行 Z 变换,使所有输出均为正,然后通过将所有输出除以所有输出之和来进行归一化? 最佳答
我是一名优秀的程序员,十分优秀!