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.

Tags:  , , ,

Answer

  1. Avatar for 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 y padPackedSequence de PyTorch, del módulo torch.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:

    import torch
    
    # ejemplo de lista de listas
    lista_de_listas = [[3, 5, 10, 11], [1, 5, 10]]
    
    # convertir a lista de tensores
    lista_de_tensores = [torch.tensor(lst) for lst in lista_de_listas]
    

    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ón PackSequence 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.

    from torch.nn.utils.rnn import pack_sequence
    
    # empacar la lista de tensores en una secuencia empaquetada
    secuencia_empaquetada = pack_sequence(lista_de_tensores)
    

    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.

    from torch.nn.utils.rnn import pad_packed_sequence
    
    # convertir la secuencia empaquetada de vuelta en un tensor
    tensor_relleno, _ = pad_packed_sequence(secuencia_empaquetada, batch_first=True)
    

    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), donde tamañ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), y tamaño_del_elemento es el tamaño de cada elemento en la secuencia (en este caso, 1). Si se establece batch_first=False (por defecto), el tensor tendrá la forma (longitud_máxima_de_la_secuencia, tamaño_del_lote, tamaño_del_elemento).

Comments are closed.