在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在Python中從頭構建CNN?

Dbwd_Imgtec ? 來源:YXQ ? 2019-08-08 11:07 ? 次閱讀

這是一篇關于CNN(卷積神經網絡)的簡單指南,本文將介紹CNN如何工作,以及如何在Python中從頭開始構建一個CNN。

在過去的幾年中,有很多關于卷積神經網絡(CNN)的討論,尤其是因為它們已經徹底改變了計算機視覺領域。在這篇文章中,我們將基于神經網絡的基本背景知識,探索CNN是什么,理解它們是如何工作的,并使用Python中的numpy從頭開始構建一個真正的卷積神經網絡。

本文假設讀者有一定的神經網絡的基本知識。如果你想要了解一些關于神經網絡的知識,你可以讀一下我的關于對神經網絡的介紹。

1、動機

CNN的經典用例是執行圖像分類,例如查看寵物的圖像并確定它是貓還是狗。這是一項看似非常簡單的任務,你可能會有這樣的疑惑:為什么不使用普通的神經網絡呢?不得不說這是一個好問題。

原因1:圖像很大

目前用于計算機視覺問題的圖像通常為224x224甚至更大。想象一下,構建一個神經網絡來處理224x224彩色圖像:包括圖像中的3個顏色通道(RGB),即224x224x3=150528個輸入權重!這種網絡中的典型隱藏層可能有1024個節點,因此我們必須僅為第一層訓練150528x1024=15億個權重。想象一下擁有15億個權重的神經網絡,是不是太大了?這幾乎是不可能完成訓練的。

最重要的是其實我們并不需要那么多的權重,相反我們僅知道像素點其鄰居的點才是最有用的。因為圖像中的物體是由小的局部特征組成的,如圓形虹膜或一張紙的方角。對于第一個隱藏層中的每個節點來說,查看每個像素似乎是很浪費的!

原因2:位置可變

如果你訓練了一個網絡來檢測狗,那么無論圖像出現在哪張照片中,你都希望它能夠檢測到狗。想象一下,訓練一個在某個狗圖像上運行良好的網絡,然后為它提供相同圖像的略微移位版本,此時的網絡會有完全不同的反應!

那么CNN是如何幫助我們解決這些問題的呢?不要著急我們很快就會看到CNN如何幫助我們緩解這些問題!

2、數據集

在這篇文章中,我們將解決計算機視覺的“Hello,World!”:MNIST手寫數字分類問題。很簡單:給定圖像,將其分類為數字。

來自MNIST數據集的樣本圖像

MNIST數據集中的每個圖像都是28x28,其中包含了一個居中的灰度數字。說實話,一個正常的神經網絡實際上可以很好地解決這個問題。你可以將每個圖像視為28x28=784維矢量,將其輸入到784-dim圖層,堆疊一些隱藏圖層,最后輸出10個節點的輸出圖層,每個數字1個。

這樣做可以完成任務,因為MNIST數據集包含的都是些居中的小圖像,因此我們不會遇到上述的大小或移位問題。但是,請記住,大多數現實世界的圖像分類問題并不容易。

那么就讓我們進入CNN吧!

3、卷積

什么是卷積神經網絡?

它們基本上是使用卷積層的神經網絡,即Conv層,它們基于卷積的數學運算。Conv圖層由一組過濾器組成,你可以將其視為2d數字矩陣。這是一個示例3x3過濾器:

一個3x3過濾器

我們可以通過將濾波器與輸入圖像進行卷積來產生輸出圖像。

這包括:

在某個位置覆蓋圖像頂部的過濾器;

在過濾器中的值與圖像中的相應值之間執行逐元素乘法;

所有元素(element-wise products)求和,此和是輸出圖像中目標像素的輸出值。

重復所有位置。

注釋:實際上我們(以及許多CNN實現)在技術上使用互相關(Cross-correlation)而不是卷積,但它們幾乎完全相同。

這4步描述有點抽象,所以讓我們舉個例子吧,考慮這個微小的4x4灰度圖像和這個3x3過濾器:

4x4圖像(左)和3x3濾鏡(右)

