How to save non-keras custom model in Tensorflow 2.0?

Viewed 42

GOAL

I read a paper of modeling directed and undirected relations for recommendation, and I tried to run code given by the paper. My goal is to save the model in files that I can use the model for prediction in a recommendation system.

ISSUE

The model is not code in standard keras model, so I can't use model.save() and other methods I could find on the Internet. In fact, it's defined as class UGRec(object). So I have no idea of how to save the trained model. How to save non-keras custom model in Tensorflow 2.0?

CODE

The custom model class:

class UGRec(object):
    def __init__(self,
                 element_counts,
                 embed_dim=64,
                 margin_major_inf=1.0,
                 margin_side_inf_d=1.0,
                 margin_side_inf_u=1.0,
                 embedding_index=None,
                 master_learning_rate=0.01,
                 ):
        self.n_users = element_counts[0]
        self.n_items = element_counts[1]
        self.space_size = int(len(embedding_index) / 2)
        self.embedding_index = embedding_index
        self.embed_dim = embed_dim
        self.margin_major_inf = margin_major_inf
        self.margin_side_inf_d = margin_side_inf_d
        self.margin_side_inf_u = margin_side_inf_u
        self.master_learning_rate = master_learning_rate

        self.cons_resize_neg = tf.constant(1.0, tf.float32, [N_NEGATIVE, EMBED_DIM])
        self.cons_resize_test = tf.constant(1.0, tf.float32, [ITEM_NUM, EMBED_DIM])

        self.dropout_istrain = tf.compat.v1.placeholder(tf.bool, shape=())
        self.user_positive_item_pairs = tf.compat.v1.placeholder(tf.int32, [None, None, 2])
        self.negative_samples = tf.compat.v1.placeholder(tf.int32, [None, None, None])
        self.test_user_ids = tf.compat.v1.placeholder(tf.int32, [None])
        self.test_item_ids = tf.compat.v1.placeholder(tf.int32, [None, ITEM_NUM])

        self.rels = tf.Variable(tf.random.normal([self.space_size, EMBED_DIM],
                                                 stddev=1 / (EMBED_DIM ** 0.5), dtype=tf.float32))
        self.rels_project = tf.Variable(tf.random.normal([self.space_size, EMBED_DIM],
                                                         stddev=1 / (EMBED_DIM ** 0.5), dtype=tf.float32))

        self.regu_losses = []
        self.vars = []
        self.element_embeddings = []
        self.element_embeddings_project = []

        self.element_embeddings.append(self.deploy_embeddings('user', self.n_users))
        self.element_embeddings.append(self.deploy_embeddings('item', self.n_items))

        for i in range(len(element_counts) - 2):
            self.element_embeddings.append(self.deploy_embeddings('sideinf_' + str(i), element_counts[i + 2]))
        self.element_embeddings_project.append(self.deploy_embeddings('user_proj_', self.n_users))
        self.element_embeddings_project.append(self.deploy_embeddings('item_user_proj_', self.n_items))
        for i in range(len(element_counts) - 2):
            self.element_embeddings_project.append(
                self.deploy_embeddings('sideinf_user_proj_' + str(i), element_counts[i + 2]))

        for i in range(len(element_counts)):
            self.vars.append(self.element_embeddings[i])
        for i in range(len(element_counts)):
            self.vars.append(self.element_embeddings_project[i])

        self.vars.append(self.rels)
        self.vars.append(self.rels_project)

        self.loss = self.deploy_loss()
        self.test_process = self.deploy_test_process()
        self.optimize

Define model in __ main __:

model = UGRec(element_counts,
                  embed_dim=EMBED_DIM,
                  embedding_index=[0, 1, 1, 2, 1, 3, 1, 1, 1, 1],
                  margin_major_inf=margins[0],
                  margin_side_inf_d=margins[1],
                  margin_side_inf_u=margins[2],
                  master_learning_rate=args.lr
                  )

More detail code could be seen in https://github.com/garfieldcat1985/ugrec/blob/main/ugrec.py

Environment

  • Python 3.7.12
  • Tensorflow 2.1.0
0 Answers
Related