程世东老师TensorFlow实战——个性化推荐,代码学习笔记之②模型训练与测试

本文为程世东老师的TensorFlow实战系列,聚焦个性化推荐系统的模型训练过程。内容包括模型结构介绍及代码学习笔记,数据预处理后的训练数据已保存,可直接进行模型训练。详细步骤和说明参考原文链接。
摘要由CSDN通过智能技术生成

个性化推荐第二部分:模型训练

代码来自于知乎:https://zhuanlan.zhihu.com/p/32078473

/代码地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.ipynb

前面数据预处理已经将训练好的数据保存在proprecess.p文件中,这里直接引用(从本地读取)即可,不用每次都跑一遍模型预处理过程

具体描述过程请参加原博(上面链接)

import tensorflow as tf
import os
import pickle

import matplotlib.pyplot as plt
import time
import datetime

def save_params(params):
    """
    Save parameters to file
    """
    pickle.dump(params, open('params.p', 'wb'))


def load_params():
    """
    Load parameters from file
    """
    return pickle.load(open('params.p', mode='rb'))
    
#从本地读取数据
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字段的长度,不够会补
#文本卷积滑动窗口,分别滑动2, 3, 4, 5个单词
window_sizes = {2, 3, 4, 5}
#文本卷积核数量
filter_num = 8

#电影ID转下标的字典,注意数据集中电影ID跟下标不一致,比如第5行的数据电影ID不一定是5
movieid2idx = {val[0]:i for i, val in enumerate(movies.values)} #格式为{movieid :i}
                                                                #1:0,2:1,...

#超参-----------------------------------------------
# Number of Epochs
num_epochs = 5
# Batch Size
batch_size = 256

dropout_keep = 0.5
# Learning Rate
learning_rate = 0.0001
# Show stats for every n number of batches
show_every_n_batches = 20
#后面要保存模型的地址参数赋给变量save_dir
save_dir = './save'

#输入-----------------------------------------------
#定义输入的占位符
def get_inputs():
    #tf.placeholder(dtype, shape=None, name=None)此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值
    #dtype:数据类型
    #shape:数据形状。默认是None,[行数,列数]
    #name:名称
    uid = tf.placeholder(tf.int32, [None, 1], name="uid") #这里一行代表一个用户的id,是batch×1,每一行是一个列表
    user_gender = tf.placeholder(tf.int32, [None, 1], name="user_gender")
    user_age = tf.placeholder(tf.int32, [None, 1], name="user_age")
    user_job = tf.placeholder(tf.int32, [None, 1], name="user_job")
    
    movie_id = tf.placeholder(tf.int32, [None, 1], name="movie_id")
    movie_categories = tf.placeholder(tf.int32, [None, 18], name="movie_categories")
    movie_titles = tf.placeholder(tf.int32, [None, 15], name="movie_titles")
    
    targets = tf.placeholder(tf.int32, [None, 1], name="targets")
    LearningRate = tf.placeholder(tf.float32, name = "LearningRate")
    dropout_keep_prob = tf.placeholder(tf.float32, name = "dropout_keep_prob")
    return uid, user_gender, user_age, user_job, movie_id, movie_categories, movie_titles, targets, LearningRate, dropout_keep_prob

#构建神经网络---------------------------------------
#定义User的嵌入矩阵,完成原始矩阵经过嵌入层后得到的输出
def get_user_embedding(uid, user_gender, user_age, user_job): #见作者结构图,用户嵌入矩阵输入4个
    with tf.name_scope("user_embedding"):    #用于后面tensorboard可视化图层关系
        #用户id
        uid_embed_matrix = tf.Variable(tf.random_uniform([uid_max, embed_dim], -1, 1), name = "uid_embed_matrix")
                            #tf.Variable(initializer,name):initializer是初始化参数,可以有tf.random_normal,tf.constant等,name是变量的名字
                            #tf.random_uniform(shape, minval=0,maxval=None,dtype=tf.float32) 从均匀分布中输出随机值。
                            #返回shape形状矩阵:用户数×特征数,产生于low(-1)和high(1)之间,产生的值是均匀分布的。
        uid_embed_layer = tf.nn.embedding_lookup(uid_embed_matrix, uid, name = "uid_embed_layer")
                            #tf.nn.embedding_lookup(tensor, id) 选取一个张量tensor里面索引id对应的元素
                            #选取uid_embed_matrix的用户id对应的某个用户id的向量
        
        #性别
        gender_embed_matrix = tf.Variable(tf.random_uniform([gender_max, embed_dim // 2], -1, 1), name= "gender_embed_matrix")
                            #这里特征数降一半
        gender_embed_layer = tf.nn.embedding_lookup(gender_embed_matrix, user_gender, name = "gender_embed_layer")
                            #选取gender_embed_matrix的用户性别对应的某个用户性别的向量
        
        #年龄
        age_embed_matrix = tf.Variable(tf.random_uniform([age_max, embed_dim // 2], -1, 1), name="age_embed_matrix")
        age_embed_layer = tf.nn.embedding_lookup(age_embed_matrix, user_age, name="age_embed_layer")
                            #选取age_embed_matrix的用户年龄对应的某个用户年龄的向量
        
        #job
        job_embed_matrix = tf.Variable(tf.random_uniform([job_max, embed_dim // 2], -1, 1), name = "job_embed_matrix")
        job_embed_layer = tf.nn.embedding_lookup(job_embed_matrix, user_job, name = "job_embed_layer")
                            #选取job_embed_matr
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值