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.

Cambio de tipo a través del método map

Estoy lidiando con un detalle en Tensorflow con respecto al método map de Dataset, como se describe aquí. El ejemplo

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.map(lambda x: x + 2)
list(dataset.as_numpy_iterator())

funciona bien, pero al cambiar el tipo de elemento aplicando map como

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.map(lambda x: x / 10.0)
list(dataset.as_numpy_iterator())

produce el mensaje de error

TypeError: `x` y `y` deben tener el mismo dtype, se obtuvo tf.int32 != tf.float32.

porque el tipo de retorno de la función map aplicada no es el mismo que su tipo de entrada. ¿Por qué sucede esto? ¿Es imposible cambiar el tipo? Si es así, ¿cómo puedo lograr el resultado deseado de cambiar el tipo de elemento en el conjunto de datos a tf.float32?

Ten en cuenta que el conjunto de datos real es más complejo, pero este es un ejemplo mínimo que ilustra el problema.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error ocurre porque el método from_tensor_slices infiere el tipo de datos del tensor como tf.int32, lo cual provoca un error cuando se aplica map con una función lambda que devuelve tf.float32.

    Para cambiar el tipo de los elementos del tensor, una posible solución es convertir explícitamente el tensor utilizando el método tf.cast antes de aplicar map, como se muestra a continuación:

    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    dataset = dataset.map(lambda x: tf.cast(x, tf.float32) / 10.0)
    list(dataset.as_numpy_iterator())
    

    Esto debería devolver una lista con los valores [0.1, 0.2, 0.3] en formato float32.

Comments are closed.