为了账号安全,请及时绑定邮箱和手机立即绑定

去噪线性自动编码器学习输出一个常数而不是去噪

去噪线性自动编码器学习输出一个常数而不是去噪

浮云间 2023-06-06 15:05:29
1d我正在尝试为循环信号cos(x)等创建一个去噪自动编码器。创建数据集的过程是我传递一个循环函数列表,并且对于生成的每个示例,它为列表中的每个函数滚动随机系数,因此生成的每个函数都是不同的但循环的。例如 -0.856cos(x) - 1.3cos(0.1x)然后我添加噪声并将信号标准化为介于[0, 1).接下来,我在其上训练我的自动编码器,但它学会输出一个常量(通常是0.5)。我的猜测是它发生是因为0.5是归一化函数的通常平均值。但这根本不是我渴望得到的结果。我提供了我为自动编码器、数据生成器和训练循环编写的代码,以及描述我遇到的问题的两张图片。第一个例子:第二个例子:线性自动编码器:class LinAutoencoder(nn.Module):    def __init__(self, in_channels, K, B, z_dim, out_channels):        super(LinAutoencoder, self).__init__()        self.in_channels = in_channels        self.K = K # number of samples per 2pi interval        self.B = B # how many intervals        self.out_channels = out_channels        encoder_layers = []        decoder_layers = []        encoder_layers += [            nn.Linear(in_channels * K * B, 2*z_dim, bias=True),            nn.ReLU(),            nn.Linear(2*z_dim, z_dim, bias=True),            nn.ReLU(),            nn.Linear(z_dim, z_dim, bias=True),            nn.ReLU()        ]         decoder_layers += [            nn.Linear(z_dim, z_dim, bias=True),            nn.ReLU(),            nn.Linear(z_dim, 2*z_dim, bias=True),            nn.ReLU(),            nn.Linear(2*z_dim, out_channels * K * B, bias=True),            nn.Tanh()        ]        self.encoder = nn.Sequential(*encoder_layers)        self.decoder = nn.Sequential(*decoder_layers)    def forward(self, x):        batch_size = x.shape[0]        x_flat = torch.flatten(x, start_dim=1)        enc = self.encoder(x_flat)        dec = self.decoder(enc)        res = dec.view((batch_size, self.out_channels, self.K * self.B))        return res
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

问题是我没有nn.BatchNorm1d在我的模型中使用,所以我猜在训练过程中发生了一些错误(可能是梯度消失)。



查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信