圖像中的數字表示像素強度,其中0是黑色,255是白色。我們將對輸入圖像和過濾器進行卷積以生成2x2輸出圖像:

2x2輸出圖像

首先,讓我們將過濾器疊加在圖片的左上角:

第1步:將過濾器(右)疊加在圖像上方(左)

接下來,我們在重疊圖像值和過濾器值之間執行逐元素乘法。以下是結果,從左上角開始向右,然后向下:

第2步:執行逐元素乘法。

接下來,我們總結所有結果。這很容易:62-33=29。

最后,我們將結果放在輸出圖像的目標像素中。由于我們的過濾器覆蓋在輸入圖像的左上角,因此我們的目標像素是輸出圖像的左上角像素:

我們做同樣的步驟來生成輸出圖像的其余部分:

3.1 這有用嗎?

用過濾器卷積圖像有什么作用?我們可以先使用我們一直使用的示例3x3濾波器,這通常被稱為垂直索貝爾濾波器:

垂直索貝爾濾波器

以下是垂直Sobel濾波器的示例:

垂直Sobel濾波器卷積的圖像

同樣,還有一個水平Sobel濾波器:

水平Sobel濾波器

水平Sobel濾波器卷積的圖像

到底發生了什么?Sobel濾波器是邊緣檢測器。垂直Sobel濾波器檢測的是垂直邊緣,水平Sobel濾波器的是檢測水平邊緣。現在可以輕松解釋輸出圖像:輸出圖像中的亮像素(具有高值的像素)表示原始圖像中存在強邊緣。

你能看出為什么邊緣檢測圖像可能比原始圖像更有用嗎?回想一下我們的MNIST手寫數字分類問題。在MNIST上訓練的CNN可以尋找數字1,例如,通過使用邊緣檢測濾波器并檢查圖像中心附近的兩個突出的垂直邊緣。通常,卷積有助于我們查找特定的本地化圖像特征。

3.2 填充(Padding)

還記得先用3x3過濾器對4x4的輸入圖像進行卷積,以產生2x2輸出圖像嗎?通常,我們希望輸出圖像的大小與輸入圖像的大小相同。為此,我們在圖像周圍添加零,以便我們可以在更多位置疊加過濾器。3x3濾鏡需要1個像素的填充:

4x4輸入與3x3濾波器卷積,使用填充以產生4x4輸出

這稱為“相同”填充,因為輸入和輸出具有相同的尺寸。不使用任何填充,這是我們一直在做的,有時也被稱為“有效”填充。

3.3 Conv圖層

既然我們知道圖像卷積是如何工作的以及為什么用它,那讓我們看看它是如何在CNN中實際使用的。如前所述,CNN包括使用一組過濾器將輸入圖像轉換為輸出圖像的conv layer。conv層的主要參數是它具有的過濾器數量。

對于我們的MNIST CNN,我們將使用一個帶有8個過濾器的小conv layer作為我們網絡中的初始層。這意味著它會將28x28輸入圖像轉換為26x26x8輸出向量:

提醒:輸出為26x26x8而不是28x28x8,因為我們使用有效填充,這會將輸入的寬度和高度減少2。

conv layer中的4個過濾器中的每一個都會產生26x26輸出,因此堆疊在一起它們構成26x26x8的向量。

3.4 執行卷積

是時候將我們學到的東西放到代碼中了!我們將實現一個conv layer的前饋部分,該部分負責處理帶有輸入圖像的過濾器,以產生輸出向量。為簡單起見,我們假設過濾器是3x3(其實5x5和7x7過濾器也很常見)。

讓我們開始實現一個conv layer類:

importnumpyasnpclassConv3x3:#AConvolutionlayerusing3x3filters.def__init__(self,num_filters):self.num_filters=num_filters#filtersisa3darraywithdimensions(num_filters,3,3)#Wedivideby9toreducethevarianceofourinitialvaluesself.filters=np.random.randn(num_filters,3,3)/9

該類只有一個參數:過濾器的數量。在構造函數中,我們存儲過濾器的數量并使用NumPy的randn()方法初始化隨機過濾器數組。

注意:在初始化期間初始值很重要,如果初始值太大或太小,則訓練網絡將無效。

