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