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

【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡GoogLeNet

人工智能 深度學習 開發工具
前面講了LeNet、AlexNet和Vgg,這周來講講GoogLeNet。GoogLeNet是由google的Christian Szegedy等人在2014年的論文《Going Deeper with Convolutions》提出,其最大的亮點是提出一種叫Inception的結構,以此為基礎構建GoogLeNet,并在當年的ImageNet分類和檢測任務中獲得第一

前面講了LeNet、AlexNet和Vgg,這周來講講GoogLeNet。GoogLeNet是由google的Christian Szegedy等人在2014年的論文《Going Deeper with Convolutions》提出,其***的亮點是提出一種叫Inception的結構,以此為基礎構建GoogLeNet,并在當年的ImageNet分類和檢測任務中獲得***,ps:GoogLeNet的取名是為了向YannLeCun的LeNet系列致敬。

(本系列所有代碼均在github:https://github.com/huxiaoman7/PaddlePaddle_code)


關于深度網絡的一些思考

  在本系列最開始的幾篇文章我們講到了卷積神經網絡,設計的網絡結構也非常簡單,屬于淺層神經網絡,如三層的卷積神經網絡等,但是在層數比較少的時候,有時候效果往往并沒有那么好,在實驗過程中發現,當我們嘗試增加網絡的層數,或者增加每一層網絡的神經元個數的時候,對準確率有一定的提升,簡單的說就是增加網絡的深度與寬度,但這樣做有兩個明顯的缺點:

  •  更深更寬的網絡意味著更多的參數,提高了模型的復雜度,從而大大增加過擬合的風險,尤其在訓練數據不是那么多或者某個label訓練數據不足的情況下更容易發生;
  • 增加計算資源的消耗,實際情況下,不管是因為數據稀疏還是擴充的網絡結構利用不充分(比如很多權重接近0),都會導致大量計算的浪費。

  解決以上兩個問題的基本方法是將全連接或卷積連接改為稀疏連接。不管從生物的角度還是機器學習的角度,稀疏性都有良好的表現,回想一下在講AlexNet這一節提出的Dropout網絡以及ReLU激活函數,其本質就是利用稀疏性提高模型泛化性(但需要計算的參數沒變少)。 
簡單解釋下稀疏性,當整個特征空間是非線性甚至不連續時:

  •  學好局部空間的特征集更能提升性能,類似于Maxout網絡中使用多個局部線性函數的組合來擬合非線性函數的思想;
  • 假設整個特征空間由N個不連續局部特征空間集合組成,任意一個樣本會被映射到這N個空間中并激活/不激活相應特征維度,如果用C1表示某類樣本被激活的特征維度集合,用C2表示另一類樣本的特征維度集合,當數據量不夠大時,要想增加特征區分度并很好的區分兩類樣本,就要降低C1和C2的重合度(比如可用Jaccard距離衡量),即縮小C1和C2的大小,意味著相應的特征維度集會變稀疏。

  不過尷尬的是,現在的計算機體系結構更善于稠密數據的計算,而在非均勻分布的稀疏數據上的計算效率極差,比如稀疏性會導致的緩存miss率極高,于是需要一種方法既能發揮稀疏網絡的優勢又能保證計算效率。好在前人做了大量實驗(如《On Two-Dimensional Sparse Matrix Partitioning: Models, Methods, and a Recipe》),發現對稀疏矩陣做聚類得到相對稠密的子矩陣可以大幅提高稀疏矩陣乘法性能,借鑒這個思想,作者提出Inception的結構。

 

 圖1 Inception結構

  • 把不同大小卷積核抽象得到的特征空間看做子特征空間,每個子特征空間都是稀疏的,把這些不同尺度特征做融合,相當于得到一個相對稠密的空間;
  • 采用1×1、3×3、5×5卷積核(不是必須的,也可以是其他大小),stride取1,利用padding可以方便的做輸出特征維度對齊;
  • 大量事實表明pooling層能有效提高卷積網絡的效果,所以加了一條max pooling路徑;
  • 這個結構符合直觀理解,視覺信息通過不同尺度的變換被聚合起來作為下一階段的特征,比如:人的高矮、胖瘦、青老信息被聚合后做下一步判斷。

這個網絡的***問題是5×5卷積帶來了巨大計算負擔,例如,假設上層輸入為:28×28×192:

  • 直接經過96個5×5卷積層(stride=1,padding=2)后,輸出為:28×28×96,卷積層參數量為:192×5×5×96=460800;
  • 借鑒NIN網絡(Network in Network,后續會講),在5×5卷積前使用32個1×1卷積核做維度縮減,變成28×28×32,之后經過96個5×5卷積層(stride=1,padding=2)后,輸出為:28×28×96,但所有卷積層的參數量為:192×1×1×32+32×5×5×96=82944,可見整個參數量是原來的1/5.5,且效果上沒有多少損失。 
    新網絡結構為

 

 圖2 新Inception結構

 


 GoogLeNet網絡結構

  利用上述Inception模塊構建GoogLeNet,實驗表明Inception模塊出現在高層特征抽象時會更加有效(我理解由于其結構特點,更適合提取高階特征,讓它提取低階特征會導致特征信息丟失),所以在低層依然使用傳統卷積層。整個網路結構如下:

 圖3 GoogLeNet網絡結構

 

 圖4 GoogLeNet詳細網絡結構示意圖

網絡說明:

  • 所有卷積層均使用ReLU激活函數,包括做了1×1卷積降維后的激活;
  • 移除全連接層,像NIN一樣使用Global Average Pooling,使得Top 1準確率提高0.6%,但由于GAP與類別數目有關系,為了方便大家做模型fine-tuning,***加了一個全連接層;
  • 與前面的ResNet類似,實驗觀察到,相對淺層的神經網絡層對模型效果有較大的貢獻,訓練階段通過對Inception(4a、4d)增加兩個額外的分類器來增強反向傳播時的梯度信號,但最重要的還是正則化作用,這一點在GoogLeNet v3中得到實驗證實,并間接證實了GoogLeNet V2中BN的正則化作用,這兩個分類器的loss會以0.3的權重加在整體loss上,在模型inference階段,這兩個分類器會被去掉;
  • 用于降維的1×1卷積核個數為128個;
  • 全連接層使用1024個神經元;
  • 使用丟棄概率為0.7的Dropout層;

網絡結構詳細說明: 

  輸入數據為224×224×3的RGB圖像,圖中"S"代表做same-padding,"V"代表不做。

  • C1卷積層:64個7×7卷積核(stride=2,padding=3),輸出為:112×112×64;
  • P1抽樣層:64個3×3卷積核(stride=2),輸出為56×56×64,其中:56=(112-3+1)/2+1
  • C2卷積層:192個3×3卷積核(stride=1,padding=1),輸出為:56×56×192;
  • P2抽樣層:192個3×3卷積核(stride=2),輸出為28×28×192,其中:28=(56-3+1)/2+1,接著數據被分出4個分支,進入Inception (3a)
  • Inception (3a):由4部分組成 
    • 64個1×1的卷積核,輸出為28×28×64;
    • 96個1×1的卷積核做降維,輸出為28×28×96,之后128個3×3卷積核(stride=1,padding=1),輸出為:28×28×128
    • 16個1×1的卷積核做降維,輸出為28×28×16,之后32個5×5卷積核(stride=1,padding=2),輸出為:28×28×32
    • 192個3×3卷積核(stride=1,padding=1),輸出為28×28×192,進行32個1×1卷積核,輸出為:28×28×32 
      ***對4個分支的輸出做“深度”方向組合,得到輸出28×28×256,接著數據被分出4個分支,進入Inception (3b);
  • Inception (3b):由4部分組成 
    • 128個1×1的卷積核,輸出為28×28×128;
    • 128個1×1的卷積核做降維,輸出為28×28×128,進行192個3×3卷積核(stride=1,padding=1),輸出為:28×28×192
    • 32個1×1的卷積核做降維,輸出為28×28×32,進行96個5×5卷積核(stride=1,padding=2),輸出為:28×28×96
    • 256個3×3卷積核(stride=1,padding=1),輸出為28×28×256,進行64個1×1卷積核,輸出為:28×28×64 
      ***對4個分支的輸出做“深度”方向組合,得到輸出28×28×480; 
      后面結構以此類推。

 


用PaddlePaddle實現GoogLeNet

  1.網絡結構 googlenet.py

  在PaddlePaddle的models下面,有關于GoogLeNet的實現代碼,大家可以直接學習拿來跑一下:

  1. 1 import paddle.v2 as paddle 
  2.   2  
  3.   3 __all__ = ['googlenet'
  4.   4  
  5.   5  
  6.   6 def inception(name, input, channels, filter1, filter3R, filter3, filter5R, 
  7.   7               filter5, proj): 
  8.   8     cov1 = paddle.layer.img_conv( 
  9.   9         name=name + '_1'
  10.  10         input=input, 
  11.  11         filter_size=1, 
  12.  12         num_channels=channels, 
  13.  13         num_filters=filter1, 
  14.  14         stride=1, 
  15.  15         padding=0) 
  16.  16  
  17.  17     cov3r = paddle.layer.img_conv( 
  18.  18         name=name + '_3r'
  19.  19         input=input, 
  20.  20         filter_size=1, 
  21.  21         num_channels=channels, 
  22.  22         num_filters=filter3R, 
  23.  23         stride=1, 
  24.  24         padding=0) 
  25.  25     cov3 = paddle.layer.img_conv( 
  26.  26         name=name + '_3'
  27.  27         input=cov3r, 
  28.  28         filter_size=3, 
  29.  29         num_filters=filter3, 
  30.  30         stride=1, 
  31.  31         padding=1) 
  32.  32  
  33.  33     cov5r = paddle.layer.img_conv( 
  34.  34         name=name + '_5r'
  35.  35         input=input, 
  36.  36         filter_size=1, 
  37.  37         num_channels=channels, 
  38.  38         num_filters=filter5R, 
  39.  39         stride=1, 
  40.  40         padding=0) 
  41.  41     cov5 = paddle.layer.img_conv( 
  42.  42         name=name + '_5'
  43.  43         input=cov5r, 
  44.  44         filter_size=5, 
  45.  45         num_filters=filter5, 
  46.  46         stride=1, 
  47.  47         padding=2) 
  48.  48  
  49.  49     pool1 = paddle.layer.img_pool( 
  50.  50         name=name + '_max'
  51.  51         input=input, 
  52.  52         pool_size=3, 
  53.  53         num_channels=channels, 
  54.  54         stride=1, 
  55.  55         padding=1) 
  56.  56     covprj = paddle.layer.img_conv( 
  57.  57         name=name + '_proj'
  58.  58         input=pool1, 
  59.  59         filter_size=1, 
  60.  60         num_filters=proj, 
  61.  61         stride=1, 
  62.  62         padding=0) 
  63.  63  
  64.  64     cat = paddle.layer.concat(name=name, input=[cov1, cov3, cov5, covprj]) 
  65.  65     return cat 
  66.  66  
  67.  67  
  68.  68 def googlenet(input, class_dim): 
  69.  69     # stage 1 
  70.  70     conv1 = paddle.layer.img_conv( 
  71.  71         name="conv1"
  72.  72         input=input, 
  73.  73         filter_size=7, 
  74.  74         num_channels=3, 
  75.  75         num_filters=64, 
  76.  76         stride=2, 
  77.  77         padding=3) 
  78.  78     pool1 = paddle.layer.img_pool( 
  79.  79         name="pool1", input=conv1, pool_size=3, num_channels=64, stride=2) 
  80.  80  
  81.  81     # stage 2 
  82.  82     conv2_1 = paddle.layer.img_conv( 
  83.  83         name="conv2_1"
  84.  84         input=pool1, 
  85.  85         filter_size=1, 
  86.  86         num_filters=64, 
  87.  87         stride=1, 
  88.  88         padding=0) 
  89.  89     conv2_2 = paddle.layer.img_conv( 
  90.  90         name="conv2_2"
  91.  91         input=conv2_1, 
  92.  92         filter_size=3, 
  93.  93         num_filters=192, 
  94.  94         stride=1, 
  95.  95         padding=1) 
  96.  96     pool2 = paddle.layer.img_pool( 
  97.  97         name="pool2", input=conv2_2, pool_size=3, num_channels=192, stride=2) 
  98.  98  
  99.  99     # stage 3 
  100. 100     ince3a = inception("ince3a", pool2, 192, 64, 96, 128, 16, 32, 32) 
  101. 101     ince3b = inception("ince3b", ince3a, 256, 128, 128, 192, 32, 96, 64) 
  102. 102     pool3 = paddle.layer.img_pool( 
  103. 103         name="pool3", input=ince3b, num_channels=480, pool_size=3, stride=2) 
  104. 104  
  105. 105     # stage 4 
  106. 106     ince4a = inception("ince4a", pool3, 480, 192, 96, 208, 16, 48, 64) 
  107. 107     ince4b = inception("ince4b", ince4a, 512, 160, 112, 224, 24, 64, 64) 
  108. 108     ince4c = inception("ince4c", ince4b, 512, 128, 128, 256, 24, 64, 64) 
  109. 109     ince4d = inception("ince4d", ince4c, 512, 112, 144, 288, 32, 64, 64) 
  110. 110     ince4e = inception("ince4e", ince4d, 528, 256, 160, 320, 32, 128, 128) 
  111. 111     pool4 = paddle.layer.img_pool( 
  112. 112         name="pool4", input=ince4e, num_channels=832, pool_size=3, stride=2) 
  113. 113  
  114. 114     # stage 5 
  115. 115     ince5a = inception("ince5a", pool4, 832, 256, 160, 320, 32, 128, 128) 
  116. 116     ince5b = inception("ince5b", ince5a, 832, 384, 192, 384, 48, 128, 128) 
  117. 117     pool5 = paddle.layer.img_pool( 
  118. 118         name="pool5"
  119. 119         input=ince5b, 
  120. 120         num_channels=1024, 
  121. 121         pool_size=7, 
  122. 122         stride=7, 
  123. 123         pool_type=paddle.pooling.Avg()) 
  124. 124     dropout = paddle.layer.addto( 
  125. 125         input=pool5, 
  126. 126         layer_attr=paddle.attr.Extra(drop_rate=0.4), 
  127. 127         act=paddle.activation.Linear()) 
  128. 128  
  129. 129     out = paddle.layer.fc( 
  130. 130         input=dropout, size=class_dim, act=paddle.activation.Softmax()) 
  131. 131  
  132. 132     # fc for output 1 
  133. 133     pool_o1 = paddle.layer.img_pool( 
  134. 134         name="pool_o1"
  135. 135         input=ince4a, 
  136. 136         num_channels=512, 
  137. 137         pool_size=5, 
  138. 138         stride=3, 
  139. 139         pool_type=paddle.pooling.Avg()) 
  140. 140     conv_o1 = paddle.layer.img_conv( 
  141. 141         name="conv_o1"
  142. 142         input=pool_o1, 
  143. 143         filter_size=1, 
  144. 144         num_filters=128, 
  145. 145         stride=1, 
  146. 146         padding=0) 
  147. 147     fc_o1 = paddle.layer.fc( 
  148. 148         name="fc_o1"
  149. 149         input=conv_o1, 
  150. 150         size=1024, 
  151. 151         layer_attr=paddle.attr.Extra(drop_rate=0.7), 
  152. 152         act=paddle.activation.Relu()) 
  153. 153     out1 = paddle.layer.fc( 
  154. 154         input=fc_o1, size=class_dim, act=paddle.activation.Softmax()) 
  155. 155  
  156. 156     # fc for output 2 
  157. 157     pool_o2 = paddle.layer.img_pool( 
  158. 158         name="pool_o2"
  159. 159         input=ince4d, 
  160. 160         num_channels=528, 
  161. 161         pool_size=5, 
  162. 162         stride=3, 
  163. 163         pool_type=paddle.pooling.Avg()) 
  164. 164     conv_o2 = paddle.layer.img_conv( 
  165. 165         name="conv_o2"
  166. 166         input=pool_o2, 
  167. 167         filter_size=1, 
  168. 168         num_filters=128, 
  169. 169         stride=1, 
  170. 170         padding=0) 
  171. 171     fc_o2 = paddle.layer.fc( 
  172. 172         name="fc_o2"
  173. 173         input=conv_o2, 
  174. 174         size=1024, 
  175. 175         layer_attr=paddle.attr.Extra(drop_rate=0.7), 
  176. 176         act=paddle.activation.Relu()) 
  177. 177     out2 = paddle.layer.fc( 
  178. 178         input=fc_o2, size=class_dim, act=paddle.activation.Softmax()) 
  179. 179  
  180. 180     return out, out1, out2 

 

  2.訓練模型

  1. 1 import gzip 
  2.   2 import paddle.v2.dataset.flowers as flowers 
  3.   3 import paddle.v2 as paddle 
  4.   4 import reader 
  5.   5 import vgg 
  6.   6 import resnet 
  7.   7 import alexnet 
  8.   8 import googlenet 
  9.   9 import argparse 
  10.  10  
  11.  11 DATA_DIM = 3 * 224 * 224 
  12.  12 CLASS_DIM = 102 
  13.  13 BATCH_SIZE = 128 
  14.  14  
  15.  15  
  16.  16 def main(): 
  17.  17     # parse the argument 
  18.  18     parser = argparse.ArgumentParser() 
  19.  19     parser.add_argument( 
  20.  20         'model'
  21.  21         help='The model for image classification'
  22.  22         choices=['alexnet''vgg13''vgg16''vgg19''resnet''googlenet']) 
  23.  23     args = parser.parse_args() 
  24.  24  
  25.  25     # PaddlePaddle init 
  26.  26     paddle.init(use_gpu=True, trainer_count=7) 
  27.  27  
  28.  28     image = paddle.layer.data( 
  29.  29         name="image", type=paddle.data_type.dense_vector(DATA_DIM)) 
  30.  30     lbl = paddle.layer.data( 
  31.  31         name="label", type=paddle.data_type.integer_value(CLASS_DIM)) 
  32.  32  
  33.  33     extra_layers = None 
  34.  34     learning_rate = 0.01 
  35.  35     if args.model == 'alexnet'
  36.  36         out = alexnet.alexnet(image, class_dim=CLASS_DIM) 
  37.  37     elif args.model == 'vgg13'
  38.  38         out = vgg.vgg13(image, class_dim=CLASS_DIM) 
  39.  39     elif args.model == 'vgg16'
  40.  40         out = vgg.vgg16(image, class_dim=CLASS_DIM) 
  41.  41     elif args.model == 'vgg19'
  42.  42         out = vgg.vgg19(image, class_dim=CLASS_DIM) 
  43.  43     elif args.model == 'resnet'
  44.  44         out = resnet.resnet_imagenet(image, class_dim=CLASS_DIM) 
  45.  45         learning_rate = 0.1 
  46.  46     elif args.model == 'googlenet'
  47.  47         out, out1, out2 = googlenet.googlenet(image, class_dim=CLASS_DIM) 
  48.  48         loss1 = paddle.layer.cross_entropy_cost( 
  49.  49             input=out1, label=lbl, coeff=0.3) 
  50.  50         paddle.evaluator.classification_error(input=out1, label=lbl) 
  51.  51         loss2 = paddle.layer.cross_entropy_cost( 
  52.  52             input=out2, label=lbl, coeff=0.3) 
  53.  53         paddle.evaluator.classification_error(input=out2, label=lbl) 
  54.  54         extra_layers = [loss1, loss2] 
  55.  55  
  56.  56     cost = paddle.layer.classification_cost(input=out, label=lbl) 
  57.  57  
  58.  58     # Create parameters 
  59.  59     parameters = paddle.parameters.create(cost) 
  60.  60  
  61.  61     # Create optimizer 
  62.  62     optimizer = paddle.optimizer.Momentum( 
  63.  63         momentum=0.9, 
  64.  64         regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 
  65.  65                                                          BATCH_SIZE), 
  66.  66         learning_rate=learning_rate / BATCH_SIZE, 
  67.  67         learning_rate_decay_a=0.1, 
  68.  68         learning_rate_decay_b=128000 * 35, 
  69.  69         learning_rate_schedule="discexp", ) 
  70.  70  
  71.  71     train_reader = paddle.batch( 
  72.  72         paddle.reader.shuffle( 
  73.  73             flowers.train(), 
  74.  74             # To use other data, replace the above line with
  75.  75             # reader.train_reader('train.list'), 
  76.  76             buf_size=1000), 
  77.  77         batch_size=BATCH_SIZE) 
  78.  78     test_reader = paddle.batch( 
  79.  79         flowers.valid(), 
  80.  80         # To use other data, replace the above line with
  81.  81         # reader.test_reader('val.list'), 
  82.  82         batch_size=BATCH_SIZE) 
  83.  83  
  84.  84     # Create trainer 
  85.  85     trainer = paddle.trainer.SGD( 
  86.  86         cost=cost, 
  87.  87         parameters=parameters, 
  88.  88         update_equation=optimizer, 
  89.  89         extra_layers=extra_layers) 
  90.  90  
  91.  91     # End batch and end pass event handler 
  92.  92     def event_handler(event): 
  93.  93         if isinstance(event, paddle.event.EndIteration): 
  94.  94             if event.batch_id % 1 == 0: 
  95.  95                 print "\nPass %d, Batch %d, Cost %f, %s" % ( 
  96.  96                     event.pass_id, event.batch_id, event.cost, event.metrics) 
  97.  97         if isinstance(event, paddle.event.EndPass): 
  98.  98             with gzip.open('params_pass_%d.tar.gz' % event.pass_id, 'w'as f: 
  99.  99                 trainer.save_parameter_to_tar(f) 
  100. 100  
  101. 101             result = trainer.test(reader=test_reader) 
  102. 102             print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics) 
  103. 103  
  104. 104     trainer.train( 
  105. 105         reader=train_reader, num_passes=200, event_handler=event_handler) 
  106. 106  
  107. 107  
  108. 108 if __name__ == '__main__'
  109. 109     main() 
 

  3.運行方式

  1. 1 python train.py googlenet 

  其中***的googlenet是可選的網絡模型,輸入其他的網絡模型,如alexnet、vgg3、vgg6等就可以用不同的網絡結構來訓練了。

 


 用Tensorflow實現GoogLeNet

  tensorflow的實現在models里有非常詳細的代碼,這里就不全部貼出來了,大家可以在models/research/slim/nets里詳細看看,關于InceptionV1~InceptionV4的實現都有。

ps:這里的slim不是tensorflow的contrib下的slim,是models下的slim,別弄混了,slim可以理解為Tensorflow的一個高階api,在構建這些復雜的網絡結構時,可以直接調用slim封裝好的網絡結構就可以了,而不需要從頭開始寫整個網絡結構。關于slim的詳細大家可以在網上搜索,非常方便。

 


 總結

  其實GoogLeNet的最關鍵的一點就是提出了Inception結構,這有個什么好處呢,原來你想要提高準確率,需要堆疊更深的層,增加神經元個數等,堆疊到一定層可能結果的準確率就提不上去了,因為參數更多了啊,模型更復雜,更容易過擬合了,但是在實驗中轉向了更稀疏但是更精密的結構同樣可以達到很好的效果,說明我們可以照著這個思路走,繼續做,所以后面會有InceptionV2 ,V3,V4等,它表現的結果也非常好。給我們傳統的通過堆疊層提高準確率的想法提供了一個新的思路。

責任編輯:張燕妮 來源: www.cnblogs.com
相關推薦

2018-04-16 11:30:32

深度學習

2018-04-11 09:30:41

深度學習

2018-04-18 09:39:07

深度學習

2018-04-09 10:20:32

深度學習

2018-03-26 20:14:32

深度學習

2018-04-04 10:19:32

深度學習

2018-04-02 10:45:11

深度學習PaddlePaddl手寫數字識別

2017-08-10 15:31:57

Apache Spar TensorFlow

2018-03-26 20:07:25

深度學習

2018-03-26 21:31:30

深度學習

2018-03-26 21:26:50

深度學習

2018-03-26 20:04:16

深度學習

2018-03-26 20:00:32

深度學習

2017-12-01 15:24:04

TensorFlow深度學習教程

2017-05-22 13:15:45

TensorFlow深度學習

2018-04-03 11:20:00

深度學習

2017-05-12 16:25:44

深度學習圖像補全tensorflow

2018-03-09 22:56:52

PaddlePaddl

2018-02-07 16:13:00

深度學習

2018-12-12 09:12:54

深度學習百度PaddlePaddl
點贊
收藏

51CTO技術棧公眾號

超碰国产一区| 黄色美女网站在线观看| 国产精品大片免费观看| 国产视频精品在线| 成人免费在线观看视频网站| 久久国产精品一区| 成人免费精品视频| 国产精品麻豆va在线播放| 国产大片免费看| 羞羞色国产精品网站| 欧美色区777第一页| 欧美极品少妇无套实战| 手机看片1024国产| 狠狠色综合色综合网络| 国产91精品久久久久| 自拍偷拍第9页| 成人在线tv视频| 欧美日韩国产一区二区三区地区| 亚洲精品久久久久久久蜜桃臀| 猫咪在线永久网站| 国产69精品久久777的优势| 国产精品第二页| 国产大片中文字幕| 91精品啪在线观看国产18| 日韩av中文字幕在线免费观看| 日韩中文字幕a| 天堂av中文在线观看| 亚洲欧美自拍偷拍色图| 涩涩涩999| 天天干天天操av| 国产伦精品一区二区三区免费 | 久cao在线| 2020日本不卡一区二区视频| 成人午夜电影在线播放| 一级黄色a视频| 丝袜美腿成人在线| 欧美性资源免费| xxxxxx国产| 综合一区在线| 久久国内精品一国内精品| 人妻少妇无码精品视频区| 老汉色老汉首页av亚洲| 日韩精品一区二区三区视频播放| 成人免费网站入口| 麻豆av在线导航| 国产精品人妖ts系列视频| 欧美久久久久久久| 日本天堂在线| 97精品久久久午夜一区二区三区 | 岳的好大精品一区二区三区| 亚洲国产成人久久综合一区| av影片在线播放| 久久国际精品| 日韩欧美在线观看一区二区三区| 亚洲久久中文字幕| 欧美啪啪网站| 欧美夫妻性生活| 国产乱码一区二区三区四区| 日韩福利在线观看| 欧美精品久久99久久在免费线| 色婷婷狠狠18| 中文字幕日本一区| 日韩午夜激情电影| 亚洲美女精品视频| 久久精品亚洲成在人线av网址| 精品成人免费观看| 中文字幕一区三区久久女搜查官| 女仆av观看一区| 精品亚洲国产成av人片传媒| 亚洲第一香蕉网| 神马电影久久| 伊人久久大香线蕉av一区二区| 人妻互换一区二区激情偷拍| 日韩精品一卡| 久久成人免费视频| 国产午夜福利片| 国产精品一二| 国产精品一区二区久久久 | 精品va天堂亚洲国产| www.555国产精品免费| 牛牛视频精品一区二区不卡| 亚洲香蕉av在线一区二区三区| 性の欲びの女javhd| 91综合久久| 九九视频直播综合网| 国产无码精品视频| 丝袜诱惑制服诱惑色一区在线观看| 国产成人免费av| 97在线播放免费观看| 国产高清亚洲一区| 久久久久久草| 欧美一级二级三级区| 一区二区免费看| 国产精品沙发午睡系列| 欧美另类激情| 亚洲精品电影久久久| 中文幕无线码中文字蜜桃| 日韩国产欧美| 国内精久久久久久久久久人| 中文字幕在线观看视频免费| 国产一区二区影院| 久久久av水蜜桃| 免费在线午夜视频| 精品国产999| 亚洲免费黄色录像| 视频小说一区二区| 久久人人爽人人爽爽久久 | 欧美日韩在线播放三区| 国产麻豆剧传媒精品国产| 国产成人精品三级高清久久91| 精品国产欧美成人夜夜嗨| 国产成人在线视频观看| 国产综合久久久久久鬼色| 欧美男人的天堂| 福利成人导航| 欧美久久久久中文字幕| 亚洲精品乱码久久| 永久91嫩草亚洲精品人人| 日韩美女在线观看一区| 亚洲精品国产片| 国产精品毛片高清在线完整版| 国产玉足脚交久久欧美| 日韩免费大片| 一区二区三区日韩在线| 黄色一级片免费看| 国产激情视频一区二区在线观看| 日韩经典在线视频| 国产在线精彩视频| 精品精品欲导航| 99视频只有精品| 麻豆精品视频在线观看免费| 蜜桃传媒视频第一区入口在线看| 精灵使的剑舞无删减版在线观看| 精品视频123区在线观看| 国产精品亚洲无码| 亚洲精品一二| 国产传媒一区二区三区| av在线导航| 91麻豆精品国产综合久久久久久| 久久久免费看片| 日韩vs国产vs欧美| 日韩精品一线二线三线| 亚洲精品福利电影| 日韩精品极品视频| 免费观看一区二区三区毛片| 成人国产精品视频| 欧美久久在线观看| 精品国产一区二区三区成人影院 | 日韩欧美一级特黄在线播放| 国产色无码精品视频国产| 青娱乐精品视频在线| 日本a级片久久久| 日韩一级二级| 色先锋资源久久综合5566| 波多野结衣电影在线播放| 久久精品夜色噜噜亚洲a∨| 女人扒开屁股爽桶30分钟| 欧美日韩精品一区二区三区在线观看| 久久青草福利网站| 网站黄在线观看| 欧美午夜视频在线观看| 在线免费观看成年人视频| 欧美亚洲一级| 日韩中文字幕一区| 伊人久久大香| 欧美成人免费全部观看天天性色| 国产偷拍一区二区| 亚洲资源中文字幕| 国产又黄又粗又猛又爽的视频| 在线亚洲自拍| 欧美一区1区三区3区公司| 日韩av超清在线观看| www.日韩系列| 国产精品国产三级国产普通话对白| 亚洲免费在线视频一区 二区| 亚洲成人福利视频| 亚洲免费影院| 亚洲乱码一区二区三区| 日韩影片在线观看| 欧美亚洲国产视频小说| 国产小视频免费在线观看| 欧美久久一二区| 免费毛片一区二区三区| 久久久www成人免费无遮挡大片| 在线免费视频a| 亚洲女同中文字幕| 久久本道综合色狠狠五月| 高清欧美日韩| 国内精品400部情侣激情| 国产在线视频资源| 91精品国产高清一区二区三区蜜臀| 国产精品99无码一区二区| 久久久久久久性| 中文字幕55页| 久久一区视频| 菠萝蜜视频在线观看入口| 久久99高清| 亚洲自拍偷拍视频| 综合在线影院| 欧美成人合集magnet| 久久伊伊香蕉| 欧美一区二区女人| 天堂网免费视频| 一级中文字幕一区二区| 日本欧美一区二区三区不卡视频| 国产·精品毛片| 欧美伦理片在线观看| 最新日韩在线| 中文字幕av导航| 少妇精品久久久一区二区| 99久热re在线精品996热视频 | 欧美午夜女人视频在线| 国产女人18水真多毛片18精品| 久久久亚洲精品石原莉奈| 伊人成人免费视频| 免费高清在线视频一区·| 欧美日本视频在线观看| 亚洲精品tv久久久久久久久久| 久久久婷婷一区二区三区不卡| 激情不卡一区二区三区视频在线| 日韩av电影手机在线观看| 久久香蕉av| 欧美成人小视频| 日本在线观看网站| 亚洲午夜久久久影院| 三级无遮挡在线观看| 精品国产欧美一区二区| 国产精品国产精品国产专区| 欧美视频在线一区| 免费无码国产精品| 午夜精品123| 欧美精品乱码视频一二专区| 中文字幕制服丝袜一区二区三区| b站大片免费直播| 91美女在线视频| 日本一区二区免费视频| 国产精品一区二区男女羞羞无遮挡| 少妇一级淫免费放| 日韩精品福利网| 日韩视频在线免费看| 国产精品久久久免费| 男人添女人下部高潮视频在观看| 欧美久久成人| 黄色特一级视频| 欧美69视频| 91精品国产吴梦梦| 女主播福利一区| 日韩一级特黄毛片| 欧美三级黄美女| 国产a级黄色大片| 亚洲网站啪啪| 亚洲熟妇无码一区二区三区导航| 精品999成人| 日韩av在线播放不卡| 亚洲第一网站| www.爱色av.com| 手机精品视频在线观看| 国产又粗又长又大的视频| 日韩福利视频导航| 一区二区三区 日韩| 九色porny丨国产精品| 欧美成人乱码一二三四区免费| 毛片不卡一区二区| 特级黄色片视频| www.日韩大片| 免费看污黄网站在线观看| 国产午夜精品美女毛片视频| 天天操天天干天天操天天干| 亚洲国产精品成人综合| 国产免费美女视频| 一区二区三区在线视频免费| 男人天堂中文字幕| 日本二三区不卡| 91影院在线播放| 日韩视频免费直播| 四虎精品成人影院观看地址| 亚洲香蕉在线观看| 91极品在线| 欧美中文在线字幕| 日韩免费在线电影| 国产麻豆一区二区三区在线观看| 亚洲精品无吗| 26uuu成人| 亚洲三级视频| 亚洲欧美日韩一级| 成人一区二区三区| 69视频在线观看免费| 亚洲色图第一区| 日本韩国欧美中文字幕| 欧美日本在线看| 日本免费一区视频| 日韩中文字幕欧美| 国产蜜臀一区二区打屁股调教| 日本最新高清不卡中文字幕| 日本欧美在线| 久久草.com| 亚洲国产精品成人| 97视频在线免费播放| 国产一级精品在线| 亚洲色成人网站www永久四虎 | 日韩三级免费看| 欧美熟乱第一页| 日本激情视频网站| 久久亚洲精品毛片| 欧美日韩123区| 99视频免费观看蜜桃视频| 欧美偷拍综合| 欧美视频在线免费播放| 韩国午夜理伦三级不卡影院| 久久久久麻豆v国产精华液好用吗| 国产精品国产三级国产普通话三级| 国产一级一级片| 欧美人与z0zoxxxx视频| 日本1级在线| 欧美激情亚洲激情| 在线成人免费| 日韩在线电影一区| 亚洲欧美久久| 丰满少妇xbxb毛片日本| 亚洲三级电影网站| 中文字幕人妻丝袜乱一区三区 | 欧美大片免费播放器| 亚洲欧美日韩久久精品| 亚洲精品一区二区二区| 精品中文视频在线| 九色porny自拍视频在线播放| 亚洲资源在线看| 香蕉精品视频在线观看| 我要看一级黄色大片| 久久综合久久鬼色| 91久久国产视频| 欧美精品一区二区不卡| av毛片在线看| 91最新在线免费观看| 97精品国产福利一区二区三区| 日本www高清视频| 久久久久久久国产精品影院| www亚洲视频| 亚洲男人天堂视频| 在线手机中文字幕| 久久久99国产精品免费| 国产精品综合| 精品人妻无码一区二区三区| 亚洲h在线观看| 丰满人妻熟女aⅴ一区| 九色成人免费视频| 99久热这里只有精品视频免费观看| 日韩精品第1页| 国产一区二区按摩在线观看| 欧美第一页在线观看| 91精品国产综合久久香蕉麻豆 | 亚洲欧美偷拍卡通变态| 国产免费黄色网址| 精品综合久久久久久97| 伊人精品综合| 日日摸日日碰夜夜爽无码| av在线综合网| 成年人av网站| 中文日韩在线观看| 欧洲美女精品免费观看视频| 欧美日韩一级在线| 国产高清久久久| 日本视频www| 亚洲精品视频在线播放| 日韩欧美一区二区三区免费观看| 三区精品视频观看| 国产在线看一区| 精品无码久久久久久久| 亚洲精品videossex少妇| www.精品| 在线丝袜欧美日韩制服| 国产精品夜夜爽| 天堂中文在线网| 在线亚洲欧美视频| 中文字幕一区二区三区日韩精品| 男女视频网站在线观看| 久久久精品黄色| 国产精品亚洲欧美在线播放| 美女视频久久黄| 女人抽搐喷水高潮国产精品| 日本成人中文字幕在线| 成人免费在线播放视频| 全国男人的天堂网| 国产精品美女呻吟| 欧美日韩一区二区三区四区在线观看| 欧美黑人欧美精品刺激| 欧美视频一区在线| 懂色av一区| 色综合电影网| 岛国av在线一区| 中文字幕永久在线视频| 欧美日韩国产成人高清视频| 西瓜成人精品人成网站| 激情文学亚洲色图| 狠狠久久亚洲欧美专区| 麻豆av在线导航| 青青草原成人| 国产99久久久国产精品免费看| 无码无套少妇毛多18pxxxx| 免费不卡欧美自拍视频|