tensorflow / recommenders

TensorFlow Recommenders is a library for building recommender system models using TensorFlow.
Apache License 2.0
1.84k stars 275 forks source link

Plotting model using keras #270

Open vijender412 opened 3 years ago

vijender412 commented 3 years ago

Hi Everyone, I am new to tensorflow and tensorflow recommenders. I have tried DCN and other architectures. When I am trying to plot using tf.keras.utils.plot_model(model, "mymodel.png", show_shapes=False) It only shows model name not the complete diagram.

I am trying below code `class DCN(tfrs.Model):

def init(self, use_cross_layer, deep_layer_sizes, projection_dim=None): super().init()

self.embedding_dimension = 32

str_features = ["movie_id", "user_id", "user_zip_code",
                "user_occupation_text"]
int_features = ["user_gender", "bucketized_user_age"]

self._all_features = str_features + int_features
self._embeddings = {}

# Compute embeddings for string features.
for feature_name in str_features:
  vocabulary = vocabularies[feature_name]
  self._embeddings[feature_name] = tf.keras.Sequential(
      [tf.keras.layers.experimental.preprocessing.StringLookup(
          vocabulary=vocabulary, mask_token=None),
       tf.keras.layers.Embedding(len(vocabulary) + 1,
                                 self.embedding_dimension)
])

# Compute embeddings for int features.
for feature_name in int_features:
  vocabulary = vocabularies[feature_name]
  self._embeddings[feature_name] = tf.keras.Sequential(
      [tf.keras.layers.experimental.preprocessing.IntegerLookup(
          vocabulary=vocabulary, mask_value=None),
       tf.keras.layers.Embedding(len(vocabulary) + 1,
                                 self.embedding_dimension)
])

if use_cross_layer:
  self._cross_layer = tfrs.layers.dcn.Cross(
      projection_dim=projection_dim,
      kernel_initializer="glorot_uniform")
else:
  self._cross_layer = None

self._deep_layers = [tf.keras.layers.Dense(layer_size, activation="relu")
  for layer_size in deep_layer_sizes]

self._logit_layer = tf.keras.layers.Dense(1)

self.task = tfrs.tasks.Ranking(
  loss=tf.keras.losses.MeanSquaredError(),
  metrics=[tf.keras.metrics.RootMeanSquaredError("RMSE")]
)

def call(self, features):

Concatenate embeddings

embeddings = []
for feature_name in self._all_features:
  embedding_fn = self._embeddings[feature_name]
  embeddings.append(embedding_fn(features[feature_name]))

x = tf.concat(embeddings, axis=1)

# Build Cross Network
if self._cross_layer is not None:
  x = self._cross_layer(x)

# Build Deep Network
for deep_layer in self._deep_layers:
  x = deep_layer(x)

return self._logit_layer(x)

def compute_loss(self, features, training=False): labels = features.pop("user_rating") scores = self(features) return self.task( labels=labels, predictions=scores, )`

Can anyone help in this. I am able to see summary but not the diagram.

YannisPap commented 3 years ago

The plotting of Keras models created with the Models API (by subclassing the Model class, in other words) does not work out of the box. You can find an existing discussion and some workarounds (which I haven't tried, and I don't know if they work) here: https://stackoverflow.com/questions/61427583/how-do-i-plot-a-keras-tensorflow-subclassing-api-model