要了解更多信息,請閱讀Xavier Initialization:https://www.quora.com/What-is-an-intuitive-explanation-of-the-Xavier-Initialization-for-Deep-Neural-Networks

接下來,實際卷積:

classConv3x3:#...defiterate_regions(self,image):'''Generatesallpossible3x3imageregionsusingvalidpadding.-imageisa2dnumpyarray'''h,w=image.shapeforiinrange(h-2):forjinrange(w-2):im_region=image[i:(i+3),j:(j+3)]yieldim_region,i,jdefforward(self,input):'''Performsaforwardpassoftheconvlayerusingthegiveninput.Returnsa3dnumpyarraywithdimensions(h,w,num_filters).-inputisa2dnumpyarray'''h,w=input.shapeoutput=np.zeros((h-2,w-2,self.num_filters))forim_region,i,jinself.iterate_regions(input):output[i,j]=np.sum(im_region*self.filters,axis=(1,2))returnoutput

iterate_regions()是一個輔助生成器方法,為我們生成所有有效的3x3圖像區域,這對于稍后實現此類的后向部分非常有用。

上面是實際執行卷積的代碼行。讓我們分解一下:

im_region:一個包含相關圖像區域的3x3陣列。

self.filters:一個3d數組。

im_region*self.filtersself.filters:我們使用numpy的廣播(broadcasting)功能以元素方式乘以兩個數組,結果是具有相同尺寸的3d數組。

axis=(1,2)num_filters:我們使用np.sum()上一步的結果,產生一個長度為1d的數組,其中每個元素包含相應過濾器的卷積結果。

我們將結果分配給output[i,j],其中包含輸出中像素的卷積結果(i,j)。

對輸出中的每個像素執行上面的序列,直到我們獲得我們想要的結果!讓我們的代碼進行測試運行:

importmnistfromconvimportConv3x3#ThemnistpackagehandlestheMNISTdatasetforus!#Learnmoreathttps://github.com/datapythonista/mnisttrain_images=mnist.train_images()train_labels=mnist.train_labels()conv=Conv3x3(8)output=conv.forward(train_images[0])print(output.shape)#(26,26,8)

注意:為簡單起見,在我們的Conv3x3實現中,我們假設輸入是一個2d numpy數組,因為這是我們的MNIST圖像的存儲方式。這對我們有用,我們將它用作網絡中的第一層,但大多數CNN都有更多的Conv層。如果我們要構建一個需要Conv3x3多次使用的更大的網絡,我們必須使輸入成為3d numpy數組。

4、池化(Pooling)

圖像中的相鄰像素傾向于具有相似的值,因此conv layer通常也會為輸出中的相鄰像素產生類似的值。但是conv layer中輸出的大部分信息都是冗余的,例如,如果我們使用邊緣檢測過濾器并在某個位置找到強邊緣,那么我們也可能會在距離原始像素1個像素偏移的位置找到相對較強的邊緣。但是,我們可能并沒有找到任何新的東西。

池化層解決了這個問題。他們所做的就是減少通過猜測在輸入中產生的匯總值。該池通常是通過簡單的操作完成max,min或average等這些操作。以下是池化大小為2的Max Pooling圖層的示例:

4x4圖像上的最大池(池大小為2)以產生2x2輸出

為了執行最大池化,我們以2x2塊(因為池大小=2)遍歷輸入圖像,并將最大值放入相應像素的輸出圖像中。

對于我們的MNIST CNN,我們將在初始conv layer之后放置一個池大小為2的Max Pooling層,這樣池化層就會將26x26x8輸入轉換為13x13x8輸出:

4.1執行池化

我們將使用MaxPool2與上一節中的conv類相同的方法實現一個類:

importnumpyasnpclassMaxPool2:#AMaxPoolinglayerusingapoolsizeof2.defiterate_regions(self,image):'''Generatesnon-overlapping2x2imageregionstopoolover.-imageisa2dnumpyarray'''h,w,_=image.shapenew_h=h//2new_w=w//2foriinrange(new_h):forjinrange(new_w):im_region=image[(i*2):(i*2+2),(j*2):(j*2+2)]yieldim_region,i,jdefforward(self,input):'''Performsaforwardpassofthemaxpoollayerusingthegiveninput.Returnsa3dnumpyarraywithdimensions(h/2,w/2,num_filters).-inputisa3dnumpyarraywithdimensions(h,w,num_filters)'''h,w,num_filters=input.shapeoutput=np.zeros((h//2,w//2,num_filters))forim_region,i,jinself.iterate_regions(input):output[i,j]=np.amax(im_region,axis=(0,1))returnoutput

