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
慕标5832272
相关分类