校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > CNN的Pytorch實現(LeNet)

CNN的Pytorch實現(LeNet)

熱門標簽:鶴壁手機自動外呼系統違法嗎 地圖標注多個 萊蕪電信外呼系統 怎么辦理400客服電話 B52系統電梯外呼顯示E7 企業微信地圖標注 高德地圖標注收入咋樣 沈陽防封電銷電話卡 銀川電話機器人電話

CNN的Pytorch實現(LeNet)

  上次寫了一篇CNN的詳解,可是累壞了老僧我。寫完后拿給朋友看,朋友說你這Pytorch的實現方式對于新人來講會很不友好,然后反問我說里面所有的細節你都明白了嗎。我想想,的確如此。那個源碼是我當時《動手學pytorch》的時候整理的,里面有很多包裝過的函數,對于新入門的人來講,的確是個大問題。于是,痛定思痛的我決定重新寫Pytorch實現這一部分,理論部分我就不多講了,咱們直接分析代碼,此代碼是來自Pytorch官方給出的LeNet Model。你可以使用Jupyter Notebook一行一行的學習,也可以使用Pycharm進行斷點訓練和Debug來學習。

沒有看過理論部分的同學可以看我上篇文章:一文帶你了解CNN(卷積神經網絡)。

  在整個講解的過程中,其中的一些比較重要的代碼我會引入一些例子來進行解釋它的功能,如果你想先直接跑通代碼,可以直接跳到代碼匯總部分,Here we go~

1. 任務目標

  這是一個對于彩色圖的10分類的問題,具體種類有:'plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck',訓練一個能夠對其進行分類的分類器。

2. 庫的導入

這一部分咱們就不說太多了吧,直接上code:

import torch # 張量的有關運算,如創建、索引、連接、轉置....和numpy的操作很像
import torch.nn as nn # 八廓搭建神經網絡層的模塊、loss等等
import torch.nn.functional as F # 常用的激活函數都在這里面
import torchvision # 專門處理圖像的庫
import torch.optim as optim # 各種參數優化方法,SGD、Adam...
import torchvision.transforms as transforms # 提供了一般的圖像轉換操作的類,也可以用于圖像增強
import matplotlib.pyplot as plt 
import numpy as np 

3. 模型定義

  我們在定義自己網絡的時候,需要繼承nn.Module類,并重新實現構造函數__init__和forward兩個方法。forward方法是必須要重寫的,它是實現模型的功能,實現各個層之間的連接關系的核心。如果你是用我下面的這個方法來定義的模型,在forward中要去連接它們之間的關系;如果你是用Sequential的方法來定義的模型,一般來講可以直接在構造函數定義好后,在foward函數中return就行了(如果模型比較復雜就另當別論)。

class LeNet(nn.Module):
    """
    	下面這個模型定義沒有用Sequential來定義,Sequential的定義方法能夠在init中就給出各個層
    	之間的關系,我這里是根據是否有可學習的參數。我將可學習參數的層(如全連接、卷積)放在構造函數
    	中(其實你想把不具有參數的層放在里面也可以),把不具有學習參數的層(如dropout,
    	ReLU等激活函數、BN層)放在forward。
 
    """
    def __init__(self):
        super(LeNet,self).__init__()   

        # 第一個卷積塊,這里輸入的是3通道,彩色圖。
        self.conv1 = nn.Conv2d(3,16,5)
        self.pool1 = nn.MaxPool2d(2,2)

        # 第二個卷積塊
        self.conv2 = nn.Conv2d(16,32,5)
        self.pool2 = nn.MaxPool2d(2,2)

        # 稠密塊,包含三個全連接層
        self.fc1 = nn.Linear(32*5*5,120)
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10)
        pass

    def forward(self,x):
        # x是輸入數據,是一個tensor
        # 正向傳播
        x = F.relu(self.conv1(x))    # input(3, 32, 32) output(16, 28, 28)
        x = self.pool1(x)            # output(16, 14, 14)
        x = F.relu(self.conv2(x))    # output(32, 10, 10)
        x = self.pool2(x)            # output(32, 5, 5)
        x = x.view(-1, 32*5*5)       # output(32*5*5)
        # 數據通過view展成一維向量,第一個參數-1是batch,自動推理;32x5x5是展平后的個數
        x = F.relu(self.fc1(x))      # output(120)
        x = F.relu(self.fc2(x))      # output(84)
        x = self.fc3(x)              # output(10)

        # 為什么沒有用softmax函數 --- 在網絡模型中已經計算交叉熵以及概率
        return x

