Grism Patel
Grism Patel

Reputation: 151

RuntimeError: __iter__() is only supported inside of tf.function or when eager execution is enabled

I am new to tensorflow and trying to learn it. Trying to run an estimator LinearClassifier in Tensorflow 2.2.0.

  1. Imported all the modules and read in tfRecords
import tensorflow as tf
print(tf.version.VERSION)
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
print (tf.executing_eagerly())
tf.executing_eagerly()
tf.compat.v1.enable_eager_execution()

path = 'train.tfrecord'
filenames = [(path + "/" + name) for name in os.listdir(path) if name.startswith("part")]
print (filenames)
  1. Define the parse function
def _parse_function(example_proto):
    features = {
        'Age': tf.io.FixedLenFeature([], tf.string),
        'EstimatedSalary': tf.io.FixedLenFeature([], tf.string),
        'Purchased': tf.io.FixedLenFeature([], tf.string)
    }
    tf_records = tf.io.parse_single_example(example_proto, features)
    features_dict = {
        'Age': tf_records['Age'],
        'EstimatedSalary': tf_records['EstimatedSalary']
    }
    return features_dict, tf_records['Purchased']
  1. Define the input function to pass in the estimator
def input_fn():
    dataset = tf.data.TFRecordDataset(filenames = filenames)
    
    dataset = dataset.map(_parse_function)
    iterator = iter(dataset)
    next_element = iterator.get_next()
    return next_element
  1. Initializing estimator
feature_columns = [
    tf.feature_column.numeric_column('Age'),
    tf.feature_column.numeric_column('EstimatedSalary')
]

estimator = tf.estimator.LinearClassifier(feature_columns = feature_columns)
estimator.train(
    input_fn = input_fn
)

Running the following code gives an error:

Traceback (most recent call last):
  File "linear_classification.py", line 42, in <module>
    input_fn = input_fn
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py", line 349, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py", line 1182, in _train_model
    return self._train_model_default(input_fn, hooks, saving_listeners)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py", line 1208, in _train_model_default
    self._get_features_and_labels_from_input_fn(input_fn, ModeKeys.TRAIN))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py", line 1044, in _get_features_and_labels_from_input_fn
    self._call_input_fn(input_fn, mode))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py", line 1137, in _call_input_fn
    return input_fn(**kwargs)
  File "linear_classification.py", line 31, in input_fn
    iterator = iter(dataset)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 406, in __iter__
    raise RuntimeError("__iter__() is only supported inside of tf.function "
RuntimeError: __iter__() is only supported inside of tf.function or when eager execution is enabled.

Things I tried:

  1. forcing eager execution (even tho in tf 2 it is done by default).
  2. Trying to search existing StackOverflow: TensorFlow 2.0 dataset.__iter__() is only supported when eager execution is enabled
  3. Put print statements in actual tf source code to understand why context.executing_eagerly() is setting to False. The default_execution_mode in context.py is initialized by EAGER_MODE, so I am confused to why it becomes False
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/data/ops/dataset_ops.py

This is my first StackOverflow question, so please excuse if I have not followed any guidelines or rules. Any help is much appreciated. Thank you.

Upvotes: 5

Views: 11200

Answers (1)

Grism Patel
Grism Patel

Reputation: 151

So I figured out the issue is. As the error states RuntimeError: __iter__() is only supported inside of tf.function or when eager execution is enabled. I put the @tf.function above my input_fn(). So now my input_fn() looks like:

@tf.function
def input_fn():
    dataset = tf.data.TFRecordDataset(filenames = filenames)
    
    dataset = dataset.map(_parse_function)
    iterator = iter(dataset)
    next_element = iterator.get_next()
    return next_element

I was able to track the issue by reading the TensorFlow documentation: https://www.tensorflow.org/guide/effective_tf2

Upvotes: 10

Related Questions