Error “TypeError: el objeto ‘Tensor’ no es iterable” con tensorflow Estimator

Tengo una fuente de datos (infinita) generada de manera procesal y estoy tratando de usar esto como entrada al Estimator flujo sensor de alto nivel para entrenar un detector de objetos 3D basado en imágenes.

Configuré el conjunto de datos como en el Inicio rápido del estimador de Tensorflor, y mi conjunto de dataset_input_fn devuelve una tupla de características y tags de Tensor , tal como lo especifica la función Estimator.train , y cómo se muestra este tutorial , pero aparece un error al intentar para llamar a la función de tren:

TypeError: 'Tensor' object is not iterable.

¿Qué estoy haciendo mal?


  def data_generator(): """ Generator for image (features) and ground truth object positions (labels) Sample an image and object positions from a procedurally generated data source """ while True: source.step() # generate next data point object_ground_truth = source.get_ground_truth() # list of 9 floats cam_img = source.get_cam_frame() # image (224, 224, 3) yield (cam_img, object_ground_truth) def dataset_input_fn(): """ Tensorflow `Dataset` object from generator """ dataset = tf.data.Dataset.from_generator(data_generator, (tf.uint8, tf.float32), \ (tf.TensorShape([224, 224, 3]), tf.TensorShape([9]))) dataset = dataset.batch(16) iterator = dataset.make_one_shot_iterator() features, labels = iterator.get_next() return features, labels def main(): """ Estimator [from Keras model](https://www.tensorflow.org/programmers_guide/estimators#creating_estimators_from_keras_models) Try to call `est_vgg.train()` leads to the error """ .... est_vgg16 = tf.keras.estimator.model_to_estimator(keras_model=keras_vgg16) est_vgg16.train(input_fn=dataset_input_fn, steps=10) .... 

Aquí está el código completo

(nota: las cosas se nombran de manera diferente a esta pregunta)

Aquí está la traza de la stack:

 Traceback (most recent call last): File "./rock_detector.py", line 155, in  main() File "./rock_detector.py", line 117, in main est_vgg16.train(input_fn=dataset_input_fn, steps=10) File "/usr/local/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 302, in train loss = self._train_model(input_fn, hooks, saving_listeners) File "/usr/local/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 711, in _train_model features, labels, model_fn_lib.ModeKeys.TRAIN, self.config) File "/usr/local/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py", line 694, in _call_model_fn model_fn_results = self._model_fn(features=features, **kwargs) File "/usr/local/lib/python3.6/site-packages/tensorflow/python/keras/_impl/keras/estimator.py", line 145, in model_fn labels) File "/usr/local/lib/python3.6/site-packages/tensorflow/python/keras/_impl/keras/estimator.py", line 92, in _clone_and_build_model keras_model, features) File "/usr/local/lib/python3.6/site-packages/tensorflow/python/keras/_impl/keras/estimator.py", line 58, in _create_ordered_io for key in estimator_io_dict: File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 505, in __iter__ raise TypeError("'Tensor' object is not iterable.") TypeError: 'Tensor' object is not iterable. 

Haz que tu función de entrada devuelva un diccionario de características como esta:

 def dataset_input_fn(): ... features, labels = iterator.get_next() return {'image': features}, labels