日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

TensorFlow实战——深度学习训练个性化推荐系统

發(fā)布時(shí)間:2025/3/11 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow实战——深度学习训练个性化推荐系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

請安裝TensorFlow1.0,Python3.5
項(xiàng)目地址:https://github.com/xiaobingchan/movie_recommender

前言
本項(xiàng)目使用文本卷積神經(jīng)網(wǎng)絡(luò),并使用MovieLens數(shù)據(jù)集完成電影推薦的任務(wù)。
推薦系統(tǒng)在日常的網(wǎng)絡(luò)應(yīng)用中無處不在,比如網(wǎng)上購物、網(wǎng)上買書、新聞app、社交網(wǎng)絡(luò)、音樂網(wǎng)站、電影網(wǎng)站等等等等,有人的地方就有推薦。根據(jù)個(gè)人的喜好,相同喜好人群的習(xí)慣等信息進(jìn)行個(gè)性化的內(nèi)容推薦。比如打開新聞?lì)惖腶pp,因?yàn)橛辛藗€(gè)性化的內(nèi)容,每個(gè)人看到的新聞首頁都是不一樣的。
這當(dāng)然是很有用的,在信息爆炸的今天,獲取信息的途徑和方式多種多樣,人們花費(fèi)時(shí)間最多的不再是去哪獲取信息,而是要在眾多的信息中尋找自己感興趣的,這就是信息超載問題。為了解決這個(gè)問題,推薦系統(tǒng)應(yīng)運(yùn)而生。
協(xié)同過濾是推薦系統(tǒng)應(yīng)用較廣泛的技術(shù),該方法搜集用戶的歷史記錄、個(gè)人喜好等信息,計(jì)算與其他用戶的相似度,利用相似用戶的評價(jià)來預(yù)測目標(biāo)用戶對特定項(xiàng)目的喜好程度。優(yōu)點(diǎn)是會給用戶推薦未瀏覽過的項(xiàng)目,缺點(diǎn)呢,對于新用戶來說,沒有任何與商品的交互記錄和個(gè)人喜好等信息,存在冷啟動(dòng)問題,導(dǎo)致模型無法找到相似的用戶或商品。
為了解決冷啟動(dòng)的問題,通常的做法是對于剛注冊的用戶,要求用戶先選擇自己感興趣的話題、群組、商品、性格、喜歡的音樂類型等信息,比如豆瓣FM:


先來看看數(shù)據(jù)
本項(xiàng)目使用的是MovieLens 1M 數(shù)據(jù)集,包含6000個(gè)用戶在近4000部電影上的1億條評論。
數(shù)據(jù)集分為三個(gè)文件:用戶數(shù)據(jù)users.dat,電影數(shù)據(jù)movies.dat和評分?jǐn)?shù)據(jù)ratings.dat。

用戶數(shù)據(jù)
分別有用戶ID、性別、年齡、職業(yè)ID和郵編等字段。

數(shù)據(jù)中的格式:UserID::Gender::Age::Occupation::Zip-code

Gender is denoted by a “M” for male and “F” for female
Age is chosen from the following ranges:

1: “Under 18”
18: “18-24”
25: “25-34”
35: “35-44”
45: “45-49”
50: “50-55”
56: “56+”
Occupation is chosen from the following choices:

0: “other” or not specified
1: “academic/educator”
2: “artist”
3: “clerical/admin”
4: “college/grad student”
5: “customer service”
6: “doctor/health care”
7: “executive/managerial”
8: “farmer”
9: “homemaker”
10: “K-12 student”
11: “l(fā)awyer”
12: “programmer”
13: “retired”
14: “sales/marketing”
15: “scientist”
16: “self-employed”
17: “technician/engineer”
18: “tradesman/craftsman”
19: “unemployed”
20: “writer”

其中UserID、Gender、Age和Occupation都是類別字段,其中郵編字段是我們不使用的。
電影數(shù)據(jù)
分別有電影ID、電影名和電影風(fēng)格等字段。

數(shù)據(jù)中的格式:MovieID::Title::Genres

Titles are identical to titles provided by the IMDB (including
year of release)
Genres are pipe-separated and are selected from the following genres:

Action
Adventure
Animation
Children’s
Comedy
Crime
Documentary
Drama
Fantasy
Film-Noir
Horror
Musical
Mystery
Romance
Sci-Fi
Thriller
War
Western

MovieID是類別字段,Title是文本,Genres也是類別字段
評分?jǐn)?shù)據(jù)
分別有用戶ID、電影ID、評分和時(shí)間戳等字段。

數(shù)據(jù)中的格式:UserID::MovieID::Rating::Timestamp

UserIDs range between 1 and 6040
MovieIDs range between 1 and 3952
Ratings are made on a 5-star scale (whole-star ratings only)
Timestamp is represented in seconds since the epoch as returned by time(2)
Each user has at least 20 ratings

評分字段Rating就是我們要學(xué)習(xí)的targets,時(shí)間戳字段我們不使用。
說說數(shù)據(jù)預(yù)處理
UserID、Occupation和MovieID不用變。
Gender字段:需要將‘F’和‘M’轉(zhuǎn)換成0和1。
Age字段:要轉(zhuǎn)成7個(gè)連續(xù)數(shù)字0~6。
Genres字段:是分類字段,要轉(zhuǎn)成數(shù)字。首先將Genres中的類別轉(zhuǎn)成字符串到數(shù)字的字典,然后再將每個(gè)電影的Genres字段轉(zhuǎn)成數(shù)字列表,因?yàn)橛行╇娪笆嵌鄠€(gè)Genres的組合。
Title字段:處理方式跟Genres字段一樣,首先創(chuàng)建文本到數(shù)字的字典,然后將Title中的描述轉(zhuǎn)成數(shù)字的列表。另外Title中的年份也需要去掉。
Genres和Title字段需要將長度統(tǒng)一,這樣在神經(jīng)網(wǎng)絡(luò)中方便處理。空白部分用‘< PAD >’對應(yīng)的數(shù)字填充。
數(shù)據(jù)預(yù)處理的代碼可以在項(xiàng)目中找到:load_data函數(shù)

模型設(shè)計(jì)

通過研究數(shù)據(jù)集中的字段類型,我們發(fā)現(xiàn)有一些是類別字段,通常的處理是將這些字段轉(zhuǎn)成one hot編碼,但是像UserID、MovieID這樣的字段就會變成非常的稀疏,輸入的維度急劇膨脹,這是我們不愿意見到的,畢竟我這小筆記本不像大廠動(dòng)輒能處理數(shù)以億計(jì)維度的輸入:)
所以在預(yù)處理數(shù)據(jù)時(shí)將這些字段轉(zhuǎn)成了數(shù)字,我們用這個(gè)數(shù)字當(dāng)做嵌入矩陣的索引,在網(wǎng)絡(luò)的第一層使用了嵌入層,維度是(N,32)和(N,16)。
電影類型的處理要多一步,有時(shí)一個(gè)電影有多個(gè)電影類型,這樣從嵌入矩陣索引出來是一個(gè)(n,32)的矩陣,因?yàn)橛卸鄠€(gè)類型嘛,我們要將這個(gè)矩陣求和,變成(1,32)的向量。
電影名的處理比較特殊,沒有使用循環(huán)神經(jīng)網(wǎng)絡(luò),而是用了文本卷積網(wǎng)絡(luò),下文會進(jìn)行說明。
從嵌入層索引出特征以后,將各特征傳入全連接層,將輸出再次傳入全連接層,最終分別得到(1,200)的用戶特征和電影特征兩個(gè)特征向量。
我們的目的就是要訓(xùn)練出用戶特征和電影特征,在實(shí)現(xiàn)推薦功能時(shí)使用。得到這兩個(gè)特征以后,就可以選擇任意的方式來擬合評分了。我使用了兩種方式,一個(gè)是上圖中畫出的將兩個(gè)特征做向量乘法,將結(jié)果與真實(shí)評分做回歸,采用MSE優(yōu)化損失。因?yàn)楸举|(zhì)上這是一個(gè)回歸問題,另一種方式是,將兩個(gè)特征作為輸入,再次傳入全連接層,輸出一個(gè)值,將輸出值回歸到真實(shí)評分,采用MSE優(yōu)化損失。
實(shí)際上第二個(gè)方式的MSE loss在0.8附近,第一個(gè)方式在1附近,5次迭代的結(jié)果。

