ValueError: Pomocí cílové velikosti (pochodeň.Velikost([2, 1])), které se liší na velikosti vstupu (pochodeň.Velikost([16, 1])) je zastaralé

0

Otázka

Snažím se vytvořit model pro Quora otázky dvojice dataset, kde výstup je binární, buď 1 nebo 0, ale já se tuto chybu. Vím, že výstupní tvaru modelu se liší od vstupní tvar, ale nevím, jak to opravit. Velikost šarže je nastavena 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)

Chyba:

/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

Nejlepší odpověď

0

Z trasování zásobníku, chyba se stane v BCELoss výpočty, to je vzhledem k tomu, že outputs.shape je (16, 1), zatímco targets.shape je (2, 1).

Já vidím hlavní problém v kódu: BCELoss slouží k porovnání rozdělení pravděpodobnosti (podívejte se na dokumenty), ale váš výstup modelu má tvar (n, 1) kde n je velikost šarže (ve vašem případě 16). Ve skutečnosti v návratu prohlášení forward můžete projít o2 lineární vrstva, jejíž výstupní tvar je 1.

Na Otázku Párů Dataset je určen pro binární klasifikaci úkoly, takže budete muset převést výstup do rozdělení pravděpodobnosti, například pomocí Sigmoid nebo stanovování lineární vrstva výstupní velikost 2, a pak pomocí softmax.

2021-11-21 15:50:29

Kromě toho můžete přepnout BCELoss s CrossEntropyLoss, který je určen pro binární klasifikace problémy.
aretor

změním ztráta funkce (BCEWithLogitsLoss), který se vztahuje esovité na výstup , pak jsem odstranil softmax . problém stále existuje, ale nyní, protože cílová velikost je (10,1) a liší se od vstupu (16,1)
BuzzedHub

To je těžké říct, chyb z kódu. Vzhledem k tomu, že 16 je správná velikost dávky, pečlivě zkontrolovat, když vaše cílová velikost se změní z 16 na 10. Prosím, vyhněte se mění tělo svou otázku, jinak odpověď nebude mít smysl.
aretor

V jiných jazycích

Tato stránka je v jiných jazycích

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