为什么我的变分自动编码器只产生正值?
Why does my variational autoencoder only produce positive values?
我复制了 this example 来构建变分自动编码器 (VAE)。该示例使用图像,但我将其用于包含负值的信号。训练后,自动编码器仅重建信号的正部分,不产生负值。谁能找出问题所在或解释为什么会这样?
如果您使用与示例中显示的代码完全相同的代码,您将 link 放入其中,那么在解码器的末尾,您会得到 x = torch.sigmoid(self.decConv2(x))
,它采用实数行并输出[0, 1] 之间的数字。这就是网络无法输出负数的原因。
如果你想改变模型也输出负数,去掉sigmoid函数。
这当然意味着您还必须更改用于训练模型的损失函数,因为 BCE 损失仅适用于 [0, 1] 范围内的输出。
作为建议 我建议任何人使用 BCE with logits loss 并避免在解码器中使用 sigmoid,因为这种方法将 sigmoid 和 BCE 损失结合在一个数值更稳定的方式。
我复制了 this example 来构建变分自动编码器 (VAE)。该示例使用图像,但我将其用于包含负值的信号。训练后,自动编码器仅重建信号的正部分,不产生负值。谁能找出问题所在或解释为什么会这样?
如果您使用与示例中显示的代码完全相同的代码,您将 link 放入其中,那么在解码器的末尾,您会得到 x = torch.sigmoid(self.decConv2(x))
,它采用实数行并输出[0, 1] 之间的数字。这就是网络无法输出负数的原因。
如果你想改变模型也输出负数,去掉sigmoid函数。
这当然意味着您还必须更改用于训练模型的损失函数,因为 BCE 损失仅适用于 [0, 1] 范围内的输出。
作为建议 我建议任何人使用 BCE with logits loss 并避免在解码器中使用 sigmoid,因为这种方法将 sigmoid 和 BCE 损失结合在一个数值更稳定的方式。