gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:49:01 25 4
gpt4 key购买 nike

我正在查看 this工作变分自动编码器。

主类

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

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

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

请解释。


编辑:我只是在没有乙状结肠的情况下检查过。结果还是不错的。现在我不确定是否需要它。

最佳答案

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

如果移除 sigmoid,NN 将不得不学习所有输出都应在 [0, 1] 范围内。 sigmoid 可能有助于使学习过程更加稳定。

关于machine-learning - 为什么自动编码器中的解码器在最后一层使用 sigmoid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65307833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com