ValueError: el Uso de un tamaño de destino (de la antorcha.Tamaño([2, 1])) que es diferente al tamaño de entrada (de la antorcha.Tamaño([16, 1])) está en desuso

0

Pregunta

Estoy tratando de construir un modelo para la Quora preguntas par de conjunto de datos en el que la salida es binaria, ya sea 1 o 0, pero me sale este error. Sé que la salida de la forma de mi modelo es diferente de la de entrada de la forma, pero no sé cómo solucionarlo. El tamaño del lote es de 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)

El error:

/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

Mejor respuesta

0

A partir de la traza de la pila, el error ocurre en el BCELoss cálculos, esto es debido al hecho de que la outputs.shape es (16, 1), mientras que targets.shape es (2, 1).

Veo un gran problema en tu código: BCELoss se utiliza para comparar las distribuciones de probabilidad (compruebe el docs), pero su modelo de salida tiene la forma (n, 1) donde n es el tamaño de lote (en su caso 16). De hecho, en la devolución de la declaración de forward pasar o2 a un lineal de la capa de salida cuya forma es 1.

La Pregunta Pares conjunto de datos que se entiende por clasificación binaria de tareas, por lo que necesita para convertir su salida en una distribución de probabilidad, por ejemplo, mediante el uso de un Sigmoid o ajuste lineal de la capa de salida de tamaño 2 y, a continuación, utilizando la softmax.

2021-11-21 15:50:29

Además puede cambiar BCELoss con CrossEntropyLossque se supone que es para problemas de clasificación binaria.
aretor

puedo cambiar la función de pérdida para (BCEWithLogitsLoss) que se aplica sigmoide a la salida , luego he quitado el softmax . el problema todavía existe, pero ahora debido a que el tamaño del destino es (10,1) y diferentes de entrada (16,1)
BuzzedHub

Es difícil decir el error en su código. Dado que el 16 es el correcto tamaño de lote, compruebe cuidadosamente cuando su destino a los cambios de tamaño de 16 a 10. Por favor, evite cambiar el cuerpo de su pregunta, de lo contrario, las respuestas no se hacen sentido.
aretor

En otros idiomas

Esta página está en otros idiomas

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