RuntimeError: Expected hidden size (2, 24, 50), got (2, 30, 50)

RuntimeError: Expected hidden size (2, 24, 50), got (2, 30, 50)

我正在尝试建立一个模型来学习数据集中某些句子的指定分数(实数)。为此,我使用 RNN(在 PyTorch 中)。 我定义了一个模型:

class RNNModel1(nn.Module):

    def forward(self, input ,hidden_0):

        embedded = self.embedding(input)
        output, hidden = self.rnn(embedded, hidden_0)
        output=self.linear(hidden)
        return output , hidden

训练函数如下:

def train(model,optimizer,criterion,BATCH_SIZE,train_loader,clip):
    model.train(True)
    total_loss = 0
    hidden = model._init_hidden(BATCH_SIZE)

    for i, (batch_of_data, batch_of_labels) in enumerate(train_loader, 1):
        hidden=hidden.detach()
        model.zero_grad()
        output,hidden= model(batch_of_data,hidden)
        loss = criterion(output, sorted_batch_target_scores)
        total_loss += loss.item()
        loss.backward()
        torch.nn.utils.clip_grad_norm(model.parameters(), clip)
        optimizer.step()
    return total_loss/len(train_loader.dataset)

当我 运行 收到此错误代码时:

RuntimeError: Expected hidden size (2, 24, 50), got (2, 30, 50)

批量大小=30,隐藏大小=50,层数=1,双向=真。

我在最后一批数据中收到该错误。 我查看了 PyTorch 中 RNNs 的描述来解决这个问题。 PyTorch 中的 RNN 有两个输入参数和两个输出参数。输入参数是 inputh_0h_0 是一个张量,包括批量大小(num_layers*num_directions,批量,隐藏大小)中每个元素的初始隐藏状态。 输出参数是 outputh_nh_n 是张量,包含大小为 t=seq_len 的隐藏状态(num_layers*num_directions,批量,隐藏大小)。

在所有批次(最后一批除外)中,h_0 和 h_n 的大小相同。但在最后一批中,元素数量可能小于批量大小。因此 h_n 的大小是 (num_layersnum_directions, remained_elements_in_last_batch, 隐藏大小) 但 h_0 的大小仍然是 (num_layersnum_directions, batch_size, 隐藏大小).

所以我在最后一批数据中收到了那个错误。

如何解决这个问题,如何处理h_0和h_n大小不同的情况?

提前致谢。

当数据集中的样本数不是批次大小的倍数时,就会发生此错误。忽略最后一批可以解决问题。要识别最后一批,请检查每批中的元素数量。如果小于 BATCH_SIZE 则它是数据集中的最后一批。

if(len(batch_of_data)==BATCH_SIZE):
    output,hidden= model(batch_of_data,hidden)