我正在查看这个正在运行的变分自编码器。
主类
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函数处理。
请解释一下。
编辑:我刚刚测试了去掉sigmoid函数的情况,结果仍然很好。现在我无法确定是否真的需要sigmoid函数。
回答:
正如Jim J在回答中提到的,sigmoid函数将输出限制在[0, 1]范围内。在这种情况下,不是因为我们希望将输出解释为概率,而是为了强制输出被解释为灰度图像的像素强度。
如果去掉sigmoid函数,神经网络将不得不学习所有输出都应该在[0, 1]范围内。使用sigmoid函数可能会使学习过程更加稳定。