es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El uso de la capa BatchNorm1d con capas de Embedding y Linear en un problema de clasificación de texto para NLP arroja un RuntimeError.

Estoy tratando de crear una red neuronal y entrenar mis propias incrustaciones. La red tiene la siguiente estructura (PyTorch):

import torch.nn as nn

class MultiClassClassifer(nn.Module):
  #define all the layers used in model
  def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):

#Constructor
super(MultiClassClassifer, self).__init__()

#embedding layer
self.embedding = nn.Embedding(vocab_size, embedding_dim)

#dense layer
self.hiddenLayer = nn.Linear(embedding_dim, hidden_dim)

#Batch normalization layer
self.batchnorm = nn.BatchNorm1d(hidden_dim)

#output layer
self.output = nn.Linear(hidden_dim, output_dim)

#activation layer
self.act = nn.Softmax(dim=1) #2d-tensor

#initialize weights of embedding layer
self.init_weights()

def init_weights(self):

initrange = 1.0

self.embedding.weight.data.uniform_(-initrange, initrange)

def forward(self, text):

embedded = self.embedding(text)

hidden_1 = self.batchnorm(self.hiddenLayer(embedded))

return self.act(self.output(hidden_1))

Mi objeto de entrenamiento training_iterator se ve así:

batch = next(iter(train_iterator))
batch.text_normalized_tweet[0]
tensor([[ 240,  538,  305,   73,    9,  780, 2038,   13,   48,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1],
        [ 853,   57,    2,   70, 1875,  176,  466,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1],
        ...])

con dimensión: torch.Size([32, 25]). 32 = tamaño del lote que utilicé para crear el iterador de entrenamiento con data.BucketIterator y 25 = las secuencias en el lote.

Cuando creo una instancia del modelo:

INPUT_DIM = len(TEXT.vocab) #~5,000 tokens
EMBEDDING_DIM = 100
HIDDEN_DIM = 64
OUTPUT_DIM = 3 #target has 3 classes

model = MultiClassClassifer(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM)

y ejecuto

model(batch.text_normalized_tweet[0]).squeeze(1)

Recibo el siguiente error de RuntimeError:

RuntimeError: running_mean should contain 15 elements not 64

También puede encontrar mi Notebook Golab en este enlace.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error es causado por la capa de normalización en lotes que espera una entrada con un tamaño de 64, que es la dimensión oculta, pero está recibiendo una entrada con un tamaño de 15. Esto probablemente se debe a que el tamaño del lote que se está utilizando es de 32, y el número de secuencias en el lote es de 25, lo que significa que el tamaño real de la dimensión oculta es de 32*25=800.

    Para solucionarlo, la capa de normalización en lotes debe estar definida para esperar un tamaño de 800, no de 64. Esto se puede hacer cambiando la línea:

    self.batchnorm = nn.BatchNorm1d(hidden_dim)
    

    a:

    self.batchnorm = nn.BatchNorm1d(hidden_dim * 25)
    

    Alternativamente, si el tamaño de cada secuencia en el lote varía, la capa de normalización en lotes puede estar definida para aceptar un número variable de dimensiones de entrada configurando el parámetro ‘num_features’ en ‘hidden_dim’:

    self.batchnorm = nn.BatchNorm1d(hidden_dim, momentum=0.01, eps=1e-4, affine=True, track_running_stats=True)
    

    Haciendo esto, la capa de normalización en lotes podrá manejar entradas de cualquier tamaño, siempre y cuando el número de características (la dimensión oculta) sea consistente en todas las entradas.

Comments are closed.