此類與我們之前實現的Conv3x3類工作方式類似。特別注意的是為了找到給定圖像區域的最大值,我們使用np.amax()。我們設置是axis=(0,1),因為我們只希望在前兩個維度(高度和寬度)上進行最大化,而不是第三個維度,num_filters。

我們來試試吧!

importmnistfromconvimportConv3x3frommaxpoolimportMaxPool2#ThemnistpackagehandlestheMNISTdatasetforus!#Learnmoreathttps://github.com/datapythonista/mnisttrain_images=mnist.train_images()train_labels=mnist.train_labels()conv=Conv3x3(8)pool=MaxPool2()output=conv.forward(train_images[0])output=pool.forward(output)print(output.shape)#(13,13,8)

MNIST CNN馬上要完成了!

5、Softmax

為了完成我們的CNN,我們需要讓它能夠實際進行預測。我們將通過使用標準最終層來實現多類分類問題:Softmax層,一個使用softmax激活函數的標準全連接(密集)層。

提示:完全連接層將每個節點連接到前一層的每個輸出。我們在之前的神經網絡的介紹中使用了完全連接的圖層。

Softmax將任意實際值轉換為概率。如果你對其背后的數學有興趣,自己可以簡單了解下,因為它很簡單。

5.1用法

我們將使用一個帶有10個節點的softmax層,每個節點都代表一個數字,softmax層是我們CNN的最后一層。圖層中的每個節點都將連接到輸入,在使用softmax變換之后,概率最高的節點表示的數字將成為CNN的輸出!

5.2交叉熵損失函數

你可能會有這樣的疑問,為什么還要將輸出轉換為概率呢?最高輸出值是否總是具有最高概率?如果你有這樣的疑問,那說明你的感覺很對。我們實際上不需要使用softmax來預測數字,因為我們可以選擇網絡輸出最高的數字!

softmax真正做的是幫助我們量化我們對預測的確定程度,這在訓練和評估我們的CNN時非常有用。更具體地說,它可以幫我們確定每個預測的正確程度。

5.3實施Softmax

讓我們實現一個Softmax圖層類:

importnumpyasnpclassSoftmax:#Astandardfully-connectedlayerwithsoftmaxactivation.def__init__(self,input_len,nodes):#Wedividebyinput_lentoreducethevarianceofourinitialvaluesself.weights=np.random.randn(input_len,nodes)/input_lenself.biases=np.zeros(nodes)defforward(self,input):'''Performsaforwardpassofthesoftmaxlayerusingthegiveninput.Returnsa1dnumpyarraycontainingtherespectiveprobabilityvalues.-inputcanbeanyarraywithanydimensions.'''input=input.flatten()input_len,nodes=self.weights.shapetotals=np.dot(input,self.weights)+self.biasesexp=np.exp(totals)returnexp/np.sum(exp,axis=0)

我們現在已經完成了CNN的整個編碼工作!把它放在一起:

importmnistimportnumpyasnpfromconvimportConv3x3frommaxpoolimportMaxPool2fromsoftmaximportSoftmax#Weonlyusethefirst1ktestingexamples(outof10ktotal)#intheinterestoftime.Feelfreetochangethisifyouwant.test_images=mnist.test_images()[:1000]test_labels=mnist.test_labels()[:1000]conv=Conv3x3(8)#28x28x1->26x26x8pool=MaxPool2()#26x26x8->13x13x8softmax=Softmax(13*13*8,10)#13x13x8->10defforward(image,label):'''CompletesaforwardpassoftheCNNandcalculatestheaccuracyandcross-entropyloss.-imageisa2dnumpyarray-labelisadigit'''#Wetransformtheimagefrom[0,255]to[-0.5,0.5]tomakeiteasier#toworkwith.Thisisstandardpractice.out=conv.forward((image/255)-0.5)out=pool.forward(out)out=softmax.forward(out)#Calculatecross-entropylossandaccuracy.np.log()isthenaturallog.loss=-np.log(out[label])acc=1ifnp.argmax(out)==labelelse0returnout,loss,accprint('MNISTCNNinitialized!')loss=0num_correct=0fori,(im,label)inenumerate(zip(test_images,test_labels)):#Doaforwardpass._,l,acc=forward(im,label)loss+=lnum_correct+=acc#Printstatsevery100steps.ifi%100==99:print('[Step%d]Past100steps:AverageLoss%.3f|Accuracy:%d%%'%(i+1,loss/100,num_correct))loss=0num_correct=0

