tensorflow / ranking

Learning to Rank in TensorFlow
Apache License 2.0
2.74k stars 474 forks source link

ValueError: 'outputs' must be defined before the loop. #319

Closed kyledufrane closed 2 years ago

kyledufrane commented 2 years ago

Hi TF Team,

I'm trying to build a model using the below code and am getting the error in the subject line. Any ideas on what I may be doing wrong?

scorer = tfr.keras.model.DNNScorer(
    hidden_layer_dims=[64, 32, 16],
    output_units=1,
    activation=tf.nn.relu,
    use_batch_norm=True)

features = preprocess_features()
feature_cols = features['cols']

example_spec_ = {feat: tf.io.FixedLenFeature(shape=(1,),dtype=tf.float32) for feat in feature_cols}
label_spec_ = ('relevance_label', tf.io.FixedLenFeature(shape=(1,), dtype=tf.int64))

model_builder = tfr.keras.model.ModelBuilder(
    input_creator=tfr.keras.model.FeatureSpecInputCreator(
        context_feature_spec={},
        example_feature_spec=example_spec_),
    preprocessor=tfr.keras.model.PreprocessorWithSpec(),
    scorer=scorer,
    mask_feature_name="list_mask",
    name="model_builder")

model = model_builder.build()

dataset_hparams = tfr.keras.pipeline.DatasetHparams(
    train_input_pattern="tfrecord_1/train.gzip_tfrecord",
    valid_input_pattern="tfrecord_1/val.gzip_tfrecord",
    train_batch_size=32,
    valid_batch_size=32,
    list_size=50,
    dataset_reader=tf.data.TFRecordDataset)

dataset_builder = tfr.keras.pipeline.SimpleDatasetBuilder(
    {},
    example_spec_,
    mask_feature_name="example_list_mask",
    label_spec=label_spec_,
    hparams=dataset_hparams,
    sample_weight_spec=None)

ds_train = dataset_builder.build_train_dataset()

pipeline_hparams = tfr.keras.pipeline.PipelineHparams(
    model_dir="model",
    num_epochs=5,
    steps_per_epoch=1000,
    validation_steps=100,
    learning_rate=0.05,
    loss="approx_ndcg_loss")

ranking_pipeline = tfr.keras.pipeline.SimplePipeline(
    model_builder,
    dataset_builder=dataset_builder,
    hparams=pipeline_hparams)

ranking_pipeline.train_and_validate(verbose=1)

The full error output is:

WARNING:tensorflow:`tf.keras.callbacks.experimental.BackupAndRestore` endpoint is deprecated and will be removed in a future release. Please use `tf.keras.callbacks.BackupAndRestore`.

WARNING:tensorflow:`tf.keras.callbacks.experimental.BackupAndRestore` endpoint is deprecated and will be removed in a future release. Please use `tf.keras.callbacks.BackupAndRestore`.

Epoch 1/5

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [159], in <cell line: 1>()
----> 1 ranking_pipeline.train_and_validate(verbose=1)

File ~/.local/lib/python3.9/site-packages/tensorflow_ranking/python/keras/pipeline.py:606, in ModelFitPipeline.train_and_validate(self, verbose)
    601 # Move the following out of strategy.scope only after b/173547275 fixed.
    602 # Otherwise, MultiWorkerMirroredStrategy will fail.
    603 train_dataset, valid_dataset = (
    604     self._dataset_builder.build_train_dataset(),
    605     self._dataset_builder.build_valid_dataset())
--> 606 model.fit(
    607     x=train_dataset,
    608     epochs=self._hparams.num_epochs,
    609     steps_per_epoch=self._hparams.steps_per_epoch,
    610     validation_steps=self._hparams.validation_steps,
    611     validation_data=valid_dataset,
    612     callbacks=self.build_callbacks(),
    613     verbose=verbose)
    615 model_output_dir = strategy_utils.get_output_filepath(
    616     self._hparams.model_dir, strategy)
    617 self.export_saved_model(
    618     model,
    619     export_to=os.path.join(model_output_dir, "export/latest_model"))

File ~/anaconda3/envs/tensorflow/lib/python3.9/site-packages/keras/utils/traceback_utils.py:67, in filter_traceback.<locals>.error_handler(*args, **kwargs)
     65 except Exception as e:  # pylint: disable=broad-except
     66   filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67   raise e.with_traceback(filtered_tb) from None
     68 finally:
     69   del filtered_tb

File ~/anaconda3/envs/tensorflow/lib/python3.9/site-packages/tensorflow/python/framework/func_graph.py:1147, in func_graph_from_py_func.<locals>.autograph_handler(*args, **kwargs)
   1145 except Exception as e:  # pylint:disable=broad-except
   1146   if hasattr(e, "ag_error_metadata"):
-> 1147     raise e.ag_error_metadata.to_exception(e)
   1148   else:
   1149     raise

ValueError: in user code:

    File "/home/kyle/anaconda3/envs/tensorflow/lib/python3.9/site-packages/keras/engine/training.py", line 1057, in train_function  *
        for _ in tf.range(self._steps_per_execution):

    ValueError: 'outputs' must be defined before the loop.