为什么自动编码器中的解码器在最后一层使用 sigmoid?

2024-02-27

我正在看this https://github.com/L1aoXingyu/pytorch-beginner/blob/master/08-AutoEncoder/Variational_autoencoder.py工作变分自动编码器。

主要班级

class VAE(nn.Module):
    def __init__(self):
        super(VAE, self).__init__()

        self.fc1 = nn.Linear(784, 400)
        self.fc21 = nn.Linear(400, 20)
        self.fc22 = nn.Linear(400, 20)
        self.fc3 = nn.Linear(20, 400)
        self.fc4 = nn.Linear(400, 784)

    def encode(self, x):
        h1 = F.relu(self.fc1(x))
        return self.fc21(h1), self.fc22(h1)

    def reparametrize(self, mu, logvar):
        std = logvar.mul(0.5).exp_()
        if torch.cuda.is_available():
            eps = torch.cuda.FloatTensor(std.size()).normal_()
        else:
            eps = torch.FloatTensor(std.size()).normal_()
        eps = Variable(eps)
        return eps.mul(std).add_(mu)

    def decode(self, z):
        h3 = F.relu(self.fc3(z))
        return F.sigmoid(self.fc4(h3))

    def forward(self, x):
        mu, logvar = self.encode(x)
        z = self.reparametrize(mu, logvar)
        return self.decode(z), mu, logvar

has

    def decode(self, z):
        h3 = F.relu(self.fc3(z))
        return F.sigmoid(self.fc4(h3))

我无法向自己解释为什么最后一层应该在返回之前通过 sigmoid。

请解释。


编辑: 我刚刚检查了没有 sigmoid。结果还是不错的。 现在我不确定是否需要。


正如 Jim J 的回答中提到的,sigmoid 强制输出范围为 [0, 1]。在这种情况下,这并不是因为我们想要将输出解释为概率,而是为了强制将输出解释为灰度图像的像素强度。

如果删除 sigmoid,神经网络将必须知道所有输出都应在 [0, 1] 范围内。 sigmoid 可能有助于使学习过程更加稳定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么自动编码器中的解码器在最后一层使用 sigmoid? 的相关文章

随机推荐