Python 具有低损耗和高精度的变压器自动编码器可以';没有老师的强迫,我们不能重建歌曲
我正在研制一种带有压缩变压器的对抗式自动编码器,用于音乐生成和插值。 解码器的输入是8个条的序列,其中每个条由200个令牌组成。 每个酒吧有4首曲目,分别是:鼓、贝司、吉他和弦乐。 每个音符都由一个序列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个条)上编码器输出的前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