我們還可以隨便看一下可訓練參數:

model = LeNet()
for name,parameters in model.named_parameters():
    if param.requires_grad:    
        print(name,':',parameters.size())

看一下實例化的模型:

import torch
input1 = torch.rand([32,3,32,32])
model = LeNet() # 模式實例化
print(model) # 看一下模型結構
output = model(input1)

這里就不再拓展了,我發4我發4,我會專門再寫一篇使用pytorch查看特征矩陣 和卷積核參數的文章。

4. 數據加載、處理

# 調用設備內的GPU并打印出來
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("using {} device.".format(device))

# 定義圖像數據的數據預處理方式
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# 如果是第一次運行代碼,沒有下載數據集,則將download調制為True進行下載,并加載訓練集
# transform是選擇數據預處理的方式,我們已經提前定義
train_set = torchvision.datasets.CIFAR10(root='./data', train=True,
                                         download=False,transform=transform)

# 如果你是windows系統,一定要記得把num_workers設置為0,不然會報錯。
# 這個是將數據集劃為為n個批次,每個批次的數據集有batchSize張圖片,shuffle是打亂數據集
train_loader = torch.utils.data.DataLoader(train_set, batch_size=36,
                                           shuffle=True, num_workers=0)

# 上面已經下載過的話,download設置為False
val_set = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=False, transform=transform)

# 驗證集不用打亂,把batchsize設置為1,每次拿出1張來驗證
val_loader = torch.utils.data.DataLoader(val_set, batch_size=1
                                         shuffle=False, num_workers=0)

# 定義classes類別
classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

val_data_iter = iter(val_loader) # 轉換成可迭代的迭代器
val_image, val_label = val_data_iter.next()

# 定義imshow函數顯示圖像
def imshow(img):
    img = img / 2 + 0.5  # unnormalize -> 反標準化處理
    npimg = img.numpy() # numpy和tensor的通道順序不同 tensor是通道度、寬度,numpy是高、寬、通
    
    # 使用transpose調整維度
    plt.imshow(np.transpose(npimg, (1, 2, 0))) #(1,2,0)-> 代表高度、寬度 通道
    plt.show()

imshow(torchvision.utils.make_grid(val_image))
# 顯示圖像結果:

在這個圖像加載部分,我做了些其它的嘗試,想要去發現train_set和train_loader之間的不同。這里你可以逐行取消我注釋的代碼,然后去觀察,去對比,你就知道有哪些不一樣了。

"""
	train_set:

    總結:經過多次嘗試,發現train_set是用一個Dataset包裝起來,用索引來提取第n個數據,提出的數據是一個元組。
    元組的第一個索引是Tensor的圖像數據,(channel,height,width),索引的第二個數據是標簽 int類型。
    可以選擇用enumerate迭代器,也可以直接進行索引,這里因為沒有batchsize的維度,所以可以直接調用自己寫的
    imshow函數來顯示圖片
"""

for i,data in enumerate(train_set):
    if i == 7:
#         imshow(data[0])
#         print(data[0])
#         print(train_set[i][0]) # 查看train-set第七張圖元組 的 索引0
        print(train_set[i][0].shape)
        print(train_set[i][1]) # 查看train-set第七張圖元組 的 索引1
#         imshow(train_set[i][0])
        print(type(train_set[i][1]))
#         print(train_set[i].shape)
        print(data[0])
        print(data[0].shape)
#         print(type(data[i]))
"""
	train_loader

    總結:和Dataset類型不一樣,DataLoader不能夠直接用索引獲取數據。需要用enumerate迭代器來獲取 或者 iter.
    經過enumerate索引后,得到的data類型是擁有兩個變量的列表類型。第一個變量是Tensor類型,用[batchSize,channel,height,width]表示
    批圖像數據,里面是有batchsize張圖的。第二個變量也是Tensor類型,是代表每張圖像的標簽,是個一維torch
    
"""