文本卷積網(wǎng)絡(luò)
網(wǎng)絡(luò)看起來像下面這樣

圖片來自Kim Yoon的論文:Convolutional Neural Networks for Sentence Classification

將卷積神經(jīng)網(wǎng)絡(luò)用于文本的文章建議你閱讀Understanding Convolutional Neural Networks for NLP
網(wǎng)絡(luò)的第一層是詞嵌入層,由每一個(gè)單詞的嵌入向量組成的嵌入矩陣。下一層使用多個(gè)不同尺寸(窗口大小)的卷積核在嵌入矩陣上做卷積,窗口大小指的是每次卷積覆蓋幾個(gè)單詞。這里跟對圖像做卷積不太一樣,圖像的卷積通常用2x2、3x3、5x5之類的尺寸,而文本卷積要覆蓋整個(gè)單詞的嵌入向量,所以尺寸是(單詞數(shù),向量維度),比如每次滑動(dòng)3個(gè),4個(gè)或者5個(gè)單詞。第三層網(wǎng)絡(luò)是max pooling得到一個(gè)長向量,最后使用dropout做正則化,最終得到了電影Title的特征。

核心代碼講解
完整代碼請見項(xiàng)目

#嵌入矩陣的維度
embed_dim = 32
#用戶ID個(gè)數(shù)
uid_max = max(features.take(0,1)) + 1 # 6040
#性別個(gè)數(shù)
gender_max = max(features.take(2,1)) + 1 # 1 + 1 = 2
#年齡類別個(gè)數(shù)
age_max = max(features.take(3,1)) + 1 # 6 + 1 = 7
#職業(yè)個(gè)數(shù)
job_max = max(features.take(4,1)) + 1# 20 + 1 = 21

#電影ID個(gè)數(shù)
movie_id_max = max(features.take(1,1)) + 1 # 3952
#電影類型個(gè)數(shù)
movie_categories_max = max(genres2int.values()) + 1 # 18 + 1 = 19
#電影名單詞個(gè)數(shù)
movie_title_max = len(title_set) # 5216

#對電影類型嵌入向量做加和操作的標(biāo)志,考慮過使用mean做平均,但是沒實(shí)現(xiàn)mean
combiner = "sum"

#電影名長度
sentences_size = title_count # = 15
#文本卷積滑動(dòng)窗口,分別滑動(dòng)2, 3, 4, 5個(gè)單詞
window_sizes = {2, 3, 4, 5}
#文本卷積核數(shù)量
filter_num = 8

#電影ID轉(zhuǎn)下標(biāo)的字典,數(shù)據(jù)集中電影ID跟下標(biāo)不一致,比如第5行的數(shù)據(jù)電影ID不一定是5
movieid2idx = {val[0]:i for i, val in enumerate(movies.values)}


超參
# 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'


輸入
定義輸入的占位符

def get_inputs():
? ? uid = tf.placeholder(tf.int32, [None, 1], name="uid")
? ? 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


構(gòu)建神經(jīng)網(wǎng)絡(luò)
定義User的嵌入矩陣
def get_user_embedding(uid, user_gender, user_age, user_job):
? ? with tf.name_scope("user_embedding"):
? ? ? ? uid_embed_matrix = tf.Variable(tf.random_uniform([uid_max, embed_dim], -1, 1), name = "uid_embed_matrix")
? ? ? ? uid_embed_layer = tf.nn.embedding_lookup(uid_embed_matrix, uid, name = "uid_embed_layer")

? ? ? ? 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")

? ? ? ? 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")

? ? ? ? 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")
? ? return uid_embed_layer, gender_embed_layer, age_embed_layer, job_embed_layer


將User的嵌入矩陣一起全連接生成User的特征
def get_user_feature_layer(uid_embed_layer, gender_embed_layer, age_embed_layer, job_embed_layer):
? ? with tf.name_scope("user_fc"):
? ? ? ? #第一層全連接
? ? ? ? uid_fc_layer = tf.layers.dense(uid_embed_layer, embed_dim, name = "uid_fc_layer", activation=tf.nn.relu)
? ? ? ? gender_fc_layer = tf.layers.dense(gender_embed_layer, embed_dim, name = "gender_fc_layer", activation=tf.nn.relu)
? ? ? ? age_fc_layer = tf.layers.dense(age_embed_layer, embed_dim, name ="age_fc_layer", activation=tf.nn.relu)
? ? ? ? job_fc_layer = tf.layers.dense(job_embed_layer, embed_dim, name = "job_fc_layer", activation=tf.nn.relu)

? ? ? ? #第二層全連接
? ? ? ? user_combine_layer = tf.concat([uid_fc_layer, gender_fc_layer, age_fc_layer, job_fc_layer], 2) ?#(?, 1, 128)
? ? ? ? user_combine_layer = tf.contrib.layers.fully_connected(user_combine_layer, 200, tf.tanh) ?#(?, 1, 200)

? ? ? ? user_combine_layer_flat = tf.reshape(user_combine_layer, [-1, 200])
? ? return user_combine_layer, user_combine_layer_flat


定義Movie ID的嵌入矩陣
def get_movie_id_embed_layer(movie_id):
? ? with tf.name_scope("movie_embedding"):
? ? ? ? movie_id_embed_matrix = tf.Variable(tf.random_uniform([movie_id_max, embed_dim], -1, 1), name = "movie_id_embed_matrix")
? ? ? ? movie_id_embed_layer = tf.nn.embedding_lookup(movie_id_embed_matrix, movie_id, name = "movie_id_embed_layer")
? ? return movie_id_embed_layer


對電影類型的多個(gè)嵌入向量做加和
def get_movie_categories_layers(movie_categories):
? ? with tf.name_scope("movie_categories_layers"):
? ? ? ? movie_categories_embed_matrix = tf.Variable(tf.random_uniform([movie_categories_max, embed_dim], -1, 1), name = "movie_categories_embed_matrix")
? ? ? ? movie_categories_embed_layer = tf.nn.embedding_lookup(movie_categories_embed_matrix, movie_categories, name = "movie_categories_embed_layer")
? ? ? ? if combiner == "sum":
? ? ? ? ? ? movie_categories_embed_layer = tf.reduce_sum(movie_categories_embed_layer, axis=1, keep_dims=True)
? ? # ? ? elif combiner == "mean":

? ? return movie_categories_embed_layer


Movie Title的文本卷積網(wǎng)絡(luò)實(shí)現(xiàn)
def get_movie_cnn_layer(movie_titles):
? ? #從嵌入矩陣中得到電影名對應(yīng)的各個(gè)單詞的嵌入向量
? ? with tf.name_scope("movie_embedding"):
? ? ? ? movie_title_embed_matrix = tf.Variable(tf.random_uniform([movie_title_max, embed_dim], -1, 1), name = "movie_title_embed_matrix")
? ? ? ? movie_title_embed_layer = tf.nn.embedding_lookup(movie_title_embed_matrix, movie_titles, name = "movie_title_embed_layer")
? ? ? ? movie_title_embed_layer_expand = tf.expand_dims(movie_title_embed_layer, -1)

? ? #對文本嵌入層使用不同尺寸的卷積核做卷積和最大池化
? ? pool_layer_lst = []
? ? for window_size in window_sizes:
? ? ? ? with tf.name_scope("movie_txt_conv_maxpool_{}".format(window_size)):
? ? ? ? ? ? filter_weights = tf.Variable(tf.truncated_normal([window_size, embed_dim, 1, filter_num],stddev=0.1),name = "filter_weights")
? ? ? ? ? ? filter_bias = tf.Variable(tf.constant(0.1, shape=[filter_num]), name="filter_bias")

? ? ? ? ? ? conv_layer = tf.nn.conv2d(movie_title_embed_layer_expand, filter_weights, [1,1,1,1], padding="VALID", name="conv_layer")
? ? ? ? ? ? relu_layer = tf.nn.relu(tf.nn.bias_add(conv_layer,filter_bias), name ="relu_layer")

? ? ? ? ? ? maxpool_layer = tf.nn.max_pool(relu_layer, [1,sentences_size - window_size + 1 ,1,1], [1,1,1,1], padding="VALID", name="maxpool_layer")
? ? ? ? ? ? pool_layer_lst.append(maxpool_layer)

