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.

Concatenar dos tensores con dimensiones diferentes.

Tengo dos tensores “a” y “b” que tienen dimensiones diferentes. “a” tiene forma [100,100] y “b” tiene forma [100,3,10]. Quiero concatenar estos dos tensores.
Por ejemplo:

a = torch.randn(100,100)
tensor([[ 1.3236,  2.4250,  1.1547,  ..., -0.7024,  1.0758,  0.2841],
        [ 1.6699, -1.2751, -0.0120,  ..., -0.2290,  0.9522, -0.4066],
        [-0.3429, -0.5260, -0.7748,  ..., -0.5235, -1.8952,  1.2944],
        ...,
        [-1.3465,  1.2641,  1.6785,  ...,  0.5144,  1.7024, -1.0046],
        [-0.7652, -1.2940, -0.6964,  ...,  0.4661, -0.3998, -1.2428],
        [-0.4720, -1.0981, -2.3715,  ...,  1.6423,  0.0560,  1.0676]])

El tensor “b” es el siguiente:

tensor([[[ 0.4747, -1.9529, -0.0448,  ..., -0.9694,  0.8009, -0.0610],
         [ 0.5160,  0.0810,  0.1037,  ..., -1.7519, -0.3439,  1.2651],
         [-0.5975, -0.2000, -1.6451,  ...,  1.3082, -0.4023, -0.3105]],
        ...,

    [[ 0.4747, -1.9529, -0.0448,  ..., -0.9694,  0.8009, -0.0610],
     [ 0.1939,  1.0365, -0.0927,  ..., -2.4948, -0.2278, -0.2390],
     [-0.5975, -0.2000, -1.6451,  ...,  1.3082, -0.4023, -0.3105]]],
   dtype=torch.float64, grad_fn=<copybackwards>)

Quiero concatenar de manera que la primera fila en el tensor “a” de tamaño [100] se concatene con la primera fila en el tensor “b” de tamaño [3,10]. Esto debe aplicarse a todas las filas en ambos tensores. Es decir, en pocas palabras, considerando solo la primera fila en “a” y “b”, quiero obtener una salida de tamaño [100,130] de la siguiente manera:

[ 1.3236, 2.4250, 1.1547, …, -0.7024, 1.0758, 0.2841, 0.4747, -1.9529, -0.0448, …, -0.9694, 0.8009, -0.0610, 0.5160, 0.0810, 0.1037, …, -1.7519, -0.3439, 1.2651, -0.5975, -0.2000, -1.6451, …, 1.3082, -0.4023, -0.3105]

Para hacer esto, realicé “unsqueezed” al tensor “a” para obtener los dos tensores en las mismas dimensiones de la siguiente manera:

a = a.unsqueeze(1)

Cuando realizo “torch.cat([a,b])”, todavía obtengo un error. ¿Alguien puede ayudarme a resolver esto?

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para concatenar los dos tensores, primero deberá permutar el tensor b de modo que sus dimensiones coincidan con las del tensor a. Luego puede usar la función torch.cat para concatenar los dos tensores a lo largo de la segunda dimensión (dimensión 1) de la siguiente manera:

    b = b.permute(0, 2, 1).contiguous()
    result = torch.cat([a,b], dim=1)
    

    Aquí, primero permutamos las dimensiones de b de [100,3,10] a [100,10,3] usando b.permute(0, 2, 1). Luego utilizamos el método contiguous para asegurarnos de que los datos estén almacenados en un bloque de memoria contiguo para mejorar el rendimiento. Finalmente, podemos concatenar los dos tensores a lo largo de la segunda dimensión usando torch.cat con dim=1 como segundo argumento.

    El tensor resultante tendrá una forma de [100, 130], siendo las primeras 100 columnas provenientes del tensor a y las últimas 30 columnas provenientes del tensor b después de haber sido aplanados en una sola dimensión.

Comments are closed.