tensorflow / tensorflow/recommenders

BruteForce layer cannot be built with tf.string identifiers

Open
#753 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
2k
Forks
300
PR merge metrics
No merged PRs in 30d

Description

Currently, on version 0.7.3 BruteForce within layers.factorized_top_k cannot be built with identifiers of type tf.string.

Simple example that works with identifiers as tf.int64

tfrs.layers.factorized_top_k.BruteForce(k=10).index(candidates=tf.random.normal((200,100)), identifiers=tf.constant([_ for _ in range(200)], dtype=tf.int64))

Simple example that does not work throwing an error when creating variables in the background

tfrs.layers.factorized_top_k.BruteForce(k=10).index(candidates=tf.random.normal((200,100)), identifiers=tf.constant([str(_) for _ in range(200)], dtype=tf.string))

Full trace here

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[25], line 1
----> 1 tfrs.layers.factorized_top_k.BruteForce(k=10).index(candidates=tf.random.normal((200,100)), identifiers=tf.constant([str(_) for _ in range(200)], dtype=tf.string))

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/tensorflow_recommenders/layers/factorized_top_k.py:550](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/tensorflow_recommenders/layers/factorized_top_k.py#line=549), in BruteForce.index(self, candidates, identifiers)
    547 # We need any value that has the correct dtype.
    548 identifiers_initial_value = tf.zeros((), dtype=identifiers.dtype)
--> 550 self._identifiers = self.add_weight(
    551     name="identifiers",
    552     dtype=identifiers.dtype,
    553     shape=identifiers.shape,
    554     initializer=tf.keras.initializers.Constant(
    555         value=identifiers_initial_value),
    556     trainable=False)
    557 self._candidates = self.add_weight(
    558     name="candidates",
    559     dtype=candidates.dtype,
    560     shape=candidates.shape,
    561     initializer=tf.keras.initializers.Zeros(),
    562     trainable=False)
    564 self._identifiers.assign(identifiers)

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/layers/layer.py:546](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/layers/layer.py#line=545), in Layer.add_weight(self, shape, initializer, dtype, trainable, autocast, regularizer, constraint, aggregation, name)
    544 initializer = initializers.get(initializer)
    545 with backend.name_scope(self.name, caller=self):
--> 546     variable = backend.Variable(
    547         initializer=initializer,
    548         shape=shape,
    549         dtype=dtype,
    550         trainable=trainable,
    551         autocast=autocast,
    552         aggregation=aggregation,
    553         name=name,
    554     )
    555 # Will be added to layer.losses
    556 variable.regularizer = regularizers.get(regularizer)

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/common/variables.py:186](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/common/variables.py#line=185), in Variable.__init__(self, initializer, shape, dtype, trainable, autocast, aggregation, name)
    184 if callable(initializer):
    185     self._shape = self._validate_shape(shape)
--> 186     self._initialize_with_initializer(initializer)
    187 else:
    188     self._initialize(initializer)

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py:48](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py#line=47), in Variable._initialize_with_initializer(self, initializer)
     47 def _initialize_with_initializer(self, initializer):
---> 48     self._initialize(lambda: initializer(self._shape, dtype=self._dtype))

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py:39](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py#line=38), in Variable._initialize(self, value)
     38 def _initialize(self, value):
---> 39     self._value = tf.Variable(
     40         value,
     41         dtype=self._dtype,
     42         trainable=self.trainable,
     43         name=self.name,
     44         aggregation=self._map_aggregation(self.aggregation),
     45     )

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/tensorflow/python/util/traceback_utils.py:153](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/tensorflow/python/util/traceback_utils.py#line=152), in filter_traceback.<locals>.error_handler(*args, **kwargs)
    151 except Exception as e:
    152   filtered_tb = _process_traceback_frames(e.__traceback__)
--> 153   raise e.with_traceback(filtered_tb) from None
    154 finally:
    155   del filtered_tb

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py:48](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py#line=47), in Variable._initialize_with_initializer.<locals>.<lambda>()
     47 def _initialize_with_initializer(self, initializer):
---> 48     self._initialize(lambda: initializer(self._shape, dtype=self._dtype))

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/initializers/constant_initializers.py:36](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/initializers/constant_initializers.py#line=35), in Constant.__call__(self, shape, dtype)
     34 def __call__(self, shape, dtype=None):
     35     dtype = standardize_dtype(dtype)
---> 36     return ops.cast(self.value, dtype=dtype) * ops.ones(
     37         shape=shape, dtype=dtype
     38     )

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/ops/numpy.py:6589](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/ops/numpy.py#line=6588), in ones(shape, dtype)
   6578 @keras_export(["keras.ops.ones", "keras.ops.numpy.ones"])
   6579 def ones(shape, dtype=None):
   6580     """Return a new tensor of given shape and type, filled with ones.
   6581 
   6582     Args:
   (...)
   6587         Tensor of ones with the given shape and dtype.
   6588     """
-> 6589     return backend.numpy.ones(shape, dtype=dtype)

File [~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/numpy.py:704](http://localhost:8888/lab/tree/~/dev/scratchpad/factorized_top_k_debugging/.venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/numpy.py#line=703), in ones(shape, dtype)
    702 def ones(shape, dtype=None):
    703     dtype = dtype or config.floatx()
--> 704     return tf.ones(shape, dtype=dtype)

TypeError: Cannot convert 1 to EagerTensor of dtype string

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in tensorflow_recommenders/layers/factorized_top_k.py at BruteForce.index, where the issue trace shows identifiers are initialized. Reproduce the integer and string examples, then verify that string identifiers can be indexed without the reported TypeError and that the resulting lookup still works.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, tensorflow
Domain
machine-learning
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.