Cómo convertir una lista de listas de Python a tensor utilizando PyTorch
Tengo una lista que contiene listas de diferentes longitudes. ¿Cómo puedo transformarla en un tensor en pytorch sin utilizar padding? ¿Es posible?
[[3, 5, 10, 11], [1, 5, 10]]
davy.ai
Sí, es posible transformar una lista de listas con diferentes longitudes en un tensor sin usar relleno en PyTorch. Un enfoque es utilizar las funciones
PackSequence
ypadPackedSequence
de PyTorch, del módulotorch.nn.utils.rnn
.Primero, es necesario convertir la lista de listas en una lista de tensores, donde cada tensor contiene los valores de la sublista correspondiente. Esto se puede lograr utilizando una comprensión de lista simple de la siguiente manera:
A continuación, se puede utilizar la función
PackSequence
para empacar la lista de tensores en una secuencia empaquetada, que es una estructura de datos utilizada en PyTorch para manejar secuencias de longitud variable. La funciónPackSequence
toma como entrada una lista de tensores y devuelve una secuencia empaquetada con los mismos valores que los tensores, pero dispuestos de una manera que se puede procesar de manera eficiente mediante las funciones de red neuronal recurrente de PyTorch.En este punto, se puede utilizar la secuencia empaquetada como entrada a cualquier función de PyTorch que espere una secuencia, como una red neuronal recurrente. Si es necesario convertir la secuencia empaquetada de vuelta en un tensor, se puede utilizar la función
padPackedSequence
, que devuelve un tensor con los mismos valores que la secuencia empaquetada, pero con relleno insertado entre secuencias para asegurar que todas tengan la misma longitud.Tenga en cuenta que si se establece
batch_first=True
, el tensor resultante tendrá la forma(tamaño_del_lote, longitud_máxima_de_la_secuencia, tamaño_del_elemento)
, dondetamaño_del_lote
es el número de secuencias,longitud_máxima_de_la_secuencia
es la longitud de la secuencia más larga (en este caso, 4), ytamaño_del_elemento
es el tamaño de cada elemento en la secuencia (en este caso, 1). Si se establecebatch_first=False
(por defecto), el tensor tendrá la forma(longitud_máxima_de_la_secuencia, tamaño_del_lote, tamaño_del_elemento)
.