? ? #Dropout層
? ? with tf.name_scope("pool_dropout"):
? ? ? ? pool_layer = tf.concat(pool_layer_lst, 3, name ="pool_layer")
? ? ? ? max_num = len(window_sizes) * filter_num
? ? ? ? pool_layer_flat = tf.reshape(pool_layer , [-1, 1, max_num], name = "pool_layer_flat")? ? ? ? dropout_layer = tf.nn.dropout(pool_layer_flat, dropout_keep_prob, name = "dropout_layer")
? ? return pool_layer_flat, dropout_layer

將Movie的各個(gè)層一起做全連接

def get_movie_feature_layer(movie_id_embed_layer, movie_categories_embed_layer, dropout_layer):with tf.name_scope("movie_fc"):#第一層全連接movie_id_fc_layer = tf.layers.dense(movie_id_embed_layer, embed_dim, name = "movie_id_fc_layer", activation=tf.nn.relu)movie_categories_fc_layer = tf.layers.dense(movie_categories_embed_layer, embed_dim, name = "movie_categories_fc_layer", activation=tf.nn.relu)#第二層全連接movie_combine_layer = tf.concat([movie_id_fc_layer, movie_categories_fc_layer, dropout_layer], 2) ?#(?, 1, 96)movie_combine_layer = tf.contrib.layers.fully_connected(movie_combine_layer, 200, tf.tanh) ?#(?, 1, 200)movie_combine_layer_flat = tf.reshape(movie_combine_layer, [-1, 200])return movie_combine_layer, movie_combine_layer_flat



構(gòu)建計(jì)算圖

tf.reset_default_graph() train_graph = tf.Graph() with train_graph.as_default():#獲取輸入占位符uid, user_gender, user_age, user_job, movie_id, movie_categories, movie_titles, targets, lr, dropout_keep_prob = get_inputs()#獲取User的4個(gè)嵌入向量uid_embed_layer, gender_embed_layer, age_embed_layer, job_embed_layer = get_user_embedding(uid, user_gender, user_age, user_job)#得到用戶特征user_combine_layer, user_combine_layer_flat = get_user_feature_layer(uid_embed_layer, gender_embed_layer, age_embed_layer, job_embed_layer)#獲取電影ID的嵌入向量movie_id_embed_layer = get_movie_id_embed_layer(movie_id)#獲取電影類型的嵌入向量movie_categories_embed_layer = get_movie_categories_layers(movie_categories)#獲取電影名的特征向量pool_layer_flat, dropout_layer = get_movie_cnn_layer(movie_titles)#得到電影特征movie_combine_layer, movie_combine_layer_flat = get_movie_feature_layer(movie_id_embed_layer,?movie_categories_embed_layer,?dropout_layer)#計(jì)算出評分,要注意兩個(gè)不同的方案,inference的名字(name值)是不一樣的,后面做推薦時(shí)要根據(jù)name取得tensorwith tf.name_scope("inference"):#將用戶特征和電影特征作為輸入,經(jīng)過全連接,輸出一個(gè)值的方案 # ? ? ? ? inference_layer = tf.concat([user_combine_layer_flat, movie_combine_layer_flat], 1) ?#(?, 200) # ? ? ? ? inference = tf.layers.dense(inference_layer, 1, # ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),? # ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kernel_regularizer=tf.nn.l2_loss, name="inference")#簡單的將用戶特征和電影特征做矩陣乘法得到一個(gè)預(yù)測評分inference = tf.matmul(user_combine_layer_flat, tf.transpose(movie_combine_layer_flat))? ? with tf.name_scope("loss"):# MSE損失,將計(jì)算值回歸到評分cost = tf.losses.mean_squared_error(targets, inference )loss = tf.reduce_mean(cost)# 優(yōu)化損失? # ? ? train_op = tf.train.AdamOptimizer(lr).minimize(loss) ?#costglobal_step = tf.Variable(0, name="global_step", trainable=False)optimizer = tf.train.AdamOptimizer(lr)gradients = optimizer.compute_gradients(loss) ?#costtrain_op = optimizer.apply_gradients(gradients, global_step=global_step)

訓(xùn)練網(wǎng)絡(luò)

%matplotlib inline %config InlineBackend.figure_format = 'retina' import matplotlib.pyplot as plt import time import datetimelosses = {'train':[], 'test':[]}with tf.Session(graph=train_graph) as sess:#搜集數(shù)據(jù)給tensorBoard用# Keep track of gradient values and sparsitygrad_summaries = []for g, v in gradients:if g is not None:grad_hist_summary = tf.summary.histogram("{}/grad/hist".format(v.name.replace(':', '_')), g)sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name.replace(':', '_')), tf.nn.zero_fraction(g))grad_summaries.append(grad_hist_summary)grad_summaries.append(sparsity_summary)grad_summaries_merged = tf.summary.merge(grad_summaries)# Output directory for models and summariestimestamp = str(int(time.time()))out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs", timestamp))print("Writing to {}\n".format(out_dir))# Summaries for loss and accuracyloss_summary = tf.summary.scalar("loss", loss)# Train Summariestrain_summary_op = tf.summary.merge([loss_summary, grad_summaries_merged])train_summary_dir = os.path.join(out_dir, "summaries", "train")train_summary_writer = tf.summary.FileWriter(train_summary_dir, sess.graph)# Inference summariesinference_summary_op = tf.summary.merge([loss_summary])inference_summary_dir = os.path.join(out_dir, "summaries", "inference")inference_summary_writer = tf.summary.FileWriter(inference_summary_dir, sess.graph)sess.run(tf.global_variables_initializer())saver = tf.train.Saver()for epoch_i in range(num_epochs):#將數(shù)據(jù)集分成訓(xùn)練集和測試集,隨機(jī)種子不固定train_X,test_X, train_y, test_y = train_test_split(features, ?targets_values, ?test_size = 0.2, ?random_state = 0) ?train_batches = get_batches(train_X, train_y, batch_size)test_batches = get_batches(test_X, test_y, batch_size)#訓(xùn)練的迭代,保存訓(xùn)練損失for batch_i in range(len(train_X) // batch_size):x, y = next(train_batches)categories = np.zeros([batch_size, 18])for i in range(batch_size):categories[i] = x.take(6,1)[i]titles = np.zeros([batch_size, sentences_size])for i in range(batch_size):titles[i] = x.take(5,1)[i]feed = {uid: np.reshape(x.take(0,1), [batch_size, 1]),user_gender: np.reshape(x.take(2,1), [batch_size, 1]),user_age: np.reshape(x.take(3,1), [batch_size, 1]),user_job: np.reshape(x.take(4,1), [batch_size, 1]),movie_id: np.reshape(x.take(1,1), [batch_size, 1]),movie_categories: categories, ?#x.take(6,1)movie_titles: titles, ?#x.take(5,1)targets: np.reshape(y, [batch_size, 1]),dropout_keep_prob: dropout_keep, #dropout_keeplr: learning_rate}step, train_loss, summaries, _ = sess.run([global_step, loss, train_summary_op, train_op], feed) ?#costlosses['train'].append(train_loss)train_summary_writer.add_summary(summaries, step) ?## Show every <show_every_n_batches> batchesif (epoch_i * (len(train_X) // batch_size) + batch_i) % show_every_n_batches == 0:time_str = datetime.datetime.now().isoformat()print('{}: Epoch {:>3} Batch {:>4}/{} ? train_loss = {:.3f}'.format(time_str,epoch_i,batch_i,(len(train_X) // batch_size),train_loss))#使用測試數(shù)據(jù)的迭代for batch_i ?in range(len(test_X) // batch_size):x, y = next(test_batches)categories = np.zeros([batch_size, 18])for i in range(batch_size):categories[i] = x.take(6,1)[i]titles = np.zeros([batch_size, sentences_size])for i in range(batch_size):titles[i] = x.take(5,1)[i]feed = {uid: np.reshape(x.take(0,1), [batch_size, 1]),user_gender: np.reshape(x.take(2,1), [batch_size, 1]),user_age: np.reshape(x.take(3,1), [batch_size, 1]),user_job: np.reshape(x.take(4,1), [batch_size, 1]),movie_id: np.reshape(x.take(1,1), [batch_size, 1]),movie_categories: categories, ?#x.take(6,1)movie_titles: titles, ?#x.take(5,1)targets: np.reshape(y, [batch_size, 1]),dropout_keep_prob: 1,lr: learning_rate}step, test_loss, summaries = sess.run([global_step, loss, inference_summary_op], feed) ?#cost#保存測試損失losses['test'].append(test_loss)inference_summary_writer.add_summary(summaries, step) ?#time_str = datetime.datetime.now().isoformat()if (epoch_i * (len(test_X) // batch_size) + batch_i) % show_every_n_batches == 0:print('{}: Epoch {:>3} Batch {:>4}/{} ? test_loss = {:.3f}'.format(time_str,epoch_i,batch_i,(len(test_X) // batch_size),test_loss))# Save Modelsaver.save(sess, save_dir) ?#, global_step=epoch_iprint('Model Trained and Saved')