for i,data in enumerate(train_loader):
    if i == 7:
        print(type(data))
        print(len(data))
        print(type(data[0]))
        print(type(data[1]))
        print(data[0].shape)
        print(data[1].shape)
        print(type(data[1]))
#         print(data[0])
        print(data[1])      
#         print(type(data[2]))

5.模型訓練

# 用GPU訓練
import time
torch.cuda.synchronize()
start = time.time()

net = LeNet()
net.to(device) #使用GPU時把網絡分配到指定的device中
loss_function = nn.CrossEntropyLoss() 
optimizer = optim.Adam(net.parameters(),lr=0.001) # Adam優化器

Loss = []
for epoch in range(5):
    # 這里就只訓練5個epoch,你可以試試多個
    running_loss = 0.0
    for step,data in enumerate(train_loader,start=0):
        inputs,labels = data # data是一個列表,[數據,標簽]
        
        # 清除歷史梯度,加快訓練
        optimizer.zero_grad()
        
        outputs = net(inputs.to(device)) # 將輸入的數據分配到指定的GPU中
        
        loss = loss_function(outputs,labels.to(device)) # 將labels分配到指定的device
        
        loss.backward() # loss進行反向傳播
        optimizer.step() # step進行參數更新
        
        # 打印數據
        running_loss += loss.item() # 每次計算完loss后加入到running_loss中
        if step % 500 == 499: # 每500個mini-batches 就打印一次
            with torch.no_grad(): 
                outputs = net(val_image.to(device))
                # outputs的shape = [32,10]
                # dim是max函數索引的維度,0是每列最大值,1是每行最大值
                predict_y = torch.max(outputs,dim=1)[1] # max函數返回的每個batchSize的最大值 + 索引。獲取索引[1]
                    
                # == 來比較每個batchSize中的訓練結果標簽和原標簽是否相同,如果預測正確就返回1,否則返回0,并累計正確的數量。
                # 得到的是tensor,用item轉成數字,CPU時使用

                accuracy = (predict_y == val_label.to(device)).sum().item()/val_label.size(0) 
                # val_label.size是驗證集中batchSize的大小
                print('[%d %5d] train_loss: %.3f test_accuracy:%.3f' % (epoch+1,step+1,
                                                                       running_loss/500,accuracy))
                Loss.append(running_loss)
                running_loss = 0.0
print('Finished Training')
            
torch.cuda.synchronize()
end = time.time()

print("訓練用時:",end-start,'s')

五個epoch在我的GPU上訓練了68s。

整個代碼

model.py

import torch.nn as nn
import torch.nn.functional as F


class LeNet(nn.Module):
    # 要繼承于nn.Moudule父類
    def __init__(self):
        # 初始化函數

        super(LeNet, self).__init__()
        # 使用super函數,解決多繼承可能遇到的一些問題;調用基類的構造函數


        self.conv1 = nn.Conv2d(3, 16, 5) # 調用卷積層 (in_channels,out_channels(也是卷積核個數。輸出的通道數),kernel_size(卷積核大小),stride)
        self.pool1 = nn.MaxPool2d(2, 2)  # 最大池化層,進行下采樣
        self.conv2 = nn.Conv2d(16, 32, 5) # 輸出的通道數為32
        self.pool2 = nn.MaxPool2d(2, 2)

        self.fc1 = nn.Linear(32*5*5, 120) # 全連接層輸入是一維向量,這里是32x5x5,我們要展平,120是節點的個數
        # 32是通道數
        # Linear(input_features,output_features)

        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # x是輸入數據,是一個tensor
        # 正向傳播
        x = F.relu(self.conv1(x))    # input(3, 32, 32) output(16, 28, 28)
        x = self.pool1(x)            # output(16, 14, 14)
        x = F.relu(self.conv2(x))    # output(32, 10, 10)
        x = self.pool2(x)            # output(32, 5, 5)
        x = x.view(-1, 32*5*5)       # output(32*5*5)
        # 數據通過view展成一維向量,第一個參數-1是batch,自動推理;32x5x5是展平后的個數
        x = F.relu(self.fc1(x))      # output(120)
        x = F.relu(self.fc2(x))      # output(84)
        x = self.fc3(x)              # output(10)
        # 為什么沒有用softmax函數 --- 在網絡模型中已經計算交叉熵以及概率
        return x