執行cnn.py,我們可以得到:

MNISTCNNinitialized![Step100]Past100steps:AverageLoss2.302|Accuracy:11%[Step200]Past100steps:AverageLoss2.302|Accuracy:8%[Step300]Past100steps:AverageLoss2.302|Accuracy:3%[Step400]Past100steps:AverageLoss2.302|Accuracy:12%

想親自嘗試或修改這些代碼?在瀏覽器中運行此CNN,你也可以在Github上找到它。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4825

    瀏覽量

    86225
  • 卷積神經網絡

    關注

    4

    文章

    369

    瀏覽量

    12199

原文標題:手把手帶你走進卷積神經網絡!

文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    何在Ubuntu 24.04上運行5.4.47版本?

    18.04 的 SDK,但最終導致構建錯誤,在 ubuntu 24.04 上缺少庫,因此 SDK 似乎對構建系統本身有很強的依賴性。 下一步,我嘗試在 Ubuntu 24.04 上為 5.4.47
    發表于 04-11 06:08

    零基礎入門:如何在樹莓派上編寫和運行Python程序?

    在這篇文章,我將為你簡要介紹Python程序是什么、Python程序可以用來做什么,以及如何在RaspberryPi上編寫和運行一個簡單的Pyth
    的頭像 發表于 03-25 09:27 ?507次閱讀
    零基礎入門:如<b class='flag-5'>何在</b>樹莓派上編寫和運行<b class='flag-5'>Python</b>程序?

    無法使用Raspberry與Ubuntu 20.04構建OpenVINO?怎么辦?

    按照 BuildForLinux* 的構建步驟操作 使用構建命令: cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON
    發表于 03-06 06:42

    使用Python實現xgboost教程

    使用Python實現XGBoost模型通常涉及以下幾個步驟:數據準備、模型訓練、模型評估和模型預測。以下是一個詳細的教程,指導你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發表于 01-19 11:21 ?1165次閱讀

    如何使用Python構建LSTM神經網絡模型

    構建一個LSTM(長短期記憶)神經網絡模型是一個涉及多個步驟的過程。以下是使用Python和Keras庫構建LSTM模型的指南。 1. 安裝必要的庫 首先,確保你已經安裝了Python
    的頭像 發表于 11-13 10:10 ?1411次閱讀

    使用Python構建高效的HTTP代理服務器

    構建一個高效的HTTP代理服務器在Python涉及多個方面,包括性能優化、并發處理、協議支持(HTTP/HTTPS)、錯誤處理以及日志記錄等。
    的頭像 發表于 10-23 07:41 ?461次閱讀

    Python在AI的應用實例

    Python在人工智能(AI)領域的應用極為廣泛且深入,從基礎的數據處理、模型訓練到高級的應用部署,Python都扮演著至關重要的角色。以下將詳細探討Python在AI的幾個關鍵應用
    的頭像 發表于 07-19 17:16 ?2421次閱讀

    何在Python開發人工智能

    Python開發人工智能(AI)是一個廣泛而深入的主題,它涵蓋了從基礎的數據處理到復雜的機器學習、深度學習以及自然語言處理等多個領域。
    的頭像 發表于 07-15 15:01 ?3359次閱讀

    何在PyTorch實現LeNet-5網絡

    等人提出,主要用于手寫數字識別任務(如MNIST數據集)。下面,我將詳細闡述如何在PyTorch從頭開始實現LeNet-5網絡,包括網絡架構設計、參數初始化、前向傳播、損失函數選擇、優化器配置以及訓練流程等方面。
    的頭像 發表于 07-11 10:58 ?1236次閱讀

    圖像分割與語義分割CNN模型綜述

    圖像分割與語義分割是計算機視覺領域的重要任務,旨在將圖像劃分為多個具有特定語義含義的區域或對象。卷積神經網絡(CNN)作為深度學習的一種核心模型,在圖像分割與語義分割中發揮著至關重要的作用。本文將從CNN模型的基本原理、在圖像分割與語義分割
    的頭像 發表于 07-09 11:51 ?1775次閱讀

    何在TensorFlow構建并訓練CNN模型

    在TensorFlow構建并訓練一個卷積神經網絡(CNN)模型是一個涉及多個步驟的過程,包括數據預處理、模型設計、編譯、訓練以及評估。下面,我將詳細闡述這些步驟,并附上一個完整的代碼示例。
    的頭像 發表于 07-04 11:47 ?1615次閱讀

    如何利用CNN實現圖像識別

    卷積神經網絡(CNN)是深度學習領域中一種特別適用于圖像識別任務的神經網絡結構。它通過模擬人類視覺系統的處理方式,利用卷積、池化等操作,自動提取圖像的特征,進而實現高效的圖像識別。本文將從CNN的基本原理、
    的頭像 發表于 07-03 16:16 ?2508次閱讀

    NLP模型RNN與CNN的選擇

    在自然語言處理(NLP)領域,循環神經網絡(RNN)與卷積神經網絡(CNN)是兩種極為重要且廣泛應用的網絡結構。它們各自具有獨特的優勢,適用于處理不同類型的NLP任務。本文旨在深入探討RNN與CNN
    的頭像 發表于 07-03 15:59 ?977次閱讀

    何在不同應用場景下構建音頻測試環境

    在之前的文章,我們已經詳細介紹了基礎音頻參數和AP525的軟硬件配置。本文將延續這一主題,以泰凌TLSR9518A EVB作為測試設備(DUT),向大家展示如何在不同應用場景下構建音頻測試環境。
    的頭像 發表于 07-03 15:00 ?1138次閱讀
    如<b class='flag-5'>何在</b>不同應用場景下<b class='flag-5'>構建</b>音頻測試環境

    深度神經網絡模型cnn的基本概念、結構及原理

    ,其核心是構建具有多層結構的神經網絡模型,以實現對復雜數據的高效表示和處理。在眾多深度學習模型,卷積神經網絡(CNN)因其在圖像識別等領域的卓越性能而備受關注。CNN通過引入卷積層和
    的頭像 發表于 07-02 10:11 ?1.1w次閱讀
    主站蜘蛛池模板: 一级特黄aaa免费 | freesexvideo性欧美tv | 国产午夜毛片一区二区三区 | 久久久久久人精品免费费看 | 一区二区不卡视频在线观看 | 色妞导航 | 天天澡天天干 | 热99在线视频 | 都市激情综合网 | 手机在线观看a | 亚洲黄网址 | 色多多免费观看 | 狠狠色噜狠狠狠狠色综合久 | www一片黄| 岛国毛片一级一级特级毛片 | 毛片高清一区二区三区 | 都市激情亚洲 | 看日本黄大片在线观看 | 欧美日韩一卡2卡三卡4卡新区 | 国产nv精品你懂得 | 天天做夜夜爽 | 动漫精品成人免费网站 | 五月婷婷综合基地 | 亚洲乱码中文字幕综合 | 国产青草 | 久久久久久久国产免费看 | 嘿嘿午夜 | 欧美在线精品一区二区三区 | 四虎国产永久在线精品免费观看 | 大色综合色综合资源站 | 思思久久好好热精品国产 | 网站毛片 | 国产高清成人mv在线观看 | 女人张开腿给人桶免费视频 | 美国一区二区三区 | 国产精品嫩草影院人体模特 | 久久夜色精品国产亚洲 | 506rr亚洲欧美 | 四虎永久影院永久影库 | 97av在线播放 | 你懂的在线免费观看 |