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.
davy.ai
El mensaje de error ocurre porque el método
from_tensor_slices
infiere el tipo de datos del tensor comotf.int32
, lo cual provoca un error cuando se aplicamap
con una función lambda que devuelvetf.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 aplicarmap
, como se muestra a continuación:Esto debería devolver una lista con los valores
[0.1, 0.2, 0.3]
en formatofloat32
.