精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用TENSORFLOW訓練循環神經網絡語言模型

人工智能 深度學習
Language Model,即語言模型,其主要思想是,在知道前一部分的詞的情況下,推斷出下一個最有可能出現的詞。在本文中,我們更加關注的是,如何使用RNN來推測下一個詞。

讀了將近一個下午的TensorFlow Recurrent Neural Network教程,翻看其在PTB上的實現,感覺晦澀難懂,因此參考了部分代碼,自己寫了一個簡化版的Language Model,思路借鑒了Keras的LSTM text generation

代碼地址:Github

轉載請注明出處:Gaussic

語言模型

Language Model,即語言模型,其主要思想是,在知道前一部分的詞的情況下,推斷出下一個最有可能出現的詞。例如,知道了 The fat cat sat on the,我們認為下一個詞為mat的可能性比hat要大,因為貓更有可能坐在毯子上,而不是帽子上。

這可能被你認為是常識,但是在自然語言處理中,這個任務是可以用概率統計模型來描述的。就拿The fat cat sat on the mat來說。我們可能統計出第一個詞The出現的概率p(The)p(The),The后面是fat的條件概率為p(fat|The)p(fat|The),The fat同時出現的聯合概率:

  1. p(The,fat)=p(The)⋅p(fat|The)p(The,fat)=p(The)·p(fat|The) 
這個聯合概率,就是The fat的合理性,即這句話的出現符不符合自然語言的評判標準,通俗點表述就是這是不是句人話。同理,根據鏈式規則,The fat cat的聯合概率可求:
 
  1. p(The,fat,cat)=p(The)⋅p(fat|The)⋅p(cat|The,fat)p(The,fat,cat)=p(The)·p(fat|The)·p(cat|The,fat) 
在知道前面的詞為The cat的情況下,下一個詞為cat的概率可以推導出來:
 
  1. p(cat|The,fat)=p(The,fat,cat)p(The,fat)p(cat|The,fat)=p(The,fat,cat)p(The,fat) 
分子是The fat cat在語料庫中出現的次數,分母是The fat在語料庫中出現的次數。
因此,The fat cat sat on the mat整個句子的合理性同樣可以推導,這個句子的合理性即為它的概率。公式化的描述如下:
 
  1. p(S)=p(w1,w2,⋅⋅⋅,wn)=p(w1)⋅p(w2|w1)⋅p(w3|w1,w2)⋅⋅⋅p(wn|w1,w2,w3,⋅⋅⋅,wn−1)p(S)=p(w1,w2,···,wn)=p(w1)·p(w2|w1)·p(w3|w1,w2)···p(wn|w1,w2,w3,···,wn−1) 
(公式后的n-1應該為下標,插件問題,下同)
 
可以看出一個問題,每當計算下一個詞的條件概率,需要計算前面所有詞的聯合概率。這個計算量相當的龐大。并且,一個句子中大部分詞同時出現的概率往往少之又少,數據稀疏非常嚴重,需要一個非常大的語料庫來訓練。
 
一個簡單的優化是基于馬爾科夫假設,下一個詞的出現僅與前面的一個或n個詞有關。
 
最簡單的情況,下一個詞的出現僅僅和前面一個詞有關,稱之為bigram。
 
  1. p(S)=p(w1,w2,⋅⋅⋅,wn)=p(w1)⋅p(w2|w1)⋅p(w3|w2)⋅p(w4|w3)⋅⋅⋅p(wn|wn−1)p(S)=p(w1,w2,···,wn)=p(w1)·p(w2|w1)·p(w3|w2)·p(w4|w3)···p(wn|wn−1) 
再復雜點,下一個詞的出現僅和前面兩個詞有關,稱之為trigram。
 
  1. p(S)=p(w1,w2,⋅⋅⋅,wn)=p(w1)⋅p(w2|w1)⋅p(w3|w1,w2)⋅p(w4|w2,w3)⋅⋅⋅p(wn|wn−2,wn−1)p(S)=p(w1,w2,···,wn)=p(w1)·p(w2|w1)·p(w3|w1,w2)·p(w4|w2,w3)···p(wn|wn−2,wn−1) 

