Music Transformer pytorch代码

小菜鸡的记录,如有错误,请指出。
理论部分:https://blog.csdn.net/Alen_1996/article/details/102816336
代码地址:https://github.com/jason9693/MusicTransformer-pytorch

0.配置环境
pip install pretty_midi
pip install tensorboardX
pip install progress

1.Repository setting
$ git clone https://github.com/jason9693/MusicTransformer-pytorch.git
$ cd MusicTransformer-pytorch
$ git clone https://github.com/jason9693/midi-neural-processor.git
$ mv midi-neural-processor midi_processor

2.下载midi
下载Performance-RNN中的数据集:首先下载dataset文件夹上传至服务器,可以看到里面包含4个.sh文件
$ sh dataset/script/ecomp_piano_downloader.sh
以下报错:
在这里插入图片描述
去网上搜了各种方法都不能解决,请教师姐,师姐把当初下数据集的记录发给我,我试了一下师姐用的方法,也不对,但是从中找到了尝试的方向—代码中给的数据集地址是错的,因此更改的数据集地址,但还是报错,
然后尝试直接用wget+网址下载,下载的文件是asp而不是midi文件;
然后就尝试其他的下载命令+ ecomp_piano_downloader.sh 最后成功下载的命令如下:
bash ecomp_piano_downloader.sh piano-e-Competition
sh dataset/scripts/classic_piano_downloader.sh JSB-Chorales-dataset

3.对数据进行预处理:
CUDA_VISIBLE_DEVICES=4 python preprocess.py piano-e-competition piano-e-competition-pre

4.训练模型:
CUDA_VISIBLE_DEVICES=6 python train.py -c config/base.yml config/train_ddp.yml config/large_dpc.yml -m model
报错: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210531212214256.png在这里插入图片描述
经了解,FullLoader 属性是在pyyaml5.1及以上版本中才有的。
显示我已安装了5.3.1的版本,但是进入python解释器后发现是3.13的
尝试删掉原有版本,下载新版本:
pip3 uninstall pyyaml
报错:
在这里插入图片描述
尝试更新版本:
pip install -U PyYAML
报错:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021053121224083.png在这里插入图片描述
成功解决办法:
pip install --ignore-installed PyYAML
在这里插入图片描述
再次输入,输出模型,但是显示class Data has “0” files
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210531212349369.png在这里插入图片描述

原因:数据集没有加进去,查看配置文件中的train. yml中定义的路径不是我现在存放数据集的路径,因此更改为数据集路径。
在这里插入图片描述
重新输入训练命令:CUDA_VISIBLE_DEVICES=4 python train.py -c config/base.yml config/train_ddp.yml -m model
可以开始训练,但是报错:
RuntimeError: CUDA out of memory. Tried to allocate 512.00 MiB (GPU 0; 10.76 GiB total capacity; 9.35 GiB already allocated; 43.44 MiB free; 9.61 GiB reserved in total by PyTorch)
在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021053121353487.png在这里插入图片描述
分析:这种问题,是GPU内存不够引起的
方法:将batch_size从8改为2,embedding_dim从512改为256.即使用配置的config/train_ddp.yml更换为config/debug_train.yml
CUDA_VISIBLE_DEVICES=6 python train.py -c config/base.yml config/ debug_train.yml -m model
在这里插入图片描述
因效果不好,batch_size=4,将embedding_dim改为256,
CUDA_VISIBLE_DEVICES=6 python train.py -c config/base.yml config/train_ddp.yml -m model
在这里插入图片描述

5.生成
输入命令:CUDA_VISIBLE_DEVICES=4 python generate.py -c config/generate.yml -m model(服务器)
run generate.py -m model -c config/generate.yml
(根据所需,选择配置环境)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Transformer是一种用于序列到序列(seq2seq)模型的神经网络架构,最初用于机器翻译任务。它由Google在2017年提出并被广泛应用于自然语言处理任务中,如文本分类、机器翻译、对话生成等。PyTorch是一种基于Python的开源机器学习框架,因其易用性和灵活性而备受欢迎。 在PyTorch中,可以使用torch.nn.Transformer模块实现Transformer模型,具体代码实现可以参考以下步骤: 1. 安装PyTorch库 ```python pip install torch ``` 2. 导入相关库和模块 ```python import torch import torch.nn as nn from torch.nn import TransformerEncoder, TransformerEncoderLayer ``` 3. 构建TransformerEncoderLayer和TransformerEncoder ```python class TransformerModel(nn.Module): def __init__(self, ntoken, ninp, nhead, nhid, nlayers, dropout=0.5): super(TransformerModel, self).__init__() self.model_type = 'Transformer' self.src_mask = None self.pos_encoder = PositionalEncoding(ninp, dropout) encoder_layers = TransformerEncoderLayer(ninp, nhead, nhid, dropout) self.transformer_encoder = TransformerEncoder(encoder_layers, nlayers) self.encoder = nn.Embedding(ntoken, ninp) self.ninp = ninp self.decoder = nn.Linear(ninp, ntoken) def _generate_square_subsequent_mask(self, sz): mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1) mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0)) return mask def forward(self, src): if self.src_mask is None or self.src_mask.size(0) != len(src): device = src.device mask = self._generate_square_subsequent_mask(len(src)).to(device) self.src_mask = mask src = self.encoder(src) * math.sqrt(self.ninp) src = self.pos_encoder(src) output = self.transformer_encoder(src, self.src_mask) output = self.decoder(output) return output ``` 以上是一个简单的Transformer模型的实现,其中包括了多个层。 TransformerEncoderLayer和TransformerEncoder是其中两个主要的层。 TransformerEncoderLayer使用多头注意力机制和前馈网络来处理输入序列。 TransformerEncoder将多个TransformerEncoderLayer层堆叠在一起来增加模型的深度。 以上就是一个简单的Transformer模型的PyTorch代码实现,如果有任何疑问或需要进一步了解,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值