精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线观看视频一区二区| 99久久免费视频.com| 久久精品国产亚洲| 韩国三级在线看| 中文字幕在线官网| 亚洲视频狠狠干| 久久艳妇乳肉豪妇荡乳av| 五月激情丁香网| 国产一区二区三区四区老人| 亚洲欧美一区二区三区四区| 黄色片免费网址| 国产资源在线观看入口av| 国产视频一区二区在线观看| 成人夜晚看av| 亚洲天堂一区在线| 91成人精品视频| 日韩精品中文字| 超碰91在线播放| 日韩在线影院| 亚洲国产精品一区二区www在线| 欧美下载看逼逼| 亚洲美女综合网| 老司机精品导航| 韩剧1988免费观看全集| 午夜精品一区二区三级视频| 综合亚洲自拍| 精品国产免费人成在线观看| 在线看的黄色网址| 久久人体大尺度| 亚洲大型综合色站| 干日本少妇视频| 一本一道波多野毛片中文在线| 91在线精品一区二区| 91视频最新| 亚洲一级在线播放| 日韩中文字幕区一区有砖一区| 欧美黄色性视频| 日本一级特级毛片视频| 免费看成人哺乳视频网站| 亚洲国产精品久久久久| 在线播放第一页| 久久精品一级| 欧美精品在线视频| 国产欧美一区二| 成人国产一区| 欧美日韩国产高清一区二区三区| 一本久道综合色婷婷五月| 性欧美又大又长又硬| 五月天网站亚洲| 免费一级特黄特色毛片久久看| 免费电影视频在线看| 亚洲精品高清在线| 国产欧美精品aaaaaa片| 日本aa在线| 亚洲国产美女搞黄色| 亚洲精品少妇一区二区| xxx.xxx欧美| 亚洲电影激情视频网站| 国产日韩欧美精品在线观看| 爱福利在线视频| 黄色一区二区在线观看| 日韩精品xxxx| 日韩在线观看不卡| 欧美日韩国产精品成人| 四虎成人在线播放| 97视频一区| 亚洲精品99久久久久| 熟女俱乐部一区二区视频在线| 国产99久久精品一区二区300| 亚洲欧美综合区自拍另类| 99久久精品免费视频| 久久日文中文字幕乱码| 欧美成人精品xxx| 国产在线观看你懂的| 亚洲高清电影| 国产成人福利网站| 国产日韩久久久| 黄一区二区三区| 国产精品久久精品国产 | youjizz亚洲女人| 日韩毛片视频| 色综合男人天堂| 久久青青草视频| 蜜臀av性久久久久蜜臀aⅴ| 亚洲a中文字幕| 日韩美女一级视频| 国产精品青草综合久久久久99| 综合国产精品久久久| 蜜臀av国内免费精品久久久夜夜| 黑人狂躁日本妞一区二区三区| 爱情岛论坛亚洲首页入口章节| 欧美影院视频| 国产亚洲福利一区| 欧美黑吊大战白妞| 日韩va欧美va亚洲va久久| 91色视频在线导航| 日韩精品一二| 亚洲精品你懂的| www.av毛片| 亚洲精品成a人ⅴ香蕉片| 亚洲韩国欧洲国产日产av| www.4hu95.com四虎| 亚洲性图久久| 成人激情视频在线观看| 男同在线观看| 亚洲精品成人a在线观看| 99久久激情视频| 第一区第二区在线| 久久精品国产亚洲| 成人午夜精品视频| 99国产精品久久| 国产美女永久无遮挡| 国产亚洲人成a在线v网站| 日韩精品免费电影| 久久久久久久久久一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 国产一级二级三级精品| av网站导航在线观看免费| 91国内精品野花午夜精品| jjzzjjzz欧美69巨大| 羞羞答答成人影院www| 国产不卡在线观看| 网站黄在线观看| 亚洲最大色网站| 成年人网站av| 天天久久综合| 国产精品激情av电影在线观看| 天天干天天舔天天射| 一区二区高清视频在线观看| 国产精品区在线| 欧洲美女日日| 国产精品99久久久久久人| 四虎在线免费观看| 亚洲电影第三页| 人妻av一区二区| 亚洲手机视频| 鬼打鬼之黄金道士1992林正英| 高清全集视频免费在线| 欧美日韩精品一区二区三区| 欧美熟妇激情一区二区三区| 性伦欧美刺激片在线观看| 加勒比在线一区二区三区观看| 性欧美ⅴideo另类hd| 欧美一区午夜精品| 欧美成人精品一区二区免费看片| 国产伦精一区二区三区| 中文字幕一区二区三区四区五区人| 99热播精品免费| 日韩一区二区欧美| 夜夜骚av一区二区三区| 国产精品欧美久久久久无广告| 成年网站免费在线观看| 91亚洲国产| 91香蕉视频在线下载| 久草在线资源站资源站| 亚洲精品suv精品一区二区| av大片免费观看| 久久久久9999亚洲精品| 日本a√在线观看| 日韩国产综合| 亚洲a中文字幕| sqte在线播放| 亚洲欧美激情精品一区二区| 丰满人妻一区二区三区四区| 国产精品日韩成人| 日本少妇激三级做爰在线| 国内一区二区三区| 精品一区二区三区视频日产| 超薄肉色丝袜脚交一区二区| 日韩视频永久免费观看| 后入内射欧美99二区视频| 红桃视频成人在线观看| 亚洲av熟女国产一区二区性色| 精品一区二区三区在线视频| 日韩免费在线观看av| 欧美有码在线| 成人福利网站在线观看11| 精精国产xxxx视频在线中文版| 国产丝袜一区二区| 一级黄色短视频| 亚洲网友自拍偷拍| 三年中国中文观看免费播放| 国产在线国偷精品产拍免费yy| 日本人体一区二区| 欧美偷拍自拍| 成人高清在线观看| 日韩国产网站| 色综合视频一区中文字幕| 男人的天堂在线| 欧美一级精品在线| 中文字幕免费观看| 一区二区三区中文字幕电影| 一级黄色片大全| 国产精品影视在线| av无码精品一区二区三区| 红桃视频亚洲| 一本色道久久综合亚洲二区三区| 精品亚洲精品| 91免费国产视频| 美脚恋feet久草欧美| 欧美福利小视频| 国产在线播放av| 日韩av中文字幕在线| 99久久久国产精品无码网爆| 色猫猫国产区一区二在线视频| 黄色一级视频在线观看| 国产精品网站导航| 双性尿奴穿贞c带憋尿| 国产麻豆精品在线| 99热手机在线| 亚洲一区二区三区四区五区午夜| 欧美一级免费在线观看| 国产精品一在线观看| 精品欧美日韩在线| 88久久精品| 91免费看片在线| 国产一区二区三区影视| 57pao国产精品一区| 丰满的护士2在线观看高清| 精品国产一区av| 成人高清免费观看mv| 亚洲精品美女久久久| 丰满岳乱妇国产精品一区| 欧美丰满高潮xxxx喷水动漫| 精品一区二三区| 色88888久久久久久影院野外| 日韩欧美亚洲视频| 亚洲国产成人va在线观看天堂| 久久久久99精品成人片试看| 国产精品不卡在线观看| av永久免费观看| 国产欧美日韩三级| 在线国产视频一区| 久久久www免费人成精品| 波多野结衣先锋影音| 成人午夜电影久久影院| 欧美熟妇精品一区二区| 国产成人高清视频| 性高潮久久久久久| 国产成人在线视频网址| 亚洲精品久久久久久| 国产自产2019最新不卡| 波多野结衣中文字幕在线播放| 韩国v欧美v亚洲v日本v| 手机av在线网站| 国产精品小仙女| 中文字幕永久免费| 99免费精品在线观看| 四虎精品一区二区| 91伊人久久大香线蕉| 久久久久国产精品区片区无码| 91偷拍与自偷拍精品| 91中文字幕永久在线| 国产视频一区在线观看| 欧美成人久久久免费播放| 自拍偷拍亚洲欧美日韩| 久久久久亚洲av成人片| 亚洲动漫第一页| 国产无遮挡呻吟娇喘视频| 一本大道久久a久久精品综合| 国产99免费视频| 欧美日本乱大交xxxxx| 99久久精品国产一区二区成人| 欧美一区二区三区四区高清| 国产91免费看| 亚洲偷熟乱区亚洲香蕉av| 日本精品在线| 欧美极品欧美精品欧美视频| 91精品产国品一二三产区| 国产精品欧美激情| 国模大尺度视频一区二区| 成人一区二区三区四区| 久久91成人| 亚洲综合激情五月| 99视频一区| 五月婷婷丁香综合网| 国产91丝袜在线播放0| 国产女主播喷水高潮网红在线| 国产精品美女视频| 久久精品欧美一区二区| 91高清视频在线| 99视频在线观看免费| 亚洲精品色婷婷福利天堂| 日韩在线资源| 91精品国产乱码久久久久久蜜臀| 欧亚一区二区| 成人黄动漫网站免费| 国产精品欧美在线观看| 日韩精品一区二区三区电影| 午夜一级在线看亚洲| 亚欧精品在线视频| 91最新地址在线播放| 97在线观看视频免费| 五月天激情综合| 国产乱码久久久久| 亚洲免费电影在线观看| 怡红院在线观看| 国产成人综合久久| silk一区二区三区精品视频| 先锋影音网一区| 99在线精品免费视频九九视| 午夜一区二区视频| 久久久久久久久久美女| 青娱乐国产盛宴| 欧美日韩激情一区| 国产一级片在线| 国色天香2019中文字幕在线观看| 日韩一区中文| 日韩欧美一区二区三区四区五区| 国产一区欧美| 亚洲女人在线观看| 国产目拍亚洲精品99久久精品| 日韩大片免费在线观看| 91麻豆精品国产| wwwxxx在线观看| 日韩av第一页| 欧美1区二区| 成人性生活视频免费看| 国产精品91xxx| 日本在线一级片| 欧美日本视频在线| 成年人在线视频| 日本精品久久中文字幕佐佐木| japanese色系久久精品| 影音先锋成人资源网站| 久久爱另类一区二区小说| 国产精品久久免费观看| 日本丰满少妇一区二区三区| 青青九九免费视频在线| 欧美亚洲成人网| 四虎5151久久欧美毛片| 老太脱裤子让老头玩xxxxx| 成人白浆超碰人人人人| 国产小视频在线观看免费| 日韩欧美精品在线| 欧美24videosex性欧美| 91久色国产| 国内揄拍国内精品久久| 国产sm在线观看| 亚洲国产精品自拍| 色噜噜在线播放| 欧美亚洲日本黄色| 国产成人手机高清在线观看网站| 日韩av黄色网址| 久久精品综合网| 亚洲精品国产无码| 最近中文字幕日韩精品| 久久精品97| 经典三级在线视频| 国产乱对白刺激视频不卡| 欧美日韩免费做爰视频| 精品动漫一区二区三区在线观看| 538在线视频| 免费观看成人在线| 丝瓜av网站精品一区二区| 国产精品国产三级国产专业不| 色美美综合视频| 黄色片免费在线观看| 99超碰麻豆| 国产欧美日本| 三区四区在线观看| 51精品国自产在线| 黄网站在线观| 免费精品视频一区二区三区| 日韩精品亚洲一区二区三区免费| 亚洲毛片亚洲毛片亚洲毛片| 91精品国产综合久久精品图片| 日韩另类在线| 欧美中文娱乐网| 国产美女娇喘av呻吟久久| 日韩欧美大片在线观看| 亚洲小视频在线观看| 国产色99精品9i| 黄色一级片在线看| 国产精品欧美综合在线| 蜜桃在线一区二区| 日韩免费观看在线观看| 久久精品影视| 午夜一区二区三区免费| 欧美精品日韩综合在线| 久久国产精品黑丝| 亚洲精美视频| 成人性生交大合| 一区二区三区播放| 97在线免费观看| 一区二区三区四区电影| 亚洲最大的黄色网| 91精品婷婷国产综合久久竹菊| mm视频在线视频| 在线视频一区观看| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产成人调教视频在线观看| 日韩精品视频网址| 欧美综合视频在线观看| 国产乱妇乱子在线播视频播放网站| 欧美日韩精品久久久免费观看| 国产精品18久久久久久久久| 国产精品视频123| 国语对白做受69| 亚洲成人一区|