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.

Contando el número de ocurrencias en el Tensor de PyTorch. (El tensor es demasiado grande para Numpy)

¿Existe alguna forma inteligente de contar el número de ocurrencias de cada valor en un Tensor de PyTorch muy grande? El tamaño del Tensor es 11701*300=3510300 o tal vez aumente o disminuya. TORCH.BINCOUNT, TORCH.UNIQUE y TORCH.UNIQUE_CONSECUTIVE no son útiles hasta el momento.

BINCOUNT retorna un número diferente de elementos cada vez. Unique tampoco es útil ya que devuelve valores únicos.

Esto es lo que quise decir cuando dije que devuelve elementos diferentes cada vez. Si 5 elementos devolverán un tensor de 8 elementos, ¿cómo se supone que debo saber cuántas veces aparece cada elemento? esto es confuso para mí. La documentación oficial tiene un contenido limitado y no hay otro sitio web que lo explique.

En la imagen anterior. Entonces, 5 aparece 2 veces. ¿0 aparece? ¿cuántas veces? ¿Cómo leer esta salida? No tiene sentido para mí.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, las opciones de TORCH.BINCOUNT, TORCH.UNIQUE y TORCH.UNIQUE_CONSECUTIVE no parecen proporcionar una solución directa para contar el número de ocurrencias de cada valor en un gran Tensor de PyTorch. Como se menciona, TORCH.BINCOUNT devuelve un tensor con diferentes números de elementos cada vez, TORCH.UNIQUE devuelve solo los valores únicos y TORCH.UNIQUE_CONSECUTIVE devuelve solo los valores consecutivos únicos, ninguno de los cuales proporciona el recuento completo de cada valor.

    Un enfoque posible para este problema es usar un objeto Counter de Python del módulo collections. Primero, podemos aplanar el Tensor de PyTorch en una lista de 1D usando los métodos reshape y tolist. Luego, podemos crear un objeto Counter a partir de esta lista y recuperar el recuento de cada elemento usando el método most_common. El siguiente código ilustra este enfoque:

    from collections import Counter
    import torch
    
    # crear un Tensor aleatorio de PyTorch con tamaño 11701*300
    tensor = torch.randn(11701, 300)
    
    # aplanar el Tensor en una lista de 1D
    flat_list = tensor.reshape(-1).tolist()
    
    # crear un objeto Counter y recuperar el recuento de cada elemento
    counts = Counter(flat_list).most_common()
    
    print(counts)
    

    Este código crea un Tensor aleatorio de PyTorch con el tamaño especificado, lo aplanza en una lista de 1D usando reshape y tolist, crea un objeto Counter a partir de esta lista y recupera el recuento de cada elemento usando most_common. La salida debería ser una lista de tuplas donde el primer elemento de cada tupla es el valor y el segundo elemento es el conteo de ese valor. Por ejemplo:

    [(0.123456789, 362), (-0.987654321, 354), (2.718281828, 346), ...]
    

    Este enfoque puede manejar tensores de cualquier tamaño, aunque el uso de memoria puede convertirse en un problema para tensores muy grandes.

Comments are closed.