BERT без оболочки + слой GRU для анализа настроений

Я пытаюсь настроить BERT без учета анализа настроений, добавив в конце один слой GRU. Проблема заключается в том, что выходная форма модели BERT не соответствует необходимой входной форме для слоя GRU.

У меня есть 2 класса: положительный и отрицательный, и размер пакета 25. BERT выводит тензор формы (25, 2). ГРУ нужен 3D ввод.

Код:

      class BERT_Sent(nn.Module):

    def __init__(self, bert, batch_size, input_size, hidden_size, num_layers, dropout=0.2):

      super(BERT_Sent, self).__init__()

      self.bert = bert
      weight = next(self.parameters()).data
      self.relu = nn.ReLU()
      self.softmax = nn.Softmax()
      self.h0 = weight.new(num_layers, batch_size, hidden_size).zero_()
      self.h0.requires_grad = True

      # GRU
      self.gru = nn.GRU(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, dropout=dropout) 

    def forward(self, token_ids, attention_masks, labels=None):
        out1 = self.bert(token_ids, 
                        token_type_ids = None, 
                        attention_mask = attention_masks,
                        labels = labels)

        out1 = self.relu(out1.logits)    #relu: felt cute might delete later
        out2, h1 = self.gru(out1, self.h0)
        return self.softmax(out2)
      optimizer = torch.optim.AdamW(model_.parameters(), lr = 2e-5, eps = 1e-08)

Также я не знаю, полезен ли h0, когда у меня есть только один слой GRU, поэтому я хотел бы, чтобы кто-нибудь объяснил. Я добавил «требуется град» на тот случай, если это можно изменить с помощью обучения.

Я использую эти параметры в качестве начальной пробы:

      model_ = BERT_Sent(model, batch_size, 15, 256, 1)

Пожалуйста, помогите мне понять, как правильно добавить слой GRU. Я никогда не работал ни с BERT, ни с RNN/GRU.

0 ответов

Другие вопросы по тегам