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.

tf.concat tensores con diferentes longitudes

Tengo 2 tensores como:

a = tf.constant([[1, 2, 3], [1, 2, 3]])
b = tf.constant([1, 2, 3, 4, 5])

Mi resultado deseado sería:

<tf.Tensor: shape=(4, 2), dtype=int64, numpy=
array([[1, 2, 3, 0, 0],
[1, 2, 3, 0, 0],
[1, 2, 3, 4, 5]], dtype=int64)>

Pero cuando intento tf.concat([a, b], axis=0) obtengo este error:

InvalidArgumentError: ConcatOp: Las dimensiones de las entradas deben coincidir: shape[0] = [2,3] vs. shape[1] = [1,5] [Op:ConcatV2] name: concat

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón de este error es que los tensores a y b tienen dimensiones diferentes a lo largo del eje en el que estás intentando concatenarlos (eje 0). Para concatenar tensores a lo largo de un eje específico, necesitan tener la misma forma a lo largo de ese eje. En este caso, el tensor a tiene forma (2, 3) a lo largo del eje 0, mientras que el tensor b tiene forma (1, 5) a lo largo de ese mismo eje.

    Para lograr el resultado deseado, puedes reformatear el tensor b para que tenga el mismo número de filas que el tensor a, antes de concatenarlos a lo largo del eje 1. Aquí tienes un ejemplo:

    import tensorflow as tf
    
    a = tf.constant([[1, 2, 3], [1, 2, 3]])
    b = tf.constant([1, 2, 3, 4, 5])
    
    # Reformatear b para tener el mismo número de filas que a
    b_reshaped = tf.reshape(b, [1, 5])
    
    # Concatenar a y b_reshaped a lo largo del eje 1
    c = tf.concat([a, b_reshaped], axis=1)
    
    print(c)
    

    Esto debería generar el siguiente resultado:

    <tf.tensor: shape="(2," 5),="" dtype="int32," numpy="array([[1," 2,="" 3,="" 1,="" 2],="" [1,="" 2,="" 3,="" 4,="" 5]],="" dtype="int32)">
    

    Ten en cuenta que la forma resultante del tensor es (2, 5) en lugar de (4, 2) como en tu resultado deseado. Si deseas intercambiar las dimensiones, puedes usar la función tf.transpose:

    # Transponer el tensor concatenado para obtener la forma deseada
    c_transposed = tf.transpose(c)
    
    print(c_transposed)
    

    Esto debería generar el siguiente resultado:

    <tf.tensor: shape="(5," 2),="" dtype="int32," numpy="array([[1," 1],="" [2,="" 2],="" [3,="" 3],="" [1,="" 4],="" [2,="" 5]],="" dtype="int32)">
    

    Finalmente, ten en cuenta que el tensor resultante tiene un tipo de dato int32 en lugar de int64 como en tu resultado deseado. Puedes cambiar el tipo de dato estableciéndolo explícitamente al crear las constantes:

    python
    a = tf.constant([[1, 2, 3], [1, 2, 3]], dtype=tf.int64)
    b = tf.constant([1, 2, 3, 4, 5], dtype=tf.int64)
    </tf.tensor:></tf.tensor:>

Comments are closed.