machine-learning - 为什么自动编码器中的解码器在最后一层使用 sigmoid?
问题描述
我正在看这个工作的变分自动编码器。
主要班
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。结果还是不错的。现在我不确定它是否需要。
解决方案
正如 Jim J 的回答中提到的,sigmoid 强制输出在 [0, 1] 范围内。在这种情况下,并不是因为我们想将输出解释为概率,而是强制将输出解释为灰度图像的像素强度。
如果删除 sigmoid,NN 将必须知道所有输出都应在 [0, 1] 范围内。sigmoid 可能有助于使学习过程更加稳定。
推荐阅读
- sql - 基于列值 Oracle 屏蔽数据
- api - Teamcity:是否有任何 REST API 来获取计划的构建?
- python - 如何解决此错误“该进程无法访问该文件,因为它正在被另一个进程使用”?
- api - Soundcloud 获取直接音频 URL?
- reactjs - localstorage中的令牌交换从react js中的其他用户那里获取数据
- python - 网络抓取的数据有时只有效
- ms-word - 您可以将嵌套的重复内容控件与填充 Microsoft Word 模板操作一起使用吗?
- sql - 显示包含基于其他表中的值的动态值的列
- javascript - 如何获取用户信息,然后将它们保存到对象中?
- pytorch - RuntimeError:CUDA 错误:触发了设备端断言 - BART 模型