ValueError: Folosind o țintă dimensiune (torță.Dimensiune([2, 1])), care este diferit de marimea de intrare (torță.Dimensiune([16, 1])) este învechită

0

Problema

Eu sunt încercarea de a construi un model pentru Quora întrebări pereche de date în cazul în care producția este binare 1 sau 0, dar primesc aceasta eroare. Știu ieșire forma de modelul meu este diferit de cel de intrare de forma, dar nu știi cum să o rezolvi. Mărimea lotului este setat la 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)

Eroare:

/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

Cel mai bun răspuns

0

Din stack trace-ul, eroarea se întâmplă în BCELoss calcule, acest lucru se datorează faptului că outputs.shape este (16, 1), în timp ce targets.shape este (2, 1).

Eu văd o problemă majoră în cod: BCELoss este folosit pentru a compara distribuții de probabilitate (verificați docs), dar modelul de ieșire are forma (n, 1) în cazul în care n este mărimea lotului (în cazul tău, 16). În fapt, în declarația de retur de forward treci o2 la un liniar de strat a cărui ieșire este forma 1.

La Întrebarea Perechi de Date este destinat pentru clasificare binară sarcini, astfel încât aveți nevoie pentru a converti de ieșire într-o distribuție de probabilitate, de exemplu, prin utilizarea unui Sigmoid sau setarea liniar strat dimensiunea de ieșire la 2, și apoi, folosind softmax.

2021-11-21 15:50:29

În plus, puteți comuta BCELoss cu CrossEntropyLoss, care este menit pentru probleme de clasificare binară.
aretor

am schimba funcția de pierdere a (BCEWithLogitsLoss) care se aplică sigmoid la ieșire , apoi am scos softmax . problema există în continuare, dar acum, pentru că dimensiunea țintă este (10,1) și diferite de la intrare (16,1)
BuzzedHub

Este dificil de a spune eroare de cod. Având în vedere că 16 este corect mărimea lotului, verificați cu atenție atunci când ținta schimbări de dimensiuni de la 16 la 10. Vă rugăm să evitați schimbarea corpului de întrebare în caz contrar răspunsurile nu vor mai avea sens.
aretor

În alte limbi

Această pagină este în alte limbi

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