Las dimensiones de la función de pérdida de Pytorch no coinciden

Estoy tratando de ejecutar incrustaciones de palabras utilizando el entrenamiento por lotes , como se muestra a continuación.

def forward(self, inputs): print(inputs.shape) embeds = self.embeddings(inputs) print(embeds.shape) out = self.linear1(embeds) print(out.shape) out = self.activation_function1(out) print(out.shape) out = self.linear2(out).cuda() print(out.shape) out = self.activation_function2(out) print(out.shape) return out.cuda() 

Aquí, estoy usando tamaño de contexto 4, tamaño de lote 32, tamaño de incrustación 50, tamaño de capa oculta 64, tamaño de vocabulario 9927

La salida de las funciones de “forma” es

print (inputs.shape) —-> torch.Size ([4, 32])

print (embeds.shape) —-> torch.Size ([4, 32, 50])

print (out.shape) —-> torch.Size ([4, 32, 64])

print (out.shape) —-> torch.Size ([4, 32, 64])

print (out.shape) —-> torch.Size ([4, 32, 9927])

print (out.shape) —-> torch.Size ([4, 32, 9927])

¿Son correctas las formas de estos? Estoy bastante confundido.

Además, cuando entreno, devuelve un error:

 def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader, 0): optimizer.zero_grad() output = model(torch.stack(data)) loss = criterion(output, target) loss.backward() optimizer.step() 

Recibo un error en la línea “pérdida = criterio (salida, objective)”. Dice “Se espera que la entrada batch_size (4) coincida con el batch_size (32) objective”. ¿Son correctas mis formas para la función “adelante”? No estoy tan familiarizado con el entrenamiento por lotes. ¿Cómo hago que las dimensiones coincidan?

——- EDITAR: Publicar el código de inicio a continuación —–

  def __init__(self, vocab_size, embedding_dim): super(CBOW, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear1 = nn.Linear(embedding_dim, 64) self.activation_function1 = nn.ReLU() self.linear2 = nn.Linear(64, vocab_size) self.activation_function2 = nn.LogSoftmax(dim = -1) 

El método forward torch.nn.Linear necesita tamaño de lote como primer argumento.

Lo está suministrando como segundo (primero son los pasos de tiempo), use permute(1, 0, 2) para hacerlos primero.

Además, las capas lineales generalmente toman una entrada 2D, siendo la primera el lote y la segunda la dimensión de la entrada. El tuyo es 3d debido a las palabras (supongo), ¿quizás quieras usar redes neuronales recurrentes (por ejemplo, torch.nn.LSTM )?