Estaba revisando este ejemplo de un modelo de lenguaje LSTM en github (enlace) . Lo que hace en general me queda bastante claro. Pero todavía estoy luchando por entender qué contiguous()
hace la llamada , lo que ocurre varias veces en el código.
Por ejemplo, en la línea 74/75 de la entrada de código y se crean las secuencias de destino del LSTM. Los datos (almacenados en ids
) son bidimensionales, donde la primera dimensión es el tamaño del lote.
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
Entonces, como un ejemplo simple, cuando se usa el tamaño de lote 1 y seq_length
10 inputs
y se targets
ve así:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
Entonces, en general, mi pregunta es, ¿qué es contiguous()
y por qué lo necesito?
Además, no entiendo por qué se llama al método para la secuencia objetivo y no para la secuencia de entrada, ya que ambas variables están compuestas por los mismos datos.
¿Cómo podría targets
ser no contiguo y inputs
seguir siendo contiguo?
EDITAR:
Traté de omitir las llamadas contiguous()
, pero esto lleva a un mensaje de error al calcular la pérdida.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Entonces, obviamente, contiguous()
es necesario llamar en este ejemplo.
(Para mantener esto legible, evité publicar el código completo aquí, se puede encontrar usando el enlace de GitHub anterior).
¡Gracias por adelantado!
tldr; to the point summary
resumen conciso hasta el punto.