利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型( 五 )


利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
本文插图
使用Comet.ml训练和监测实验
Comet.ml提供了一个平台 , 允许深度学习研究人员跟踪、比较、解释和优化他们的实验和模型 。 Comet.ml提高了AssemblyAI的工作效率 , 我们强烈建议团队使用这个平台进行任何类型的数据科学实验 。
Comet.ml非常容易设置 。 仅需几行代码即可工作 。
initialize experiment objectexperiment = Experiment(api_key=comet_api_key, project_name=project_name)experiment.set_name(exp_name)track metricsexperiment.log_metric('loss', loss.item)Comet.ml为你提供了一个非常高效的仪表板 , 你可以查看和跟踪模型的进度 。
利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
本文插图
你可以使用Comet来跟踪指标、代码、超参数、模型图等 。 Comet提供的一项非常方便的功能 , 能够将你的实验与许多其他实验进行比较 。
利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
本文插图
Comet具有丰富的功能集 , 我们在这里不会全部介绍 , 但是我们强烈建议您使用它来提高生产率和健全性 。
下面是我们训练脚本的其余部分 。
class IterMeter(object):''''''keeps track of total iterations''''''def __init__(self):self.val = 0def step(self):self.val += 1def get(self):return self.valdef train(model, device, train_loader, criterion, optimizer, scheduler, epoch, iter_meter, experiment):model.traindata_len = len(train_loader.dataset)with experiment.train:for batch_idx, _data in enumerate(train_loader):spectrograms, labels, input_lengths, label_lengths = _dataspectrograms, labels = spectrograms.to(device), labels.to(device)optimizer.zero_gradoutput = model(spectrograms) # (batch, time, n_class)output = F.log_softmax(output, dim=2)output = output.transpose(0, 1) # (time, batch, n_class)loss = criterion(output, labels, input_lengths, label_lengths)loss.backwardexperiment.log_metric('loss', loss.item, step=iter_meter.get)experiment.log_metric('learning_rate', scheduler.get_lr, step=iter_meter.get)optimizer.stepscheduler.stepiter_meter.stepif batch_idx % 100 == 0 or batch_idx == data_len:print('Train Epoch: {} [{}/{} ({:.0f}%)]tLoss: {:.6f}'.format(epoch, batch_idx * len(spectrograms), data_len,100. * batch_idx / len(train_loader), loss.item))def test(model, device, test_loader, criterion, epoch, iter_meter, experiment):print('nevaluating…')model.evaltest_loss = 0test_cer, test_wer = ,with experiment.test:with torch.no_grad:for I, _data in enumerate(test_loader):spectrograms, labels, input_lengths, label_lengths = _dataspectrograms, labels = spectrograms.to(device), labels.to(device)output = model(spectrograms) # (batch, time, n_class)output = F.log_softmax(output, dim=2)output = output.transpose(0, 1) # (time, batch, n_class)loss = criterion(output, labels, input_lengths, label_lengths)test_loss += loss.item / len(test_loader)decoded_preds, decoded_targets = GreedyDecoder(output.transpose(0, 1), labels, label_lengths)for j in range(len(decoded_preds)):test_cer.append(cer(decoded_targets[j], decoded_preds[j]))test_wer.append(wer(decoded_targets[j], decoded_preds[j]))avg_cer = sum(test_cer)/len(test_cer)avg_wer = sum(test_wer)/len(test_wer)experiment.log_metric('test_loss', test_loss, step=iter_meter.get)experiment.log_metric('cer', avg_cer, step=iter_meter.get)experiment.log_metric('wer', avg_wer, step=iter_meter.get)print('Test set: Average loss: {:.4f}, Average CER: {:4f} Average WER: {:.4f}n'.format(test_loss, avg_cer, avg_wer))def main(learning_rate=5e-4, batch_size=20, epochs=10,train_url=''train-clean-100'', test_url=''test-clean'',experiment=Experiment(api_key='dummy_key', disabled=True)):hparams = {''n_cnn_layers'': 3,''n_rnn_layers'': 5,''rnn_dim'': 512,''n_class'': 29,''n_feats'': 128,''stride'': 2,''dropout'': 0.1,''learning_rate'': learning_rate,''batch_size'': batch_size,''epochs'': epochs}experiment.log_parameters(hparams)use_cuda = torch.cuda.is_availabletorch.manual_seed(7)device = torch.device(''cuda'' if use_cuda else ''cpu'')if not os.path.isdir(''./data''):os.makedirs(''./data'')train_dataset = torchaudio.datasets.LIBRISPEECH(''./data'', url=train_url, download=True)test_dataset = torchaudio.datasets.LIBRISPEECH(''./data'', url=test_url, download=True)kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {}train_loader = data.DataLoader(dataset=train_dataset,batch_size=hparams['batch_size'],shuffle=True,collate_fn=lambda x: data_processing(x, 'train'),**kwargs)test_loader = data.DataLoader(dataset=test_dataset,batch_size=hparams['batch_size'],shuffle=False,collate_fn=lambda x: data_processing(x, 'valid'),**kwargs)model = SpeechRecognitionModel(hparams['n_cnn_layers'], hparams['n_rnn_layers'], hparams['rnn_dim'],hparams['n_class'], hparams['n_feats'], hparams['stride'], hparams['dropout']).to(device)print(model)print('Num Model Parameters', sum([param.nelement() for param in model.parameters()]))optimizer = optim.AdamW(model.parameters, hparams['learning_rate'])criterion = nn.CTCLoss(blank=28).to(device)scheduler = optim.lr_scheduler.OneCycleLR(optimizer, max_lr=hparams['learning_rate'],steps_per_epoch=int(len(train_loader)),epochs=hparams['epochs'],anneal_strategy='linear')iter_meter = IterMeterfor epoch in range(1, epochs + 1):train(model, device, train_loader, criterion, optimizer, scheduler, epoch, iter_meter, experiment)test(model, device, test_loader, criterion, epoch, iter_meter, experiment)训练功能可在整个数据周期内训练模型 。 在每个时期之后 , 测试功能都会根据测试数据评估模型 。 它获取test_loss以及模型的cer和wer 。 你现在可以在Google合作实验室的GPU支持下开始运行训练脚本 。


推荐阅读