在 TensorBoard 中查看可視化結(jié)果
獲取 Tensors

def get_tensors(loaded_graph):uid = loaded_graph.get_tensor_by_name("uid:0")user_gender = loaded_graph.get_tensor_by_name("user_gender:0")user_age = loaded_graph.get_tensor_by_name("user_age:0")user_job = loaded_graph.get_tensor_by_name("user_job:0")movie_id = loaded_graph.get_tensor_by_name("movie_id:0")movie_categories = loaded_graph.get_tensor_by_name("movie_categories:0")movie_titles = loaded_graph.get_tensor_by_name("movie_titles:0")targets = loaded_graph.get_tensor_by_name("targets:0")dropout_keep_prob = loaded_graph.get_tensor_by_name("dropout_keep_prob:0")lr = loaded_graph.get_tensor_by_name("LearningRate:0")#兩種不同計(jì)算預(yù)測評分的方案使用不同的name獲取tensor inference # ? ? inference = loaded_graph.get_tensor_by_name("inference/inference/BiasAdd:0")inference = loaded_graph.get_tensor_by_name("inference/MatMul:0")#movie_combine_layer_flat = loaded_graph.get_tensor_by_name("movie_fc/Reshape:0")user_combine_layer_flat = loaded_graph.get_tensor_by_name("user_fc/Reshape:0")return uid, user_gender, user_age, user_job, movie_id, movie_categories, movie_titles, targets, lr, dropout_keep_prob, inference, movie_combine_layer_flat, user_combine_layer_flat

指定用戶和電影進(jìn)行評分
這部分就是對網(wǎng)絡(luò)做正向傳播,計(jì)算得到預(yù)測的評分

def rating_movie(user_id_val, movie_id_val):loaded_graph = tf.Graph() ?#with tf.Session(graph=loaded_graph) as sess: ?## Load saved modelloader = tf.train.import_meta_graph(load_dir + '.meta')loader.restore(sess, load_dir)# Get Tensors from loaded modeluid, user_gender, user_age, user_job, movie_id, movie_categories, movie_titles, targets, lr, dropout_keep_prob, inference,_, __ = get_tensors(loaded_graph) ?#loaded_graphcategories = np.zeros([1, 18])categories[0] = movies.values[movieid2idx[movie_id_val]][2]titles = np.zeros([1, sentences_size])titles[0] = movies.values[movieid2idx[movie_id_val]][1]feed = {uid: np.reshape(users.values[user_id_val-1][0], [1, 1]),user_gender: np.reshape(users.values[user_id_val-1][1], [1, 1]),user_age: np.reshape(users.values[user_id_val-1][2], [1, 1]),user_job: np.reshape(users.values[user_id_val-1][3], [1, 1]),movie_id: np.reshape(movies.values[movieid2idx[movie_id_val]][0], [1, 1]),movie_categories: categories, ?#x.take(6,1)movie_titles: titles, ?#x.take(5,1)dropout_keep_prob: 1}# Get Predictioninference_val = sess.run([inference], feed) ?return (inference_val)


生成Movie特征矩陣
將訓(xùn)練好的電影特征組合成電影特征矩陣并保存到本地

loaded_graph = tf.Graph() ?# movie_matrics = [] with tf.Session(graph=loaded_graph) as sess: ?## Load saved modelloader = tf.train.import_meta_graph(load_dir + '.meta')loader.restore(sess, load_dir)# Get Tensors from loaded modeluid, 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_graphfor item in movies.values:categories = np.zeros([1, 18])categories[0] = item.take(2)titles = np.zeros([1, sentences_size])titles[0] = item.take(1)feed = {movie_id: np.reshape(item.take(0), [1, 1]),movie_categories: categories, ?#x.take(6,1)movie_titles: titles, ?#x.take(5,1)dropout_keep_prob: 1}movie_combine_layer_flat_val = sess.run([movie_combine_layer_flat], feed) ?movie_matrics.append(movie_combine_layer_flat_val)pickle.dump((np.array(movie_matrics).reshape(-1, 200)), open('movie_matrics.p', 'wb')) movie_matrics = pickle.load(open('movie_matrics.p', mode='rb'))

生成User特征矩陣
將訓(xùn)練好的用戶特征組合成用戶特征矩陣并保存到本地

loaded_graph = tf.Graph() ?# users_matrics = [] with tf.Session(graph=loaded_graph) as sess: ?## Load saved modelloader = tf.train.import_meta_graph(load_dir + '.meta')loader.restore(sess, load_dir)# Get Tensors from loaded modeluid, user_gender, user_age, user_job, movie_id, movie_categories, movie_titles, targets, lr, dropout_keep_prob, _, __,user_combine_layer_flat = get_tensors(loaded_graph) ?#loaded_graphfor item in users.values:feed = {uid: np.reshape(item.take(0), [1, 1]),user_gender: np.reshape(item.take(1), [1, 1]),user_age: np.reshape(item.take(2), [1, 1]),user_job: np.reshape(item.take(3), [1, 1]),dropout_keep_prob: 1}user_combine_layer_flat_val = sess.run([user_combine_layer_flat], feed) ?users_matrics.append(user_combine_layer_flat_val)pickle.dump((np.array(users_matrics).reshape(-1, 200)), open('users_matrics.p', 'wb')) users_matrics = pickle.load(open('users_matrics.p', mode='rb'))

開始推薦電影
使用生產(chǎn)的用戶特征矩陣和電影特征矩陣做電影推薦

推薦同類型的電影
思路是計(jì)算當(dāng)前看的電影特征向量與整個(gè)電影特征矩陣的余弦相似度,取相似度最大的top_k個(gè),這里加了些隨機(jī)選擇在里面,保證每次的推薦稍稍有些不同。

def recommend_same_type_movie(movie_id_val, top_k = 20):loaded_graph = tf.Graph() ?#with tf.Session(graph=loaded_graph) as sess: ?## Load saved modelloader = tf.train.import_meta_graph(load_dir + '.meta')loader.restore(sess, load_dir)norm_movie_matrics = tf.sqrt(tf.reduce_sum(tf.square(movie_matrics), 1, keep_dims=True))normalized_movie_matrics = movie_matrics / norm_movie_matrics#推薦同類型的電影probs_embeddings = (movie_matrics[movieid2idx[movie_id_val]]).reshape([1, 200])probs_similarity = tf.matmul(probs_embeddings, tf.transpose(normalized_movie_matrics))sim = (probs_similarity.eval())# ? ? results = (-sim[0]).argsort()[0:top_k]# ? ? print(results)print("您看的電影是:{}".format(movies_orig[movieid2idx[movie_id_val]]))print("以下是給您的推薦:")p = np.squeeze(sim)p[np.argsort(p)[:-top_k]] = 0p = p / np.sum(p)results = set()while len(results) != 5:c = np.random.choice(3883, 1, p=p)[0]results.add(c)for val in (results):print(val)print(movies_orig[val])return results


推薦您喜歡的電影
思路是使用用戶特征向量與電影特征矩陣計(jì)算所有電影的評分,取評分最高的top_k個(gè),同樣加了些隨機(jī)選擇部分。

def recommend_your_favorite_movie(user_id_val, top_k = 10):loaded_graph = tf.Graph() ?#with tf.Session(graph=loaded_graph) as sess: ?## Load saved modelloader = tf.train.import_meta_graph(load_dir + '.meta')loader.restore(sess, load_dir)#推薦您喜歡的電影probs_embeddings = (users_matrics[user_id_val-1]).reshape([1, 200])probs_similarity = tf.matmul(probs_embeddings, tf.transpose(movie_matrics))sim = (probs_similarity.eval())# ? ? print(sim.shape)# ? ? results = (-sim[0]).argsort()[0:top_k]# ? ? print(results)# ? ? sim_norm = probs_norm_similarity.eval()# ? ? print((-sim_norm[0]).argsort()[0:top_k])print("以下是給您的推薦:")p = np.squeeze(sim)p[np.argsort(p)[:-top_k]] = 0p = p / np.sum(p)results = set()while len(results) != 5:c = np.random.choice(3883, 1, p=p)[0]results.add(c)for val in (results):print(val)print(movies_orig[val])return results

