Python 具有低损耗和高精度的变压器自动编码器可以';没有老师的强迫,我们不能重建歌曲

Python 具有低损耗和高精度的变压器自动编码器可以';没有老师的强迫,我们不能重建歌曲,python,machine-learning,pytorch,generative-adversarial-network,transformer,Python,Machine Learning,Pytorch,Generative Adversarial Network,Transformer,我正在研制一种带有压缩变压器的对抗式自动编码器,用于音乐生成和插值。 解码器的输入是8个条的序列,其中每个条由200个令牌组成。 每个酒吧有4首曲目,分别是:鼓、贝司、吉他和弦乐。 每个音符都由一个序列表示。 压缩表示是最后一个条(第8个条)上编码器输出的前16个潜在条,由于压缩变压器的存储器,该条应捕获有关所有8个提供条的信息。 使用WGAN-GP loss完成培训 编码器输出分布与先验分布(4个高斯的混合)匹配,精度达到0.6,损耗降低良好: 当我尝试从发行版中取样时,生成的歌曲有点奇怪

我正在研制一种带有压缩变压器的对抗式自动编码器,用于音乐生成和插值。 解码器的输入是8个条的序列,其中每个条由200个令牌组成。 每个酒吧有4首曲目,分别是:鼓、贝司、吉他和弦乐。 每个音符都由一个序列
表示。 压缩表示是最后一个条(第8个条)上编码器输出的前16个潜在条,由于压缩变压器的存储器,该条应捕获有关所有8个提供条的信息。 使用WGAN-GP loss完成培训

编码器输出分布与先验分布(4个高斯的混合)匹配,精度达到0.6,损耗降低良好:

当我尝试从发行版中取样时,生成的歌曲有点奇怪:

但问题是当我试图重建一首歌时:

我认为问题与讨论的内容有关:在训练时,当解码器需要在位置k重建令牌时,前一个
    def greedy_decode(self, latent, n_bars, desc):
        _, _, d_mems, d_cmems = get_memories(n_batch=1)
        outs = []
        for _ in tqdm(range(n_bars), position=0, leave=True, desc=desc):
            trg = np.full((4, 1, 1), config["tokens"]["sos"])
            trg = torch.LongTensor(trg).to(config["train"]["device"])
            for _ in range(config["model"]["seq_len"] - 1):  # for each token of each bar
                trg_mask = create_trg_mask(trg.cpu().numpy())
                out, _, _, _, _, _ = self.decoder(trg, trg_mask, None, latent, d_mems, d_cmems)
                out = torch.max(out, dim=-2).indices
                out = out.permute(2, 0, 1)
                trg = torch.cat((trg, out[..., -1:]), dim=-1)
            trg_mask = create_trg_mask(trg.cpu().numpy())
            out, _, _, d_mems, d_cmems, _ = self.decoder(trg, trg_mask, None, latent, d_mems, d_cmems)
            out = torch.max(out, dim=-2).indices
            out = out.permute(2, 0, 1)
            outs.append(out)
        return outs