1d我正在嘗試為循環(huán)信號cos(x)等創(chuàng)建一個去噪自動編碼器。創(chuàng)建數(shù)據(jù)集的過程是我傳遞一個循環(huán)函數(shù)列表,并且對于生成的每個示例,它為列表中的每個函數(shù)滾動隨機系數(shù),因此生成的每個函數(shù)都是不同的但循環(huán)的。例如 -0.856cos(x) - 1.3cos(0.1x)然后我添加噪聲并將信號標(biāo)準(zhǔn)化為介于[0, 1).接下來,我在其上訓(xùn)練我的自動編碼器,但它學(xué)會輸出一個常量(通常是0.5)。我的猜測是它發(fā)生是因為0.5是歸一化函數(shù)的通常平均值。但這根本不是我渴望得到的結(jié)果。我提供了我為自動編碼器、數(shù)據(jù)生成器和訓(xùn)練循環(huán)編寫的代碼,以及描述我遇到的問題的兩張圖片。第一個例子:第二個例子:線性自動編碼器: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 回答

慕標(biāo)5832272
TA貢獻1966條經(jīng)驗 獲得超4個贊
問題是我沒有nn.BatchNorm1d
在我的模型中使用,所以我猜在訓(xùn)練過程中發(fā)生了一些錯誤(可能是梯度消失)。
添加回答
舉報
0/150
提交
取消