這樣的條件概率雖然好求,但是會丟失大量的前面的詞的信息,有時會對結果產生不良影響。因此如何選擇一個有效的n,使得既能簡化計算,又能保留大部分的上下文信息。

以上均是傳統語言模型的描述。如果不太深究細節,我們的任務就是,知道前面n個詞,來計算下一個詞出現的概率。并且使用語言模型來生成新的文本。

在本文中,我們更加關注的是,如何使用RNN來推測下一個詞。

數據準備
 
TensorFlow的官方文檔使用的是Mikolov準備好的PTB數據集。我們可以將其下載并解壓出來:
 
  1. $ wget http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz 
  2. $ tar xvf simple-examples.tgz 
部分數據如下,不常用的詞轉換成了<unk>標記,數字轉換成了N:
 
  1. we 're talking about years ago before anyone heard of asbestos having any questionable properties 
  2. there is no asbestos in our products now 
  3. neither <unk> nor the researchers who studied the workers were aware of any research on smokers of the kent cigarettes 
  4. we have no useful information on whether users are at risk said james a. <unk> of boston 's <unk> cancer institute 
  5. the total of N deaths from malignant <unk> lung cancer and <unk> was far higher than expected the researchers said 
讀取文件中的數據,將換行符轉換為<eos>,然后轉換為詞的list:
 
  1. def _read_words(filename): 
  2.     with open(filename, 'r', encoding='utf-8'as f: 
  3.         return f.read().replace('\n''<eos>').split() 
  1. f = _read_words('simple-examples/data/ptb.train.txt'
  2. print(f[:20]) 
得到:
 
  1. ['aer''banknote''berlitz''calloway''centrust''cluett''fromstein''gitano''guterman''hydro-quebec''ipo''kia''memotec''mlx''nahb''punts''rake''regatta''rubens''sim'
構建詞匯表,詞與id互轉:
 
  1. def _build_vocab(filename): 
  2.     data = _read_words(filename) 
  3.  
  4.     counter = Counter(data) 
  5.     count_pairs = sorted(counter.items(), key=lambda x: -x[1]) 
  6.  
  7.     words, _ = list(zip(*count_pairs)) 
  8.     word_to_id = dict(zip(words, range(len(words)))) 
  9.  
  10.     return words, word_to_id 
  1. words, words_to_id = _build_vocab('simple-examples/data/ptb.train.txt'
  2. print(words[:10]) 
  3. print(list(map(lambda x: words_to_id[x], words[:10]))) 
輸出:
 
  1. ('the''<unk>''<eos>''N''of''to''a''in''and'"'s"
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
將一個文件轉換為id表示:
 
  1. def _file_to_word_ids(filename, word_to_id): 
  2.     data = _read_words(filename) 
  3.     return [word_to_id[x] for x in data if x in word_to_id] 
  1. words_in_file = _file_to_word_ids('simple-examples/data/ptb.train.txt', words_to_id) 
  2. print(words_in_file[:20]) 
詞匯表已根據詞頻進行排序,由于第一句話非英文,所以id靠后。
 
  1. [9980, 9988, 9981, 9989, 9970, 9998, 9971, 9979, 9992, 9997, 9982, 9972, 9993, 9991, 9978, 9983, 9974, 9986, 9999, 9990] 
將一句話從id列表轉換回詞:
 
  1. def to_words(sentence, words): 
  2.     return list(map(lambda x: words[x], sentence)) 
將以上函數整合:
 
  1. def ptb_raw_data(data_path=None): 
  2.     train_path = os.path.join(data_path, 'ptb.train.txt'
  3.     valid_path = os.path.join(data_path, 'ptb.valid.txt'
  4.     test_path = os.path.join(data_path, 'ptb.test.txt'
  5.  
  6.     words, word_to_id = _build_vocab(train_path) 
  7.     train_data = _file_to_word_ids(train_path, word_to_id) 
  8.     valid_data = _file_to_word_ids(valid_path, word_to_id) 
  9.     test_data = _file_to_word_ids(test_path, word_to_id) 
  10.  
  11.     return train_data, valid_data, test_data, words, word_to_id 
以上部分和官方的例子有一定的相似之處。接下來的處理和官方存在很大的不同,主要參考了Keras例程處理文檔的操作:
 
  1. def ptb_producer(raw_data, batch_size=64, num_steps=20, stride=1): 
  2.     data_len = len(raw_data) 
  3.  
  4.     sentences = [] 
  5.     next_words = [] 
  6.     for i in range(0, data_len - num_steps, stride): 
  7.         sentences.append(raw_data[i:(i + num_steps)]) 
  8.         next_words.append(raw_data[i + num_steps]) 
  9.  
  10.     sentences = np.array(sentences) 
  11.     next_words = np.array(next_words) 
  12.  
  13.     batch_len = len(sentences) // batch_size 
  14.     x = np.reshape(sentences[:(batch_len * batch_size)], \ 
  15.         [batch_len, batch_size, -1]) 
  16.  
  17.     y = np.reshape(next_words[:(batch_len * batch_size)], \ 
  18.         [batch_len, batch_size]) 
  19.  
  20.     return x, y 
參數解析:
  •     raw_data: 即ptb_raw_data()函數產生的數據
  •     batch_size: 神經網絡使用隨機梯度下降,數據按多個批次輸出,此為每個批次的數據量
  •     num_steps: 每個句子的長度,相當于之前描述的n的大小,這在循環神經網絡中又稱為時序的長度。
  •     stride: 取數據的步長,決定數據量的大小。

代碼解析:

這個函數將一個原始數據list轉換為多個批次的數據,即[batch_len, batch_size, num_steps]。

首先,程序每一次取了num_steps個詞作為一個句子,即x,以這num_steps個詞后面的一個詞作為它的下一個預測,即為y。這樣,我們首先把原始數據整理成了batch_len * batch_size個x和y的表示,類似于已知x求y的分類問題。

為了滿足隨機梯度下降的需要,我們還需要把數據整理成一個個小的批次,每次喂一個批次的數據給TensorFlow來更新權重,這樣,數據就整理為[batch_len, batch_size, num_steps]的格式。

打印部分數據: 

  1. train_data, valid_data, test_data, words, word_to_id = ptb_raw_data('simple-examples/data'
  2. x_train, y_train = ptb_producer(train_data) 
  3. print(x_train.shape) 
  4. print(y_train.shape) 
輸出:
 
  1. (14524, 64, 20) 
  2. (14524, 64) 
可見我們得到了14524個批次的數據,每個批次的訓練集維度為[64, 20]。
 
  1. print(' '.join(to_words(x_train[100, 3], words))) 
第100個批次的第3句話為:
 
  1. despite steady sales growth <eos> magna recently cut its quarterly dividend in half and the company 's class a shares 
  1. print(words[np.argmax(y_train[100, 3])]) 
它的下一個詞為:
 
  1. the 
 
構建模型
 
配置項
 
  1. class LMConfig(object): 
  2.     """language model 配置項""" 
  3.     batch_size = 64       # 每一批數據的大小 
  4.     num_steps = 20        # 每一個句子的長度 
  5.     stride = 3            # 取數據時的步長 
  6.  
  7.     embedding_dim = 64    # 詞向量維度 
  8.     hidden_dim = 128      # RNN隱藏層維度 
  9.     num_layers = 2        # RNN層數 
  10.  
  11.     learning_rate = 0.05  # 學習率 
  12.     dropout = 0.2         # 每一層后的丟棄概率 
讀取輸入
 
讓模型可以按批次的讀取數據。
 
  1. class PTBInput(object): 
  2.     """按批次讀取數據""" 
  3.     def __init__(self, config, data): 
  4.         self.batch_size = config.batch_size 
  5.         self.num_steps = config.num_steps 
  6.         self.vocab_size = config.vocab_size # 詞匯表大小 
  7.  
  8.         self.input_data, self.targets = ptb_producer(data, 
  9.             self.batch_size, self.num_steps) 
  10.  
  11.         self.batch_len = self.input_data.shape[0] # 總批次 
  12.         self.cur_batch = 0  # 當前批次 
  13.  
  14.     def next_batch(self): 
  15.         """讀取下一批次""" 
  16.         x = self.input_data[self.cur_batch] 
  17.         y = self.targets[self.cur_batch] 
  18.  
  19.         # 轉換為one-hot編碼 
  20.         y_ = np.zeros((y.shape[0], self.vocab_size), dtype=np.bool) 
  21.         for i in range(y.shape[0]): 
  22.             y_[i][y[i]] = 1 
  23.  
  24.         # 如果到最后一個批次,則回到最開頭 
  25.         self.cur_batch = (self.cur_batch +1) % self.batch_len 
  26.  
  27.         return x, y_ 
模型
 
  1. class PTBModel(object): 
  2.     def __init__(self, config, is_training=True): 
  3.  
  4.         self.num_steps = config.num_steps 
  5.         self.vocab_size = config.vocab_size 
  6.  
  7.         self.embedding_dim = config.embedding_dim 
  8.         self.hidden_dim = config.hidden_dim 
  9.         self.num_layers = config.num_layers 
  10.         self.rnn_model = config.rnn_model 
  11.  
  12.         self.learning_rate = config.learning_rate 
  13.         self.dropout = config.dropout 
  14.  
  15.         self.placeholders()  # 輸入占位符 
  16.         self.rnn()           # rnn 模型構建 
  17.         self.cost()          # 代價函數 
  18.         self.optimize()      # 優化器 
  19.         self.error()         # 錯誤率 
  20.  
  21.  
  22.     def placeholders(self): 
  23.         """輸入數據的占位符""" 
  24.         self._inputs = tf.placeholder(tf.int32, [None, self.num_steps]) 
  25.         self._targets = tf.placeholder(tf.int32, [None, self.vocab_size]) 
  26.  
  27.  
  28.     def input_embedding(self): 
  29.         """將輸入轉換為詞向量表示""" 
  30.         with tf.device("/cpu:0"): 
  31.             embedding = tf.get_variable( 
  32.                 "embedding", [self.vocab_size, 
  33.                     self.embedding_dim], dtype=tf.float32) 
  34.             _inputs = tf.nn.embedding_lookup(embedding, self._inputs) 
  35.  
  36.         return _inputs 
  37.  
  38.  
  39.     def rnn(self): 
  40.         """rnn模型構建""" 
  41.         def lstm_cell():  # 基本的lstm cell 
  42.             return tf.contrib.rnn.BasicLSTMCell(self.hidden_dim, 
  43.                 state_is_tuple=True
  44.  
  45.         def gru_cell():   # gru cell,速度更快 
  46.             return tf.contrib.rnn.GRUCell(self.hidden_dim) 
  47.  
  48.         def dropout_cell():    # 在每個cell后添加dropout 
  49.             if (self.rnn_model == 'lstm'): 
  50.                 cell = lstm_cell() 
  51.             else
  52.                 cell = gru_cell() 
  53.             return tf.contrib.rnn.DropoutWrapper(cell, 
  54.                 output_keep_prob=self.dropout) 
  55.  
  56.         cells = [dropout_cell() for _ in range(self.num_layers)] 
  57.         cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)  # 多層rnn 
  58.  
  59.         _inputs = self.input_embedding() 
  60.         _outputs, _ = tf.nn.dynamic_rnn(cell=cell, 
  61.             inputs=_inputs, dtype=tf.float32) 
  62.  
  63.         # _outputs的shape為 [batch_size, num_steps, hidden_dim] 
  64.         last = _outputs[:, -1, :]  # 只需要最后一個輸出 
  65.  
  66.         # dense 和 softmax 用于分類,以找出各詞的概率 
  67.         logits = tf.layers.dense(inputs=last, units=self.vocab_size)    
  68.         prediction = tf.nn.softmax(logits)   
  69.  
  70.         self._logits = logits 
  71.         self._pred = prediction 
  72.  
  73.     def cost(self): 
  74.         """計算交叉熵代價函數""" 
  75.         cross_entropy = tf.nn.softmax_cross_entropy_with_logits( 
  76.             logits=self._logits, labels=self._targets) 
  77.         cost = tf.reduce_mean(cross_entropy) 
  78.         self.cost = cost 
  79.  
  80.     def optimize(self): 
  81.         """使用adam優化器""" 
  82.         optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate) 
  83.         self.optim = optimizer.minimize(self.cost) 
  84.  
  85.     def error(self): 
  86.         """計算錯誤率""" 
  87.         mistakes = tf.not_equal( 
  88.             tf.argmax(self._targets, 1), tf.argmax(self._pred, 1)) 
  89.         self.errors = tf.reduce_mean(tf.cast(mistakes, tf.float32)) 
訓練
 
  1. def run_epoch(num_epochs=10): 
  2.     config = LMConfig()   # 載入配置項 
  3.  
  4.     # 載入源數據,這里只需要訓練集 
  5.     train_data, _, _, words, word_to_id = \ 
  6.         ptb_raw_data('simple-examples/data'
  7.     config.vocab_size = len(words) 
  8.  
  9.     # 數據分批 
  10.     input_train = PTBInput(config, train_data) 
  11.     batch_len = input_train.batch_len 
  12.  
  13.     # 構建模型 
  14.     model = PTBModel(config) 
  15.  
  16.     # 創建session,初始化變量 
  17.     sess = tf.Session() 
  18.     sess.run(tf.global_variables_initializer()) 
  19.  
  20.     print('Start training...'
  21.     for epoch in range(num_epochs):  # 迭代輪次 
  22.         for i in range(batch_len):   # 經過多少個batch 
  23.             x_batch, y_batch = input_train.next_batch() 
  24.  
  25.             # 取一個批次的數據,運行優化 
  26.             feed_dict = {model._inputs: x_batch, model._targets: y_batch} 
  27.             sess.run(model.optim, feed_dict=feed_dict) 
  28.  
  29.             # 每500個batch,輸出一次中間結果 
  30.             if i % 500 == 0: 
  31.                 cost = sess.run(model.cost, feed_dict=feed_dict) 
  32.  
  33.                 msg = "Epoch: {0:>3}, batch: {1:>6}, Loss: {2:>6.3}" 
  34.                 print(msg.format(epoch + 1, i + 1, cost)) 
  35.  
  36.                 # 輸出部分預測結果 
  37.                 pred = sess.run(model._pred, feed_dict=feed_dict) 
  38.                 word_ids = sess.run(tf.argmax(pred, 1)) 
  39.                 print('Predicted:'' '.join(words[w] for w in word_ids)) 
  40.                 true_ids = np.argmax(y_batch, 1) 
  41.                 print('True:'' '.join(words[w] for w in true_ids)) 
  42.  
  43.     print('Finish training...'
  44.     sess.close() 

需要經過多次的訓練才能得到一個較為合理的結果。 

 

責任編輯:龐桂玉 來源: 36大數據
相關推薦

2017-03-27 16:18:30

神經網絡TensorFlow人工智能

2017-08-29 13:50:03

TensorFlow深度學習神經網絡

2018-08-27 17:05:48

tensorflow神經網絡圖像處理

2017-09-28 16:15:12

神經網絡訓練多層

2017-12-22 08:47:41

神經網絡AND運算

2018-02-27 09:32:13

神經網絡自然語言初探

2018-03-22 13:34:59

TensorFlow神經網絡

2025-02-24 08:00:00

機器學習ML架構

2017-08-22 16:20:01

深度學習TensorFlow

2022-12-05 10:08:59

2023-05-06 12:47:41

2019-01-05 08:40:17

VGG神經網絡

2022-10-19 07:42:41

圖像識別神經網絡

2018-07-29 06:46:07

神經網絡RNN循環神經網絡

2018-12-14 08:02:55

神經網絡機器學習二值模型

2019-07-24 05:36:32

神經網絡語言模型NNLM

2023-01-11 07:28:49

TensorFlow分類模型

2018-07-03 16:10:04

神經網絡生物神經網絡人工神經網絡

2017-07-19 11:39:25

深度學習人工智能boosting

2017-08-10 15:31:57

Apache Spar TensorFlow
點贊
收藏

51CTO技術棧公眾號

国产欧美一区在线| 亚洲综合小说| 日本久久电影网| 图片区小说区区亚洲五月| 91在线公开视频| 99精品福利视频| 国产一区二区三区在线视频| 日本黄色三级网站| 制服丝袜专区在线| 亚洲三级免费观看| 日本一区高清在线视频| 国产ts变态重口人妖hd| 美女诱惑一区| 欧美日本高清一区| 日本黄色小视频在线观看| 中文字幕一区二区三区四区久久| 一本久久综合亚洲鲁鲁五月天| 六月婷婷激情网| 精华区一区二区三区| 国产成人在线网站| 国产精品一区二区3区| 国产精品suv一区二区69| 999久久久免费精品国产| 日韩美女av在线| 年下总裁被打光屁股sp | 国产裸体无遮挡| 久久成人国产| 国模极品一区二区三区| 亚洲伦理一区二区三区| 国产欧美日韩视频在线| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 碰碰在线视频| 一区二区高清免费观看影视大全| 一本一道久久a久久精品综合 | 色综合伊人色综合网| 人妻无码中文久久久久专区| 欧美高清一级片| 欧美日韩在线亚洲一区蜜芽| 日韩免费高清在线| 成人美女视频| 色综合久久综合网97色综合| 亚洲 高清 成人 动漫| 久草在线视频福利| 一区二区三区在线视频免费| 日本三日本三级少妇三级66| 免费高清完整在线观看| 国产亚洲欧美色| 日韩av大全| 成年人视频网站在线| 国产日韩三级在线| 性欧美精品一区二区三区在线播放| 三级av在线播放| 91网站在线播放| 欧美二级三级| 国产98在线| 中文乱码免费一区二区| 亚洲在线色站| 国产视频中文字幕在线观看| 亚洲欧洲精品天堂一级| 只有这里有精品| 日本在线观看高清完整版| 亚洲一区二区视频| 99视频在线免费播放| 在线天堂中文资源最新版| 欧美日韩一区二区精品| 日韩 欧美 高清| gogo亚洲高清大胆美女人体| 欧美中文字幕亚洲一区二区va在线 | 免费日韩av电影| 精品亚洲成a人片在线观看| 日本一区二区三区四区在线视频| 亚洲人成77777| 成人av黄色| 性做久久久久久久久| 自慰无码一区二区三区| 国产一区精品福利| 欧美一区二区三区系列电影| 最新日本中文字幕| 一区三区在线欧| 中文字幕亚洲图片| 欧美成人精品一区二区免费看片| 精品99视频| 日本国产一区二区三区| 91午夜交换视频| 国产不卡免费视频| 欧美日韩在线观看一区二区三区| 欧美人xxx| 亚洲第一av色| 色综合天天色综合| 91成人在线精品视频| 国产香蕉精品视频一区二区三区| 麻豆天美蜜桃91| 欧美欧美全黄| 国产精品69久久| 精品黑人一区二区三区国语馆| 99re成人精品视频| 伊人av成人| 国产自产自拍视频在线观看| 欧美日韩久久久久久| 久久久久久久穴| 欧美日韩激情在线一区二区三区| 欧美风情在线观看| 亚洲精品91天天久久人人| 国产盗摄一区二区三区| 清纯唯美一区二区三区| 色呦呦呦在线观看| 欧美视频你懂的| 日本三级日本三级日本三级极| 波多野结衣一区| 久久免费精品日本久久中文字幕| 亚洲免费视频二区| 成人av影院在线| 中文字幕av久久| 3d性欧美动漫精品xxxx软件| 精品区一区二区| 性欧美疯狂猛交69hd| 深夜福利亚洲导航| 中国黄色片免费看| 久久精品福利| 久久国产加勒比精品无码| 久久久久在线视频| 成人晚上爱看视频| 麻豆md0077饥渴少妇| 日本黄色一区| 亚洲男女性事视频| av资源吧首页| 国产精品综合视频| 国产福利片一区二区| 成人毛片免费| 在线观看国产精品91| 狠狠人妻久久久久久综合| 黄色亚洲免费| 51午夜精品| 菠萝蜜视频国产在线播放| 欧美日韩视频在线观看一区二区三区| 中文字幕一二三四区| 中文一区在线| 国模精品娜娜一二三区| 91九色国产在线播放| 欧美精品一区二区三区在线播放| 婷婷色中文字幕| 国产精品一区二区视频| 色香蕉在线观看| 国产乱码精品一区二区三区亚洲人| 这里只有精品丝袜| 中文字幕一二三四| 中文一区在线播放| 亚洲一区二区在线视频观看| 五月开心六月丁香综合色啪| 91免费看国产| 中文在线观看免费| 精品少妇一区二区| 国产成人无码精品| 久久亚洲综合色一区二区三区| 18岁网站在线观看| 国产精品免费不| 国产国语刺激对白av不卡| 国产黄色片在线播放| 欧美日韩免费观看一区三区| 极品魔鬼身材女神啪啪精品| 麻豆精品视频在线| 国产大尺度在线观看| 中文字幕视频精品一区二区三区| 久久久欧美一区二区| 天天操天天舔天天干| 色综合久久综合网| 日韩在线一卡二卡| 成人久久18免费网站麻豆| 乱人伦xxxx国语对白| 国产免费久久| 亚洲精品日韩激情在线电影| 6699嫩草久久久精品影院| 亚洲美女中文字幕| 97人妻精品一区二区三区动漫| 一区二区三区产品免费精品久久75| 又黄又色的网站| 天堂一区二区在线免费观看| 国产成年人在线观看| 澳门精品久久国产| 国产精品av网站| v片在线观看| 日韩精品在线播放| 亚洲性生活大片| 亚洲成年人网站在线观看| 精品国产成人亚洲午夜福利| 精东粉嫩av免费一区二区三区| 99久久国产综合精品五月天喷水| 欧美日韩在线观看视频小说| 91在线在线观看| 制服诱惑亚洲| 欧美成人激情图片网| 免费在线黄色影片| 日韩一级欧美一级| 午夜精品久久久久久久蜜桃| 一区二区三区四区视频精品免费| 中文字幕在线免费看线人| 久久成人精品无人区| 蜜臀av无码一区二区三区| 久久国产电影| 久久精品日韩精品| 国产亚洲高清一区| 日韩免费黄色av| 成人性生交大片免费看在线播放| 综合网中文字幕| 手机看片一区二区| 91精品在线免费| 波多野结衣视频网址| 亚洲一区二区在线观看视频| 精品人体无码一区二区三区| 91亚洲精品久久久蜜桃| 搡的我好爽在线观看免费视频| 日韩中文字幕亚洲一区二区va在线| 污污污污污污www网站免费| 欧美激情欧美| 欧美系列一区| 欧美巨大xxxx| 国产精品久久久久久免费观看 | 欧美性生交大片免费| 免费毛片在线播放免费| 国产精品久久看| 在哪里可以看毛片| 99久久99精品久久久久久| 午夜性福利视频| 黄页视频在线91| 亚洲最大成人在线观看| 日本vs亚洲vs韩国一区三区 | 欧洲亚洲精品| 国产精品爱啪在线线免费观看| 狠狠躁少妇一区二区三区| 欧美激情一区二区三区成人 | 久久久久久女乱国产| 亚洲韩国青草视频| 欧美在线精品一区二区三区| 日韩免费视频一区二区| 国产免费高清av| 欧美另类变人与禽xxxxx| 中文字幕在线一| 欧美日韩一区久久| 一卡二卡三卡在线观看| 欧美老肥妇做.爰bbww| 亚洲一区二区影视| 欧美日韩国产a| 亚洲图片中文字幕| 91精品国产色综合久久不卡电影 | 国产精品一区二区三区99| 欧美成人乱码一二三四区免费| 秋霞午夜av一区二区三区| 超碰在线播放91| 精品一区二区三区影院在线午夜| 天天干天天爽天天射| 黑人巨大精品欧美黑白配亚洲| 亚洲欧美日韩三级| 国产一区二区在线观看免费| 无套白嫩进入乌克兰美女| 国产成人av网站| 亚洲熟女一区二区| 91麻豆swag| 懂色av蜜桃av| 亚洲日本电影在线| 久久精品视频6| 欧美性猛交xxxx富婆| 国产精品自拍第一页| 777xxx欧美| 肥臀熟女一区二区三区| 日韩高清有码在线| 午夜精品一区| 久久久久国产精品免费网站| 涩涩视频在线播放| 国产精品久久久久久久久久免费| 亚洲高清国产拍精品26u| 成人动漫在线视频| 国产欧美一区二区精品久久久| 亚洲国产成人不卡| 欧美激情亚洲| 无码无遮挡又大又爽又黄的视频| 久久精品久久综合| wwwxx日本| 日本一区二区免费在线| 欧美色图一区二区| 色婷婷av一区二区三区软件| 国产精品伦理一区| 日韩风俗一区 二区| 日本高清中文字幕在线| 欧美激情亚洲一区| 天然素人一区二区视频| 97免费资源站| 欧美精品乱码| 久久这里只有精品8| 日日噜噜夜夜狠狠视频欧美人 | 国产精品久久久久久久午夜片 | 最新亚洲视频| 五月婷婷丁香色| 99精品欧美一区二区蜜桃免费 | 亚洲一区日韩| 伊人五月天婷婷| 久久九九全国免费| 久久这里只有精品国产| 欧美调教femdomvk| 手机在线观看免费av| 久久九九免费视频| 欧美日韩大片| 国产伦精品一区二区三区| 我不卡手机影院| 久久精品免费网站| av电影在线观看不卡| 午夜免费激情视频| 欧美日韩一二区| 国产精品秘入口| 538国产精品一区二区在线| 午夜日韩影院| 伊人久久av导航| 日韩av网站在线观看| 欧美无人区码suv| 夜夜精品浪潮av一区二区三区| 中文字幕视频一区二区| 亚洲欧洲成视频免费观看| 人人澡人人添人人爽一区二区| 成人免费在线视频网址| 欧洲乱码伦视频免费| 青青草原av在线播放| 成人激情综合网站| 免看一级a毛片一片成人不卡| 欧美日韩国产高清一区| h视频在线观看免费| 国产91在线播放精品91| 日本一区福利在线| 国产精品国产对白熟妇| 国产精品一品视频| 午夜精品一区二区三区视频| 欧美婷婷六月丁香综合色| 国产在线观看免费网站| 日韩av免费在线观看| 五月激激激综合网色播| 男人日女人bb视频| 99re在线视频这里只有精品| 男女啊啊啊视频| 精品亚洲aⅴ在线观看| 蜜桃在线视频| 美日韩免费视频| 久久久www| 最近中文字幕免费| 欧美性感一类影片在线播放| 国产福利电影在线| 国产精品草莓在线免费观看| 精品久久91| 成人午夜激情av| 国产精品萝li| 国产精品国产三级国产普通话对白 | 在线视频亚洲| 成人午夜福利一区二区| 在线观看日韩毛片| 一区二区三区视频在线观看视频| 国产女人18毛片水18精品| 91成人影院| 亚洲免费观看在线| 欧美日韩视频在线| 高清av在线| 91久久精品一区| 韩日成人av| 国产交换配乱淫视频免费| 欧美亚洲一区二区在线| 黄色小网站在线观看| 国产精品一区二区三区在线观| 国产亚洲一级| www.xx日本| 亚洲成色777777在线观看影院 | 97人人干人人| 99精品国产在热久久| 日本理论中文字幕| 欧美一区午夜视频在线观看| 久久青青色综合| 欧美一区2区三区4区公司二百| 蜜臀99久久精品久久久久久软件| xxxx日本少妇| 日韩电影免费观看在线观看| 国产精品成人国产| 800av在线免费观看| 久久久久久久久一| 国产黄色片网站| 日韩av电影在线免费播放| 中文精品久久| 中文字幕一二三四区| 日韩欧美一区中文| 日韩国产激情| 影音先锋成人资源网站| 91香蕉视频mp4| av片免费播放| 国产成人欧美在线观看| 欧美日韩国产探花| 性欧美精品男男| 精品国产免费人成在线观看| av一区在线| 日韩伦理在线免费观看| 国产精品久久久久四虎| 污视频网站在线播放| 成人午夜两性视频| 久久人人精品| 国产91av视频| 久久天天躁夜夜躁狠狠躁2022| 日韩精品导航|