“TypeError: 'Tenseur' objet n'est pas itératif” erreur avec tensorflow Estimateur

J'ai un sur le plan procédural généré (infini) de la source de données et suis en train de l'utiliser comme entrée de haut-niveau Tensorflow Estimator pour former une base d'image de l'objet 3D détecteur.

J'ai configuré le jeu de données, comme dans la Tensorflor Estimateur Démarrage rapide, et mon dataset_input_fn retourne un tuple de fonctionnalités et d'étiquettes Tensor's, tout comme la Estimateur.train fonction précise, et comment cette tutoriel montre, mais j'obtiens une erreur lorsque vous essayez d'appeler le train de la fonction:

TypeError: 'Tensor' object is not iterable.

Ce que je fais 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)
        ....

Ici est la code complet

(note: les choses sont nommées différemment à partir de cette question)

Ici est la trace de la pile:

Traceback (most recent call last):
  File "./rock_detector.py", line 155, in <module>
    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.
Je pense que vous voulez juste: get_next = iterator.get_next(); est_vgg16.train(input_fn=get_next, steps=10, mais je ne l'utilise pas keras donc je ne suis pas familiarisé avec la .train de la fonction en cours d'utilisation.
Pouvez-vous s'il vous plaît partager le full stack trace de l'erreur?
Mis à jour le post avec la trace de la pile. C'est un peu dur de comprendre ce qui se passe sous le capot avec l'api de haut niveau. Je l'ai eu à travailler avec autant d'effort par commutation au niveau inférieur de l'interface pour tf et juste "alimentation" avec le générateur manuellement. La bonne chose à propos de plus haut niveau de l'api, cependant, est qu'il gère l'ensemble de la formation et de détails et pouvez probablement optimiser le traitement.

OriginalL'auteur matwilso | 2017-11-11