个性化推荐第三部分:推荐过程(完结撒花)
代码来自于知乎:https://zhuanlan.zhihu.com/p/32078473
/代码地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.ipynb
-------------------------------------------------------------------------------------------------------------------------------
前面我们已经进行了数据预处理与模型训练,并且已经将模型进行了存储,所以我们这里调用我们已经训练好的模型进行推荐即可。
1、首先,抛开这个实战代码过程,先介绍一下tensorflow模型的恢复,这里我主要参考这篇文章,对于tensorflow模型的保存与恢复写的很清楚 :https://www.cnblogs.com/hejunlin1992/p/7767912.html
针对这个实战代码,提取出其恢复模型的代码进行记录:
loaded_graph = tf.Graph() #1、新建一个在这段代码中的graph
with tf.Session(graph=loaded_graph) as sess: #2、在session中引入这个图
# 3、Load saved model导入已经训练好的模型
loader = tf.train.import_meta_graph(load_dir + '.meta')#3.1、由于模型已经保存在meta文件中,这里import该文件来创建网络
loader.restore(sess, load_dir)#3.2、加载参数:通过调用restore函数来恢复网络的参数
# 4、Get Tensors from loaded model
# 要恢复这个网络,不仅需要恢复图(graph)和权重,也需要准备一个新的feed_dict,将新的训练数据喂给网络。
#我们可以通过使用graph.get_tensor_by_name()方法来获得已经保存的操作(operations)和placeholder variables。
#为后续feed做准备
uid, user_gender, user_age, user_job, movie_id, movie_categories, movie_titles, targets, lr, dropout_keep_prob, _, movie_combine_layer_flat, __ = get_tensors(loaded_graph) #loaded_graph
2、下面是实战代码的笔记部分:
由于我没有仔细看每一部分中用到了那些库,所以把前面有的库基本上都粘过来了。
均建议copy到自己的编辑器上查看~
import tensorflow as tf
import os
import pickle
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
from collections import Counter
import re
from tensorflow.python.ops import math_ops
import random
import matplotlib.pyplot as plt
import time
import datetime
def load_params():
"""
Load parameters from file
"""
return pickle.load(open('params.p', mode='rb'))
load_dir = load_params()#从文件中导入参数
#-----------这里要从前一个文件copy过来参数,因为这部分不在graph和session中的模型参数中-------
#从本地读取数据
title_count, title_set, genres2int, features, targets_values, ratings, users, movies, data, movies_orig, users_orig = pickle.load(open('preprocess.p', mode='rb'))
#嵌入矩阵的维度:一个单词或其他变量的特征表示
embed_dim = 32
#features为
# [ [1, 1193, 0, ..., 10,list([ title]),list([ genres])],
# [2, 1193, 1, ..., 16,list([ ]),list([ ])],
# [12, 1193, 1, ..., 12,list([ ]),list([ ])],
# ...,
# [5938, 2909, 1, ..., 1,list([ ]),list([ ])]
# ]
#用户ID个数
uid_max = max(features.take(0,1)) + 1 # 6040
#features.take(0,1)得到userid的全部列,由于从0开始编号,则max取最大值再加1可以得到用户id个数
#ndarray.take(indices, axis=None, out=None, mode='raise')从轴axis上获取数组中的元素,并以一维数组或者矩阵返回
#按axis选择处于indices位置上的值
#axis用于选择值的轴,0为横轴,1为纵向选
#如features.take(0,0)就会选择横向第一条数据,(1,0)会选择横向第二条数据
#性别个数
gender_max = max(features.take(2,1)) + 1 # 1 + 1 = 2
#年龄类别个数
age_max = max(features.take(3,1)) + 1 # 6 + 1 = 7
#职业个数
job_max = max(features.take(4,1)) + 1# 20 + 1 = 21
#电影ID个数
movie_id_max = max(features.take(1,1)) + 1 # 3952
#电影类型个数
movie_categories_max = max(genres2int.values()) + 1 # 18 + 1 = 19
#电影名单词个数
movie_title_max = len(title_set) # 5216
# title_set是由空格分开的电影单词字符串构成的列表(set表)
#对电影类型嵌入向量做加和操作的标志,后面调用combiner来使用作为参数
combiner = "sum"
#电影名长度
sentences_size = title_count # title_count=15重命名,一个电影title字段的长度