我正在尝试使用变压器模型。我的输入和输出是相同的形状(torch.Size([499, 128])
,其中499是序列长度,128是特征数
我的训练循环是:
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 math
from typing import final
import torch
import torch.nn as nn
class 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>)
我做错了什么?非常感谢你的帮助
有几点需要检查。由于对不同的输入有相同的输出,我怀疑某些层会将所有输入归零。因此,检查位置编码的输出以及变压器的编码器块,以确保它们不是恒定的。但在此之前,请确保您的输入不同(例如,尝试注入噪声)
此外,从我在图片中看到的情况来看,您的输入和输出是语音信号,采样频率为22.05kHz(我猜),因此它应该具有~10k的特性,但您声称您只有128个。这是另一个检查的地方。现在,数字499代表某个时间段。确保你的切片在合理的范围内(20-50毫秒,通常是30毫秒)。如果是这样的话,那么30ms乘以500等于15秒,这在您的示例中要多得多。最后,你在输入中屏蔽了三分之一秒的语音,我认为这太多了
我认为检查Wav2vec和Wav2vec 2.0论文是有用的,它们成功地解决了语音识别领域中使用Transformer编码器进行自我监督训练的问题
相关问题 更多 >
编程相关推荐