看過這個(gè)電影的人還看了(喜歡)哪些電影
首先選出喜歡某個(gè)電影的top_k個(gè)人,得到這幾個(gè)人的用戶特征向量。
然后計(jì)算這幾個(gè)人對所有電影的評分
選擇每個(gè)人評分最高的電影作為推薦
同樣加入了隨機(jī)選擇

import randomdef recommend_other_favorite_movie(movie_id_val, top_k = 20):loaded_graph = tf.Graph() ?#with tf.Session(graph=loaded_graph) as sess: ?## Load saved modelloader = tf.train.import_meta_graph(load_dir + '.meta')loader.restore(sess, load_dir)probs_movie_embeddings = (movie_matrics[movieid2idx[movie_id_val]]).reshape([1, 200])probs_user_favorite_similarity = tf.matmul(probs_movie_embeddings, tf.transpose(users_matrics))favorite_user_id = np.argsort(probs_user_favorite_similarity.eval())[0][-top_k:]# ? ? print(normalized_users_matrics.eval().shape)# ? ? print(probs_user_favorite_similarity.eval()[0][favorite_user_id])# ? ? print(favorite_user_id.shape)print("您看的電影是:{}".format(movies_orig[movieid2idx[movie_id_val]]))print("喜歡看這個(gè)電影的人是:{}".format(users_orig[favorite_user_id-1]))probs_users_embeddings = (users_matrics[favorite_user_id-1]).reshape([-1, 200])probs_similarity = tf.matmul(probs_users_embeddings, tf.transpose(movie_matrics))sim = (probs_similarity.eval())# ? ? results = (-sim[0]).argsort()[0:top_k]# ? ? print(results)# ? ? print(sim.shape)# ? ? print(np.argmax(sim, 1))p = np.argmax(sim, 1)print("喜歡看這個(gè)電影的人還喜歡看:")results = set()while len(results) != 5:c = p[random.randrange(top_k)]results.add(c)for val in (results):print(val)print(movies_orig[val])return results


結(jié)論
以上就是實(shí)現(xiàn)的常用的推薦功能,將網(wǎng)絡(luò)模型作為回歸問題進(jìn)行訓(xùn)練,得到訓(xùn)練好的用戶特征矩陣和電影特征矩陣進(jìn)行推薦。

?

?

總結(jié)