import torch
input1 = torch.rand([32,3,32,32])
model = LeNet() # 模式實例化
print(model) # 看一下模型結構
output = model(input1)

train.py

import torch
import torchvision
import torch.nn as nn
from model import LeNet
import torch.optim as optim
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

def main():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print("using {} device.".format(device))
    transform = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

    # 50000張訓練圖片
    # 第一次使用時要將download設置為True才會自動去下載數據集
    train_set = torchvision.datasets.CIFAR10(root='./data', train=True,
                                             download=False, transform=transform)

    train_loader = torch.utils.data.DataLoader(train_set, batch_size=36,
                                               shuffle=True, num_workers=0)
    # 把訓練集讀取,別分成一個一個批次的,shuffle可用于隨機打亂;batch_size是一次處理36張圖像
    # num_worker在windows下只能設置成0


    # 10000張驗證圖片
    # 第一次使用時要將download設置為True才會自動去下載數據集
    val_set = torchvision.datasets.CIFAR10(root='./data', train=False,
                                           download=False, transform=transform)
    val_loader = torch.utils.data.DataLoader(val_set, batch_size=5000,
                                             shuffle=False, num_workers=0)
    # 驗證集 一次拿出5000張1出來驗證,不用打亂

    val_data_iter = iter(val_loader) # 轉換成可迭代的迭代器
    val_image, val_label = val_data_iter.next()
    # 轉換成迭代器后,用next方法可以得到測試的圖像和圖像的標簽值
    
    classes = ('plane', 'car', 'bird', 'cat',
               'deer', 'dog', 'frog', 'horse', 'ship', 'truck')



    # 這一部分用來看數據集
    # def imshow(img):
    #     img = img / 2 + 0.5  # unnormalize -> 反標準化處理
    #     npimg = img.numpy()
    #     plt.imshow(np.transpose(npimg, (1, 2, 0))) #(1,2,0)-> 代表高度、寬度 通道
    #     plt.show()
    #
    # # print labels
    # print(' '.join('%5s' % classes[val_label[j]] for j in range(4)))
    # imshow(torchvision.utils.make_grid(val_image))



    net = LeNet()
    net.to(device)  # 使用GPU時將網絡分配到指定的device中,不使用GPU注釋
    loss_function = nn.CrossEntropyLoss() # 已經包含了softmax函數
    optimizer = optim.Adam(net.parameters(), lr=0.001) #Adam優化器

    for epoch in range(5):  # loop over the dataset multiple times

        running_loss = 0.0
        for step, data in enumerate(train_loader, start=0):
            # get the inputs; data is a list of [inputs, labels]
            inputs, labels = data

            # zero the parameter gradients
            optimizer.zero_grad()
            # 一般batch_size根據硬件設備來設置的,這個清楚歷史梯度,不讓梯度累計,可以讓配置低的用戶加快訓練

            # forward + backward + optimize 、、、、、CPU
            # outputs = net(inputs)
            # loss = loss_function(outputs, labels)

            # GPU使用時添加,不使用時注釋
            outputs = net(inputs.to(device))  # 將inputs分配到指定的device中
            loss = loss_function(outputs, labels.to(device))  # 將labels分配到指定的device中

            loss.backward() # loss進行反向傳播
            optimizer.step() # step進行參數更新

            # print statistics
            running_loss += loss.item() # m每次計算完后就加入到running_loss中
            if step % 500 == 499:    # print every 500 mini-batches
                with torch.no_grad(): # 在測試、預測過程中,這個函數可以優化內存,防止爆內存
                    # outputs = net(val_image)  # [batch, 10]
                    outputs = net(val_image.to(device))  # 使用GPU時用這行將test_image分配到指定的device中
                    predict_y = torch.max(outputs, dim=1)[1] #dim=1,因為dim=0是batch;[1]是索引,最大值在哪個位置
                    # accuracy = torch.eq(predict_y, val_label).sum().item() / val_label.size(0)
                    # eq用來比較,如果預測正確返回1,錯誤返回0 -> 得到的是tensor,要用item轉成數值 CPU時使用

                    accuracy = (predict_y==val_label.to(device)).sum().item() / val_label.size(0)

                    print('[%d, %5d] train_loss: %.3f  test_accuracy: %.3f' %
                          (epoch + 1, step + 1, running_loss / 500, accuracy))
                    running_loss = 0.0

    print('Finished Training')

    save_path = './Lenet.pth'
    torch.save(net.state_dict(), save_path)


