Błąd wartości: Korzystanie docelowego rozmiaru (torch.Size([2, 1])), który różni się od wielkości wejściowych (torch.Size([16, 1])), nie zaleca się

0

Pytanie

Próbuję zbudować model dla zbioru danych pary pytań Quora, gdzie dane wyjściowe są binarnymi 1 lub 0, ale pojawia się ten błąd. Wiem, że forma wyjścia mojego modelu różni się od formularza do wprowadzania danych, ale nie wiem, jak to naprawić. Rozmiar pakietu zainstalowana na 16

    class Bert_model (nn.Module):
      def __init__(self) :
        super(Bert_model,self).__init__()
        self.bert =  BertModel.from_pretrained('bert-base-uncased', return_dict=False)
        self.drop_layer = nn.Dropout(.25)
        self.output = nn.Linear(self.bert.config.hidden_size,1)
    
      def forward(self,input_ids,attention_mask):
        _,o2 = self.bert (input_ids =input_ids , attention_mask = attention_mask )
        o2 = self.drop_layer(o2)
        return self.output(o2)

    model = Bert_model()
    
    loss_fn = nn.BCELoss().to(device)

    def train_epoch(
      model, 
      data_loader, 
      loss_fn, 
      optimizer, 
      device, 
      n_examples
    ):
      model = model.train()
    
      losses = []
      correct_predictions = 0
      
      for d in data_loader:
        input_ids = d["input_ids"].to(device)
        attention_mask = d["attention_mask"].to(device)
        targets = d["target"].to(device)
    
        input_ids = input_ids.view(BATCH_SIZE,-1)
        attention_mask = attention_mask.view(BATCH_SIZE,-1)
    
        outputs = model(
          input_ids=input_ids,
          attention_mask=attention_mask
        )
    
        _, preds = torch.max(outputs, dim=1)
    
        targets = targets.unsqueeze(-1)
        loss = loss_fn(F.softmax(outputs,dim=1), targets)
    
        correct_predictions += torch.sum(preds == targets)
        losses.append(loss.item())
    
        loss.backward()
        nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
        optimizer.step()
        optimizer.zero_grad()
    
      return correct_predictions.double() / n_examples, np.mean(losses)

Z powodu błędu:

/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in
binary_cross_entropy(input, target, weight, size_average, reduce,
reduction)    2913         weight = weight.expand(new_size)    2914 
-> 2915     return torch._C._nn.binary_cross_entropy(input, target, weight, reduction_enum)    2916     2917  ValueError: Using a target
size (torch.Size([2, 1])) that is different to the input size
(torch.Size([16, 1])) is deprecated
deep-learning pytorch
2021-11-21 11:25:25
1

Najlepsza odpowiedź

0

Z śledzenia stosu należy, że błąd występuje przy obliczeniach BCELoss, jest to związane z tym, że outputs.shape jest (16, 1), podczas gdy targets.shape jest (2, 1).

Widzę poważny problem w kodzie: BCELoss służy do porównania stochastycznych dystrybucji (sprawdź dokumenty), ale dane wyjściowe modelu mają kształt (n, 1) gdzie n jest to rozmiar pakietu (w twoim przypadku 16). W rzeczywistości w oświadczeniu o zwrocie forward przechodzą o2 do wejścia warstwy, moc, której kształt 1.

Zestaw danych Par pytań jest przeznaczony do zadań binarnej klasyfikacji, więc trzeba przekształcić dane wyjściowe w rozkład prawdopodobieństwa, na przykład, za pomocą Sigmoid lub ustaw rozmiar wyjściowego liniowego warstwy jest równa 2, a następnie użyj softmax.

2021-11-21 15:50:29

Ponadto, można przełączać się BCELoss z CrossEntropyLoss, który jest przeznaczony do zadań binarnej klasyfikacji.
aretor

ja zdradzam funkcję strat (BCEWithLogitsLoss), która stosuje сигмоид do wyjścia, a następnie usunąłem softmax . problem nadal istnieje, ale teraz, ponieważ docelowy rozmiar (10,1) i różni się od wejściowego (16,1)
BuzzedHub

Trudno odróżnić błąd od twojego kodu. Biorąc pod uwagę, że 16-to odpowiedni rozmiar pakietu, dokładnie sprawdź, kiedy twój docelowy rozmiar zmienia się z 16 na 10. Należy unikać zmiany tekstu twojego pytania, bo odpowiedzi nie będą mieć sensu.
aretor

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................