以上是生活随笔為你收集整理的TensorFlow实战——深度学习训练个性化推荐系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日产乱码一二三区别在线 | bayu135国产精品视频 | 日韩精品中文字幕av | 天天躁日日躁狠狠躁av麻豆 | 精品一区二区电影 | 国产96在线视频 | 深夜国产在线 | 精品国产一区二区三区蜜臀 | 日韩激情综合 | 天天se天天cao天天干 | 91丨九色丨国产在线 | 日韩欧美亚州 | 国产精品欧美久久久久久 | av在线网站观看 | 看片在线亚洲 | 国产在线中文 | 日韩在线视频观看 | 2022久久国产露脸精品国产 | 成人av一区二区兰花在线播放 | 色婷婷色| 看黄色.com | 免费观看午夜视频 | 久久66热这里只有精品 | 国产日韩欧美在线影视 | 成人v| 五月天免费网站 | 欧美日韩综合在线观看 | 久久国产精品久久久久 | 久草视频免费在线播放 | 日日操日日干 | 狠狠久久综合 | 亚洲国产精品va在线看黑人动漫 | 91成人久久 | 在线免费观看视频一区二区三区 | 久久久久久久久久久久久国产精品 | 精品国产_亚洲人成在线 | 成人免费色 | 日韩成人免费在线电影 | 最新免费中文字幕 | 狠狠色狠狠色合久久伊人 | 99热在线免费观看 | 麻豆视频免费在线 | 色网影音先锋 | 最新日本中文字幕 | 国产精品精品 | 91在线www| 欧美黑人猛交 | 久久激情五月婷婷 | 久久天天躁狠狠躁亚洲综合公司 | 99久久网站 | 97在线播放| 欧美极品在线播放 | 天天激情天天干 | 国产专区在线看 | 国产精品区免费视频 | 黄色av观看 | 欧美色婷| 操久 | 日韩高清网站 | 永久免费毛片在线观看 | 日女人电影 | h视频在线看 | av直接看| 天天干天天干天天干 | 欧美做受高潮 | 93久久精品日日躁夜夜躁欧美 | 99视频在线免费看 | 91精品影视| 激情网五月婷婷 | 久99久精品 | 涩涩网站免费 | 日本巨乳在线 | 国产一区视频在线播放 | 国产中文字幕免费 | 亚洲精品视频一 | 在线你懂的视频 | 一本到视频在线观看 | 91视视频在线直接观看在线看网页在线看 | 99精品小视频 | 日韩欧美在线一区 | 国产精品久久久区三区天天噜 | 波多野结依在线观看 | 色综合天天视频在线观看 | 久久免费一 | 日韩视频在线观看视频 | 亚洲人成影院在线 | 91中文视频 | 国产欧美精品一区二区三区 | 久久久久婷 | 又黄又刺激的视频 | 久久久黄视频 | 在线国产视频一区 | 成人在线播放视频 | 一级淫片在线观看 | 超碰在线公开免费 | 色噜噜在线观看 | 色天天综合久久久久综合片 | 四虎影视成人永久免费观看视频 | 日韩欧美视频在线免费观看 | av蜜桃在线 | 最近中文字幕国语免费av | 久久精品国产精品 | 国产淫a | 欧美一级在线看 | 国语精品视频 | www在线观看视频 | 久久久久久久久艹 | 干干干操操操 | 最新av网址在线观看 | 色五月成人 | 99精品久久久久久久 | av在线免费观看黄 | 97色婷婷成人综合在线观看 | 97av色 | 国产精品久久久久久久久久久久午夜 | 国产盗摄精品一区二区 | 亚洲三级精品 | 精品美女国产在线 | 久久免费视频3 | 国产精品久久一区二区无卡 | 91喷水| 一级成人免费 | 久久精品4 | 精品国产一区二区三区男人吃奶 | av免费电影在线 | 九九精品久久 | 中文字幕在线看视频 | 精品免费在线视频 | 在线免费视频你懂的 | 日韩色高清| 国产精品99久久久久久宅男 | 久久久久久蜜桃一区二区 | 高潮久久久久久 | 久久久综合九色合综国产精品 | 日韩免费在线 | 亚洲人成免费网站 | 黄视频色网站 | 99久久婷婷国产综合亚洲 | 成人天堂网 | 日本精品视频在线观看 | 精品一区二区6 | 日韩免费在线看 | 欧美日韩在线观看不卡 | 亚洲成人国产精品 | 韩日视频在线 | 国产精品av在线 | 亚洲国产精品电影 | 麻豆视频在线观看免费 | 婷婷夜夜 | 欧美黄在线 | 欧美日韩在线精品 | 国产成人精品一区二区 | 激情电影在线观看 | 日韩二区在线播放 | 亚洲精品国产综合久久 | 首页中文字幕 | 麻豆视频国产精品 | 国产免费观看高清完整版 | 久久热首页 | 国产青春久久久国产毛片 | 免费成人结看片 | 成人av免费在线播放 | 国产高清久久 | 国产精品视频免费看 | 欧美性色综合网站 | 日韩精品久久一区二区 | 亚洲伦理中文字幕 | 伊人春色电影网 | 最近中文字幕国语免费高清6 | 99精品视频免费全部在线 | 久av电影 | 成人资源在线观看 | 日韩欧美高清免费 | 久久午夜精品视频 | 国产99久久久国产精品免费二区 | 欧洲高潮三级做爰 | 国产伦精品一区二区三区照片91 | 狠狠色丁香婷婷综合最新地址 | 中文字幕在线观看完整版电影 | 天天干天天操天天操 | 亚洲黄在线观看 | 日韩电影中文 | 91精品久久久久久久久久久久久 | 在线免费观看不卡av | 91精品国产三级a在线观看 | 久久久视屏| 97超碰中文字幕 | 日本在线观看一区二区三区 | 人成电影网 | 欧美在线视频不卡 | 日韩理论在线播放 | 人人爽人人澡 | 6699私人影院 | 国产成人一区二区三区电影 | 91成人精品国产刺激国语对白 | 97碰碰视频 | 丁香激情五月婷婷 | 在线视频日韩欧美 | 黄色av电影在线观看 | 中文字幕九九 | 国内精品福利视频 | 婷婷精品视频 | 色综合天天色 | 人人看人人艹 | 国产精品永久免费在线 | 99re久久资源最新地址 | 久久99久久99免费视频 | 91在线观看高清 | 日韩一级电影在线 | 久久精品99国产精品亚洲最刺激 | 国产精品丝袜在线 | 福利视频一二区 | 日韩电影在线观看一区 | 91最新国产 | 特级xxxxx欧美 | 亚洲一二区视频 | 91在线免费播放 | 五月婷婷欧美视频 | 久久99国产精品久久99 | 中文字幕日本特黄aa毛片 | 久草视频在线资源站 | 中文字幕 国产视频 | 欧美日韩精品电影 | 免费网站色 | 日韩欧美视频在线免费观看 | 国产中文字幕视频 | 亚洲一级二级三级 | 在线观看视频91 | 亚洲五月花 | 操操操干干干 | 欧美日本国产在线观看 | 国产精品久久二区 | 少妇自拍av | 久久99精品久久久久久久久久久久 | 久久精品草 | 久久a v视频| 波多野结衣在线观看视频 | 天天干天天干天天干 | 91精品视频一区 | 精品久久久久一区二区国产 | 中文字幕亚洲综合久久五月天色无吗'' | 日韩高清精品免费观看 | 久久手机在线视频 | 色橹橹欧美在线观看视频高清 | 日韩欧美在线视频一区二区 | 中文字幕在线观看免费高清完整版 | 午夜精品久久久久久久久久 | 亚洲精品国产精品久久99热 | 天天射天天射 | 欧美日本不卡 | 在线观看一区视频 | 午夜三级毛片 | 日韩av成人免费看 | 亚洲国产一区在线观看 | 久久美女免费视频 | 国产综合香蕉五月婷在线 | 欧美激情片在线观看 | 美女网站色 | 国产精品一区一区三区 | 久久综合色天天久久综合图片 | 激情影音先锋 | av资源免费看 | 伊人亚洲综合网 | 特黄一级毛片 | 天天干夜夜擦 | 亚洲精品在线视频播放 | 久久国产精品99国产精 | 欧美在线视频精品 | 日韩在线观看第一页 | 久久久这里有精品 | 精品一区二区在线免费观看 | 欧美日韩国产一区二区三区 | 中文字幕不卡在线88 | 久久有精品| 午夜av一区二区三区 | 久久久久久久久久亚洲精品 | 男女男视频 | 97热久久免费频精品99 | 欧美国产精品一区二区 | 夜夜高潮夜夜爽国产伦精品 | 在线看国产精品 | 天天综合成人网 | 国产精品久久久久久999 | 奇米网8888| 精品国产欧美 | 国产精品中文在线 | 98福利在线 | 国产青青青 | 91视频免费看片 | 麻豆视频免费看 | 日日躁天天躁 | 最近中文字幕久久 | 五月天六月色 | av中文字幕在线免费观看 | 日韩在线首页 | 国产精品乱码高清在线看 | 911亚洲精品第一 | 成人午夜精品福利免费 | 黄av在线 | 色婷婷丁香 | 日韩高清在线看 | 亚洲女人av| 黄p网站在线观看 | 91视频啊啊啊 | 最近中文字幕大全 | 国产又粗又猛又黄视频 | 99亚洲天堂| 欧美成人999| 91精品国产自产老师啪 | 国产精品久久久久久久av大片 | 日韩视频在线观看视频 | 国产精品视频免费观看 | 黄色国产高清 | 久久日韩精品 | 国产传媒中文字幕 | 成人影视片 | 一级黄网 | 综合久久一本 | 欧美日韩精品在线播放 | 国产一区在线播放 | 婷婷av色综合 | 久久伦理影院 | 成 人 黄 色 视频免费播放 | 69精品久久久 | 成人精品福利 | 久久久久激情电影 | 99热精品久久| 狠狠狠狠狠狠干 | 国产91亚洲精品 | 黄色一级大片在线观看 | 夜夜视频 | 天天爱av导航 | 色视频网站免费观看 | 人人玩人人爽 | 天天天天天天操 | 欧美日韩高清一区二区三区 | 一区二区三区在线免费观看 | 日韩.com| 色噜噜日韩精品一区二区三区视频 | 国产亚洲精品久久久久久久久久 | 欧美做受69 | 免费观看日韩av | 黄av在线 | 日日干天天干 | 少妇18xxxx性xxxx片 | 超碰在线最新网址 | 久久久国产网站 | 久草在线观 | 日韩精品久久久久久中文字幕8 | 免费看成人 | 丁香在线观看完整电影视频 | 日韩精品最新在线观看 | 在线观看日本高清mv视频 | 看片黄网站 | 91麻豆看国产在线紧急地址 | 久久久久国产视频 | 久久久一本精品99久久精品66 | 丁香久久激情 | 日本性高潮视频 | 天堂av高清 | 四虎影视8848dvd| av中文字幕不卡 | 天天操综合网站 | 精品国产伦一区二区三区观看方式 | 九九热中文字幕 | 久久夜色精品国产欧美乱极品 | 一区二区三区在线观看免费 | 成年人黄色在线观看 | 精品99999| 97超碰国产在线 | 99r在线播放 | 午夜视频一区二区三区 | 美女av在线免费 | 国产精品电影一区 | 日韩电影中文 | 日韩成人不卡 | 狠狠色噜噜狠狠 | 久久免费视频5 | 国产亚洲精品久久久久秋 | 一区二区三区免费在线观看 | 在线观看视频亚洲 | 国产 一区二区三区 在线 | av黄免费看| 国内久久精品 | 亚洲成人免费在线 | 九九综合久久 | 亚洲涩综合 | 欧美激情第一页xxx 午夜性福利 | 午夜电影中文字幕 | 天天干天天做 | 亚洲午夜久久久综合37日本 | 国产一级免费播放 | 亚洲精品国产精品乱码不99热 | 五月天综合网 | 亚洲热视频 | 亚洲一区二区天堂 | 久久成人精品 | 成+人+色综合 | 久久er99热精品一区二区三区 | 国产美女网站视频 | 91精品在线免费视频 | 中文永久免费观看 | 国产99久久99热这里精品5 | 国产精品美女久久久久久免费 | 综合在线亚洲 | 国产午夜精品一区二区三区嫩草 | av在线免费播放 | 中文字幕日韩精品有码视频 | 精品亚洲免费视频 | 欧美一区,二区 | 亚洲黄色一级视频 | 97视频在线观看成人 | 亚洲作爱视频 | 久久久久久久久久久久影院 | 蜜臀av夜夜澡人人爽人人 | 在线免费中文字幕 | 91毛片在线 | 日日日日干 | 麻豆一精品传二传媒短视频 | 久久久精品视频网站 | 综合久久久久久 | 精品国产色 | av电影中文字幕在线观看 | 国产高清在线看 | 手机在线看a | 婷婷在线网站 | 亚洲电影图片小说 | 91av国产视频 | 精品久久久免费 | 99re国产 | 日韩在观看线 | 综合精品久久久 | av视屏在线 | 久久国产精品影片 | 激情网在线视频 | 国产色秀视频 | 久草免费在线视频 | 中文字幕在线视频网站 | 97福利| 久久人人插 | 中文字幕在线免费观看视频 | 蜜臀aⅴ国产精品久久久国产 | 日本超碰在线 | 成人va天堂 | 婷婷丁香国产 | 日韩精品一区二区免费 | 黄色免费网 | 国产精品久久久久久久久久久久冷 | 日韩久久视频 | 66av99精品福利视频在线 | 免费观看一级 | 精精国产xxxx视频在线播放 | 日韩欧美综合在线视频 | 亚洲国产欧美在线人成大黄瓜 | 日韩免费中文字幕 | 日韩精品久久久久久中文字幕8 | 色婷婷色 | 精品xxx| 黄色成人av在线 | 国产精品久久精品 | 国产精品国产三级在线专区 | 性色av一区二区 | 午夜私人影院久久久久 | 国产在线观看一 | 亚洲免费永久精品国产 | 午夜aaaa| 青春草视频在线播放 | 草樱av | 成人一区二区三区在线 | 在线有码中文 | 亚洲黑丝少妇 | 四虎国产精品成人免费4hu | 欧美日韩在线观看视频 | 激情综合网天天干 | 激情丁香久久 | 蜜桃视频在线观看一区 | 日韩一级成人av | 久久91久久久久麻豆精品 | 96超碰在线 | 日韩三级在线观看 | 91亚洲精品久久久 | 一级免费黄视频 | 婷婷色伊人 | 欧美日本不卡视频 | 国产免费一区二区三区网站免费 | 伊人久久精品久久亚洲一区 | 蜜桃视频在线视频 | 天天综合操 | 国产精品久久久久高潮 | 亚洲伊人天堂 | 伊人婷婷网 | 福利一区二区三区四区 | 免费观看的黄色 | 日韩精品一区在线播放 | 日韩一级电影在线观看 | 日韩三级av | 国产亚洲成av人片在线观看桃 | 成人国产电影在线观看 | 亚洲成人黄色网址 | 九九九热 | 中文字幕在线观看网 | 国产欧美综合视频 | 精品久久久免费 | 四虎永久网站 | 久久成人高清 | 亚洲精品资源在线观看 | 国产精品麻豆免费版 | 久久公开视频 | 麻豆果冻剧传媒在线播放 | 欧美aaa视频 | 久久国产精品电影 | 久久免费黄色大片 | 中文字幕日韩精品有码视频 | 国产精品中文字幕av | 亚洲一区精品二人人爽久久 | 91视频最新网址 | www.av小说 | 午夜视频色 | 999视频网站 | 毛片区 | 奇人奇案qvod| 高清av免费看| 欧美专区亚洲专区 | 国产一区在线免费观看视频 | 久久手机视频 | 欧美日韩视频在线观看一区二区 | 91视频一8mav | 欧美精品在线观看免费 | 国产精品成人久久 | 人人超碰在线 | 欧美色图亚洲图片 | 黄色大全在线观看 | 日韩精品一卡 | 99国产情侣在线播放 | 99成人免费视频 | 国产福利91精品一区 | 中文字幕一区二区三区在线播放 | 免费观看xxxx9999片 | 国产无套精品久久久久久 | 欧美另类重口 | 日韩av片无码一区二区不卡电影 | 久久国精品 | 久久99久久久久久 | 久久国产精品免费视频 | 97视频免费在线 | 69xx视频| 麻豆视频在线免费看 | 欧美日韩在线精品一区二区 | 国产伦理一区二区 | 91久久丝袜国产露脸动漫 | 国产精品久久久久久久久免费看 | 黄色的视频 | 一区二区三区电影大全 | 99欧美精品 | 亚洲黄色软件 | 亚洲资源| 96亚洲精品久久久蜜桃 | 国产五月 | 色综合久久五月天 | 精品一区电影 | 叶爱av在线| 日韩午夜大片 | 成人影片在线免费观看 | 亚洲国产中文字幕在线视频综合 | 美国av片在线观看 | 在线观看视频你懂的 | 久久99热精品这里久久精品 | 国产精品久久久久一区二区三区共 | 免费黄色av | 黄色一级大片在线观看 | 99视频免费观看 | 久久国产精品一区二区三区四区 | 日韩在线观看高清 | 99激情网 | 国产小视频在线观看免费 | 日本3级在线观看 | 一区二区三区四区精品 | 亚州精品国产 | 久久免费黄色大片 | 天天操天天干天天操天天干 | 五月天中文字幕mv在线 | 国产精品一区二区美女视频免费看 | 少妇bbb搡bbbb搡bbbb′ | 久久国产一区二区三区 | 伊人伊成久久人综合网小说 | 日韩特黄av | 国产不卡在线视频 | 综合婷婷丁香 | 成人永久免费 | www91在线观看 | 婷色在线 | 亚洲成人国产精品 | 国产精品乱码一区二三区 | 国产 日韩 欧美 在线 | 久草影视在线观看 | 久久精品一二区 | 2024国产精品视频 | 一区中文字幕 | 久久久久久久99 | 超碰在线最新网址 | sesese图片 | 亚洲精品97| 99视频国产精品 | 国产字幕在线观看 | 亚洲黄在线观看 | 91免费版在线 | 草久在线观看视频 | 91在线看黄| 久久色网站 | av电影免费在线播放 | 狠狠躁日日躁夜夜躁av | 国产91丝袜在线播放动漫 | www激情网| 天天操人人干 | 美女一区网站 | 久久成人黄色 | 天天操天天操天天操天天操天天操天天操 | 国产一区二区在线免费播放 | av在线收看| 国产一区视频在线播放 | 欧美性猛片, | 欧美日韩国产亚洲乱码字幕 | 中文字幕av一区二区三区四区 | 黄色亚洲免费 | 婷婷免费在线视频 | 国模吧一区 | 日韩av电影中文字幕在线观看 | 久久激情五月婷婷 | 中文国产成人精品久久一 | 久久尤物电影视频在线观看 | 在线视频日韩精品 | 91在线中文字幕 | 免费看一级| 黄p网站在线观看 | 91桃色国产在线播放 | 国产精品一区欧美 | www久久久| 黄网在线免费观看 | 久久精品99国产精品日本 | 国产热re99久久6国产精品 | 欧美日韩aa | 国产视频在线看 | 国产激情小视频在线观看 | 国产精品成人国产乱一区 | 精品中文字幕在线观看 | 玖玖在线视频观看 | 在线观看成人小视频 | 日韩激情综合 | 特级西西www44高清大胆图片 | 在线看日韩 | 国产免费影院 | 亚洲最新视频在线播放 | 国产一区在线视频观看 | 成人av网站在线播放 | 久久久久久网址 | 亚洲理论视频 | 香蕉视频在线免费看 | 99人久久精品视频最新地址 | 午夜在线免费视频 | 国产精品久久网 | av亚洲产国偷v产偷v自拍小说 | 国产免费亚洲 | 五月婷婷免费 | 一区二区中文字幕在线 | 日韩在线电影一区 | 免费看片日韩 | 日韩精品一区二区在线视频 | 91片黄在线观看动漫 | 一区免费观看 | 在线观看日本韩国电影 | 五月婷婷另类国产 | 久久久久久国产精品999 | 欧美性黑人 | 99热国产在线中文 | 干狠狠 | 色中射| 国产xvideos免费视频播放 | 久久电影中文字幕视频 | 欧美日韩国产在线观看 | 天天操天天射天天 | 一区二区三区四区影院 | 免费看国产曰批40分钟 | 涩五月婷婷| 一区电影 | 亚洲精品久久激情国产片 | 免费影视大全推荐 | 久久欧美视频 | 最新av电影网站 | 婷婷在线资源 | 日韩欧美在线观看一区二区 | 国产 中文 日韩 欧美 | 在线 国产 日韩 | 色狠狠综合 | 黄色特级一级片 | 97在线观| 国产女人18毛片水真多18精品 | 日韩精品一区二区三区在线播放 | 丁香六月婷婷开心 | 黄色av影院 | 久久视频这里有久久精品视频11 | 综合亚洲视频 | 久草在线视频网站 | 欧美精品九九99久久 | 六月激情 | 天天色天天草天天射 | 在线观看国产麻豆 | 国产在线高清 | 五月婷婷综合网 | 亚洲欧美日韩国产精品一区午夜 | 亚洲国产97在线精品一区 | 日日操天天爽 | 国产精品久一 | 99久久婷婷国产一区二区三区 | 在线观看视频在线 | 激情影音先锋 | 色吧av色av | 中文理论片| 丁香婷婷激情 | 精品久久在线 | 特黄特色特刺激视频免费播放 | 久草视频在 | 在线成人中文字幕 | 国产成人精品电影久久久 | 色诱亚洲精品久久久久久 | 韩国av免费在线 | 在线欧美a | 欧美一区二区伦理片 | 国产中文字幕三区 | 亚洲综合激情 | av中文字幕在线看 | 国产精品青青 | 久久国产精品第一页 | 在线电影av| 精品国产精品久久 | 色婷婷六月 | 久久人人爽视频 | 国产精品久久久久av福利动漫 | 噜噜色官网 | 亚洲国产成人久久 | 亚洲有 在线 | 一区二区精品在线观看 | 色综合久久久久综合 | 亚洲精选99| 国产精品18久久久久久不卡孕妇 | 丝袜美腿亚洲 | 亚洲午夜精品久久久久久久久久久久 | 99欧美视频| 欧美黄色高清 | 亚洲欧洲国产精品 | 色综合久久久久 | 涩涩网站在线 | 九九久久精品 | 亚洲欧美激情插 | 国产综合久久 | 亚洲一区二区精品视频 | 日本乱码在线 | 久99久中文字幕在线 | www.天堂av | 国产成人久久av免费高清密臂 | 亚洲精品天天 | 天天操天天吃 | 欧美视频日韩 | 片网站 | 看黄色.com| 日日躁夜夜躁aaaaxxxx | 视频成人永久免费视频 | 91av网址| 国产视频在线观看一区二区 | 一级做a视频 | 伊人官网| 在线看中文字幕 | 亚洲天堂网视频在线观看 | 国产91影院 | 色综合天天射 | 婷婷精品国产一区二区三区日韩 | 精品国产_亚洲人成在线 | 亚洲成人一区 | 福利视频区| 狠狠色综合网站久久久久久久 | www.天天色.com | 成全在线视频免费观看 | 人人揉人人揉人人揉人人揉97 | 久久综合久色欧美综合狠狠 | 亚洲成人网av | 国产999精品 | 欧美成人精品欧美一级乱 | 人人澡超碰碰 | 日日摸日日 | 国产精彩视频一区二区 | 99热九九这里只有精品10 | 久久精品一二三 | 九九在线视频免费观看 | 91.麻豆视频 | 欧美精品久久久久久久亚洲调教 | 91精品视频免费看 | 99久久超碰中文字幕伊人 | 深爱激情五月婷婷 | 精品黄色在线观看 | 日韩电影在线观看一区二区 | 麻豆视频在线免费 | 国产高清绿奴videos | 黄在线免费观看 | 伊人五月天.com | 亚洲最新视频在线 | 亚洲人成网站精品片在线观看 | 97香蕉久久超级碰碰高清版 | 看片的网址 | 天天操天天爽天天干 | 国产亚洲综合性久久久影院 | a精品视频 | 国产精品尤物视频 | 欧美成a人片在线观看久 | 顶级欧美色妇4khd | 激情网在线视频 | 国产精品日韩在线观看 | 粉嫩aⅴ一区二区三区 | 日韩视频免费观看高清完整版在线 | 午夜资源站| 成人va天堂 | 91成人久久| 夜夜视频 | 天天操天天弄 | 激情五月看片 | 亚洲精品视频免费在线 | 色片网站在线观看 | av天天在线观看 | 国产综合香蕉五月婷在线 | 日韩在线视频观看 | 99久久久久久久久久 | 国产精品久久久久永久免费看 | 国产精品区在线观看 | 国产99在线播放 | 九九精品视频在线观看 | 国产精品嫩草55av | 久久国产精品久久精品 | 国产精品中文字幕在线 | 91精品国产综合久久婷婷香蕉 | 成人在线一区二区 | 日韩欧美一区二区三区在线 | 精品播放 | 免费男女羞羞的视频网站中文字幕 | 激情五月婷婷综合 | 国产中文字幕91 | 91精品国产网站 | 国产精品综合在线 | 国产在线播放一区 | 久久综合婷婷综合 | 麻豆国产网站 | 国产一区久久久 | 91九色视频在线播放 | 免费看片成年人 | 激情五月网站 | 欧美激情在线看 | 国内久久精品视频 | 亚洲jizzjizz日本少妇 | 一区二区三区视频在线 | 色.www| 丁香午夜婷婷 | 久久精品电影院 | 天天操天天射天天操 | 狠狠狠狠狠狠干 | 国产午夜在线观看 | 91人人人 | 成人午夜剧场在线观看 | 99热精品国产一区二区在线观看 | 成人免费xxx在线观看 | 久久免费观看视频 | 69国产精品视频免费观看 | 久草在在线视频 | 日韩成人在线一区二区 | 免费看av在线 | 又粗又长又大又爽又黄少妇毛片 | 黄av资源 | 日韩电影在线观看一区二区 | 亚州日韩中文字幕 | 日韩视频免费看 | 成人免费观看视频大全 | 国产成人久久av | 国产高清无线码2021 | 伊人开心激情 | 亚洲精品美女 | 天天爽综合网 | 午夜精品久久久久久久久久久 | 亚洲成熟女人毛片在线 | 国产在线高清视频 | 中午字幕在线 | 国模精品在线 | av手机在线播放 | 色香天天 | 探花视频免费观看 | 成人手机在线视频 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 国产女人18毛片水真多18精品 | 中文字幕在线播放日韩 | 亚洲天天在线日亚洲洲精 | 国产在线一区二区 | 狠狠色综合欧美激情 | 99热超碰| 国产又粗又猛又爽又黄的视频免费 | 欧美日韩在线视频一区 | 久久tv视频 | 精品视频一区在线 | 在线日韩中文 | 天天综合区 | 久久婷婷综合激情 | 日韩欧美视频免费观看 | 久色 网| 成人在线免费av | 天天天天色射综合 | 中文字幕视频一区 | 日韩性片 | 91九色最新地址 | 免费的国产精品 | 国产精品毛片久久久久久久 | 中文字幕一区二区三区乱码不卡 | 九色视频自拍 | 欧美精品一区二区三区一线天视频 | 婷婷色中文 | 免费观看的av网站 | 伊人久久影视 | 亚洲高清视频在线 | 欧美激情综合色综合啪啪五月 | 国产成人三级一区二区在线观看一 | 亚洲日本va午夜在线影院 | 日韩一区二区三区高清在线观看 | 92精品国产成人观看免费 | 国产精品亚洲片夜色在线 | 国内丰满少妇猛烈精品播放 | 日韩专区 在线 | 精品一二三区 | 日韩欧美专区 | 2023年中文无字幕文字 | 综合视频在线 | 日韩高清国产精品 | 中文字幕欲求不满 | 久久久综合九色合综国产精品 | 久久综合狠狠综合久久狠狠色综合 | 欧美日韩高清一区二区 国产亚洲免费看 | 精品人人爽| 美女网站视频色 | 国产欧美综合视频 | 亚洲午夜精 | 久久综合久久综合这里只有精品 | 色噜噜日韩精品一区二区三区视频 | 久久久激情网 | 午夜视频亚洲 | 91视频91蝌蚪| 免费黄色av. | 国产高清在线免费观看 | 久热免费在线 | 久久久久免费精品视频 | 狠狠色伊人亚洲综合网站色 | 俺要去色综合狠狠 | 美女很黄免费网站 | 国产九九热 | 国产精品久久久久aaaa | 五月天久久狠狠 | 麻豆av一区二区三区在线观看 | 国产老妇av | 国产精品永久久久久久久www | 久久久久久免费视频 | 国内综合精品午夜久久资源 | 欧美日本高清视频 | 亚洲国产一区在线观看 | 色视频成人在线观看免 | 99久久精品免费看 | 玖玖国产精品视频 | 中文字幕在线观看免费观看 | 免费h视频| 国产不卡视频在线播放 | 天堂av高清 | 精品一区二区综合 | 成人久久18免费网站图片 | 国产精品女主播一区二区三区 | 国产在线欧美在线 | 日本中文字幕网址 | 成人毛片100免费观看 | 亚洲欧洲一区二区在线观看 | 久久99国产精品免费 | 99视频播放 | 国产亚洲激情视频在线 | 中文字幕在线观看1 | 91av精品| 97看片| 黄色大片国产 | 久久精品久久久精品美女 | www激情网| 人人澡超碰碰97碰碰碰软件 | 久久精品视频播放 | 97av色| 国产精品视频你懂的 | 亚洲免费成人av电影 | 成年人看片网站 | 偷拍精偷拍精品欧洲亚洲网站 | 午夜在线国产 | 欧美日韩精品久久久 | 五月激情久久久 | 亚洲国产精品va在线看黑人动漫 |