if __name__ == '__main__':
    main()

Tips:數據集在當前目錄下創建一個data文件夾,然后在train_set導入數據那里的download設置為True就可以下載了。如果你沒有GPU的話,你可以使用CPU訓練,只需要把代碼中標記的GPU部分注釋,注釋掉的CPU部分取消注釋就ok了。有條件還是GPU吧,CPU太慢了。

引用:

pytorch官方model

到此這篇關于CNN的Pytorch實現(LeNet)的文章就介紹到這了,更多相關CNN的Pytorch實現內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 由淺入深學習TensorFlow MNIST 數據集
  • TensorFlow 實戰之實現卷積神經網絡的實例講解
  • PyTorch上實現卷積神經網絡CNN的方法
  • Python深度學習pytorch卷積神經網絡LeNet

標簽:呼倫貝爾 葫蘆島 湘西 烏魯木齊 三亞 呼倫貝爾 安慶 銀川

巨人網絡通訊聲明:本文標題《CNN的Pytorch實現(LeNet)》,本文關鍵詞  CNN,的,Pytorch,實現,LeNet,CNN,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《CNN的Pytorch實現(LeNet)》相關的同類信息!
  • 本頁收集關于CNN的Pytorch實現(LeNet)的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    一区二区三区国产精华| 久久久久久黄色| 97精品国产97久久久久久久久久久久| 日产精品久久久久久久性色| 亚洲五月六月丁香激情| 亚洲一区在线观看网站| 亚洲国产综合色| 五月综合激情网| 奇米色777欧美一区二区| 人人超碰91尤物精品国产| 丝袜美腿一区二区三区| 日韩国产欧美在线播放| 蜜桃精品在线观看| 麻豆精品久久久| 国产精品伊人色| 成人午夜在线视频| 色久优优欧美色久优优| 欧美日韩免费观看一区三区| 在线观看91av| 久久久三级国产网站| 久久久91精品国产一区二区精品| 国产精品视频yy9299一区| 中文字幕日韩精品一区| 亚洲电影第三页| 另类欧美日韩国产在线| 国产一区二区三区香蕉| 97国产一区二区| 欧美日韩二区三区| 久久久亚洲午夜电影| 中文文精品字幕一区二区| 亚洲卡通欧美制服中文| 另类中文字幕网| 91视视频在线观看入口直接观看www| 欧美视频一区二区三区在线观看| 日韩精品在线一区| 1区2区3区欧美| 精品一区二区三区免费观看| 9人人澡人人爽人人精品| 欧美视频中文一区二区三区在线观看 | 国产精品天干天干在观线| 亚洲免费观看高清完整版在线观看熊| 日本伊人午夜精品| 91麻豆文化传媒在线观看| 欧美一区二区在线免费观看| 亚洲视频一区在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | av一区二区三区黑人| 3d动漫精品啪啪| 国产精品乱人伦| 国内精品不卡在线| 欧美日韩在线播放一区| 国产日韩精品一区二区三区在线| 午夜精品一区二区三区三上悠亚 | 依依成人综合视频| 国产很黄免费观看久久| 日韩午夜激情免费电影| 一区二区免费在线播放| av在线播放不卡| 欧美激情在线看| 国产一区二三区| 日韩一区二区三区在线观看| 亚洲国产精品久久久久婷婷884| 国产福利精品导航| 精品久久久久久久一区二区蜜臀| 婷婷综合久久一区二区三区| 色94色欧美sute亚洲线路一ni| 国产精品天美传媒沈樵| 国产精品一二三四五| 久久综合狠狠综合久久综合88| 日产精品久久久久久久性色| 欧美久久久久久久久中文字幕| 伊人一区二区三区| 91在线精品秘密一区二区| 国产欧美一区二区精品婷婷 | 99re视频这里只有精品| 久久久精品国产99久久精品芒果 | 在线免费不卡电影| 亚洲欧洲精品一区二区精品久久久 | 韩国一区二区在线观看| 日韩亚洲欧美中文三级| 日韩av一区二| 欧美一区二区在线播放| 青青草一区二区三区| 日韩女同互慰一区二区| 狠狠色丁香久久婷婷综合_中| 精品女同一区二区| 麻豆91在线看| 国产亚洲欧美激情| 97se亚洲国产综合自在线| 亚洲精品你懂的| 制服.丝袜.亚洲.另类.中文| 极品少妇xxxx偷拍精品少妇| 日本一区二区电影| 91极品美女在线| 日本成人在线电影网| 久久免费视频色| 99在线精品一区二区三区| 在线看日本不卡| 色天天综合久久久久综合片| 中文字幕精品一区二区精品绿巨人 | 日韩午夜激情电影| 国产精品一区二区免费不卡 | 国产精品一区二区在线观看不卡| 在线区一区二视频| 亚洲成人动漫av| 精品久久久久久久人人人人传媒| 成人一区二区三区中文字幕| 一区二区三区中文字幕电影| 制服丝袜成人动漫| 99国产精品国产精品毛片| 五月婷婷综合激情| 久久久精品综合| 在线观看www91| 国产成人免费视频网站高清观看视频| 中文字幕一区视频| 欧美一区二区三区不卡| 成人性生交大片免费看中文网站| 亚洲一区二区精品3399| 国产亚洲精品7777| 欧美精品丝袜中出| 成人97人人超碰人人99| 日av在线不卡| 亚洲综合色区另类av| 国产精品日韩精品欧美在线| 717成人午夜免费福利电影| 成人av第一页| 另类人妖一区二区av| 亚洲在线视频网站| 国产精品久久久久aaaa樱花| 精品欧美一区二区三区精品久久| 在线精品国精品国产尤物884a| 国产99一区视频免费| 蜜臀久久久久久久| 亚洲午夜精品一区二区三区他趣| 中文字幕一区二区三区视频 | 色综合久久综合网97色综合| 精品系列免费在线观看| 亚洲国产一区视频| 亚洲免费在线观看视频| 日本一区二区三区在线不卡| 精品国产三级电影在线观看| 欧美日韩一级视频| 一本色道久久综合狠狠躁的推荐| 成人三级伦理片| 国产不卡高清在线观看视频| 国产伦精品一区二区三区在线观看 | 欧美电影影音先锋| 91福利国产精品| 一本色道久久综合狠狠躁的推荐 | 亚洲国产中文字幕| 亚洲线精品一区二区三区八戒| 亚洲色图在线播放| 日韩毛片视频在线看| 亚洲日本韩国一区| 亚洲色图一区二区| 一区二区在线看| 亚洲已满18点击进入久久| 亚洲综合在线第一页| 亚洲国产成人高清精品| 亚洲v日本v欧美v久久精品| 亚洲午夜激情网站| 天天综合天天综合色| 天堂成人国产精品一区| 男男视频亚洲欧美| 国内久久精品视频| 国产美女av一区二区三区| 豆国产96在线|亚洲| 色婷婷综合五月| 欧美日韩一区成人| 欧美mv日韩mv亚洲| 国产蜜臀av在线一区二区三区| 最新成人av在线| 五月天一区二区| 黑人精品欧美一区二区蜜桃| 成人美女视频在线观看| 欧洲国内综合视频| 日韩三级中文字幕| 国产日韩精品一区二区三区在线| 亚洲视频香蕉人妖| 免费成人美女在线观看| 国产91对白在线观看九色| 欧洲av一区二区嗯嗯嗯啊| 日韩三级.com| 最新久久zyz资源站| 石原莉奈在线亚洲三区| 岛国精品在线观看| 欧美日韩国产精选| 国产视频在线观看一区二区三区| 一区二区欧美精品| 精品在线播放午夜| 99久久er热在这里只有精品66| 欧美人动与zoxxxx乱| 国产日本一区二区| 日本系列欧美系列| 不卡免费追剧大全电视剧网站| 欧美猛男男办公室激情| 国产精品伦理在线| 精品亚洲免费视频| 欧美日韩精品欧美日韩精品| 欧美国产综合色视频|