Reputation: 151
I am new to tensorflow and trying to learn it. Trying to run an estimator LinearClassifier in Tensorflow 2.2.0.
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)
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']
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
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:
/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
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