如何使用PyTorch Transformer处理多维序列到序列转换?

我正在尝试使用Transformer模型进行seq2seq转换。我的输入和输出形状相同(torch.Size([499, 128]),其中499是序列长度,128是特征数量)。

我的输入看起来像这样:enter image description here

我的输出看起来像这样:enter image description here

我的训练循环是:

    for batch in tqdm(dataset):        optimizer.zero_grad()        x, y = batch        x = x.to(DEVICE)        y = y.to(DEVICE)        pred = model(x, torch.zeros(x.size()).to(DEVICE))        loss = loss_fn(pred, y)        loss.backward()        optimizer.step()

我的模型是:

import mathfrom typing import finalimport torchimport torch.nn as nnclass Reconstructor(nn.Module):    def __init__(self, input_dim, output_dim, dim_embedding, num_layers=4, nhead=8, dim_feedforward=2048, dropout=0.5):        super(Reconstructor, self).__init__()        self.model_type = 'Transformer'        self.src_mask = None        self.pos_encoder = PositionalEncoding(d_model=dim_embedding, dropout=dropout)        self.transformer = nn.Transformer(d_model=dim_embedding, nhead=nhead, dim_feedforward=dim_feedforward, num_encoder_layers=num_layers, num_decoder_layers=num_layers)        self.decoder = nn.Linear(dim_embedding, output_dim)        self.decoder_act_fn = nn.PReLU()        self.init_weights()    def init_weights(self):        initrange = 0.1        nn.init.zeros_(self.decoder.weight)        nn.init.uniform_(self.decoder.weight, -initrange, initrange)    def forward(self, src, tgt):        pe_src = self.pos_encoder(src.permute(1, 0, 2))  # (seq, batch, features)        transformer_output = self.transformer_encoder(pe_src)        decoder_output = self.decoder(transformer_output.permute(1, 0, 2)).squeeze(2)        decoder_output = self.decoder_act_fn(decoder_output)        return decoder_output

我的输出形状为torch.Size([32, 499, 128]),其中32是批次大小,499是我的序列长度,128是特征数量。但输出值都是相同的:

tensor([[[0.0014, 0.0016, 0.0017,  ..., 0.0018, 0.0021, 0.0017],         [0.0014, 0.0016, 0.0017,  ..., 0.0018, 0.0021, 0.0017],         [0.0014, 0.0016, 0.0017,  ..., 0.0018, 0.0021, 0.0017],         ...,         [0.0014, 0.0016, 0.0017,  ..., 0.0018, 0.0021, 0.0017],         [0.0014, 0.0016, 0.0017,  ..., 0.0018, 0.0021, 0.0017],         [0.0014, 0.0016, 0.0017,  ..., 0.0018, 0.0021, 0.0017]]],       grad_fn=<PreluBackward>)

我哪里做错了?非常感谢任何帮助。


回答:

有几个方面需要检查。由于您对不同的输入得到了相同的输出,我怀疑某些层将所有输入置零了。所以,检查PositionalEncoding和Transformer的编码器块的输出,确保它们不是常量。但在此之前,请确保您的输入是不同的(例如,尝试注入噪声)。

此外,从图片中可以看出,您的输入和输出是语音信号,采样频率为22.05kHz(我猜的),所以应该有大约1万个特征,但您声称只有128个。这是另一个需要检查的地方。现在,数字499代表某个时间片段。确保您的片段在合理范围内(通常为20-50毫秒,大约30毫秒)。如果是这样,30毫秒乘以500就是15秒,这比您示例中的时间长得多。最后,您在输入中屏蔽了三分之一秒的语音,我认为这太多了。

我认为研究Wav2vecWav2vec 2.0这两篇论文会很有帮助,它们成功地利用Transformer编码器在语音识别领域进行了自监督训练。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注