由于改变批量大小的填充而导致嵌入变暗

问题描述 投票:0回答:1

我想训练一个简单的神经网络,它有 embedding_dim 作为参数:

class BoolQNN(nn.Module):
    def __init__(self, embedding_dim):
        super(BoolQNN, self).__init__()
        self.fc1 = nn.Linear(embedding_dim, 64)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(64, 1)

    def forward(self, question_emb, passage_emb):
        combined = torch.cat((question_emb, passage_emb), dim=1)
        x = self.fc1(combined)
        x = self.relu(x)
        x = self.fc2(x)
        return torch.sigmoid(x)

为了加载数据,我使用了 torchs DataLoader 和自定义 collate_fn。

train_dataset = BoolQDataset(train_data, pretrained_embeddings)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True,collate_fn=collate_fn_padd)

model = BoolQNN(301)

collate_fn_padd 函数如下所示:

def collate_fn_padd(batch):

  questions, passages, labels = zip(*batch)

  questions = [torch.tensor(q) for q in questions]
  passages = [torch.tensor(p) for p in passages]

  padded_questions = pad_sequence(questions, batch_first=True, padding_value=0)
  padded_passages = pad_sequence(passages, batch_first=True, padding_value=0)

  labels = torch.tensor(labels, dtype=torch.float32)
  
  return padded_questions, padded_passages, labels

问题:对于我想要训练模型的每个批次,嵌入文本的填充长度不同(它采用当前批次的最长序列)。

这意味着我的神经网络中线性层的嵌入暗淡/输入大小会随着批次的不同而变化,尽管我希望每个批次的大小相同。

因此,我收到这样的错误:mat1 和 mat2 形状不能相乘(16x182 和 301x64)

是否可以调整 collate_fn_pad 函数,使其将序列填充为相同大小,而与批量大小无关?

python text nlp padding data-preprocessing
1个回答
0
投票

您可以添加设置为

embedding_dim
的最大长度参数,以将所有数据填充并截断为固定长度:

padded_questions = [torch.nn.functional.pad(torch.tensor(q), (0, max_length - len(q)), value=0)[:max_length] for q in questions]
padded_passages = [torch.nn.functional.pad(torch.tensor(p), (0, max_length - len(p)), value=0)[:max_length] for p in passages]
© www.soinside.com 2019 - 2024. All rights reserved.