如何解决Transformer Autoencoder 具有低损失和良好的准确性,在没有教师强制的情况下无法重建歌曲
我正在研究带有压缩转换器的对抗性自动编码器,用于音乐生成和插值。
解码器的输入是一个由 8 个柱组成的序列,其中每个柱由 200 个标记组成。
每个小节有 4 个音轨,分别是:鼓、贝斯、吉他和弦乐。
每个音符都用一个序列 <starting time> <note pitch> <note duration>
表示。
压缩表示是最后一个柱(第 8 个)上编码器输出的前 16 个潜在,由于压缩变压器的记忆,它应该捕获有关所有 8 个提供的柱的信息。
训练是使用 WGAN-GP 损失完成的。
编码器输出分布与先验分布(4个高斯的混合)匹配,精度达到0.6的值,损失下降得很好:
当我尝试从分布中采样时,生成的歌曲有点奇怪:
但问题是当我尝试重构一首歌时:
我认为问题与讨论的here有关:在训练时,当解码器需要重建位置k的token时,由于老师的强迫,前面的 我也尝试过 Beam Search,但似乎并没有解决问题。
现在我尝试使用之前生成的令牌代替真实的令牌,概率为 1/2,但训练速度非常慢。
有没有人知道教变压器不要太依赖老师强迫的方法? 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,d_cmems)
out = torch.max(out,dim=-2).indices
out = out.permute(2,1)
trg = torch.cat((trg,out[...,-1:]),dim=-1)
trg_mask = create_trg_mask(trg.cpu().numpy())
out,d_cmems,d_cmems)
out = torch.max(out,dim=-2).indices
out = out.permute(2,1)
outs.append(out)
return outs
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。