婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作

pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作

熱門標(biāo)簽:騰訊地圖標(biāo)注沒法顯示 聊城語(yǔ)音外呼系統(tǒng) 南陽(yáng)打電話機(jī)器人 商家地圖標(biāo)注海報(bào) 地圖標(biāo)注自己和別人標(biāo)注區(qū)別 海外網(wǎng)吧地圖標(biāo)注注冊(cè) 打電話機(jī)器人營(yíng)銷 ai電銷機(jī)器人的優(yōu)勢(shì) 孝感營(yíng)銷電話機(jī)器人效果怎么樣

一、pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練

這種讀取圖片的方式用的是torch自帶的 ImageFolder,讀取的文件夾必須在一個(gè)大的子文件下,按類別歸好類。

就像我現(xiàn)在要區(qū)分三個(gè)類別。

#perpare data set
#train data
train_data=torchvision.datasets.ImageFolder('F:/eyeDataSet/trainData',transform=transforms.Compose(
         [
            transforms.Scale(256),
            transforms.CenterCrop(224),
            transforms.ToTensor()
       ]))
print(len(train_data))
train_loader=DataLoader(train_data,batch_size=20,shuffle=True)

然后就是fine tuning自己的網(wǎng)絡(luò),在torch中可以對(duì)整個(gè)網(wǎng)絡(luò)修改后,訓(xùn)練全部的參數(shù)也可以只訓(xùn)練其中的一部分,我這里就只訓(xùn)練最后一個(gè)全連接層。

torchvision中提供了很多常用的模型,比如resnet ,Vgg,Alexnet等等

# prepare model
mode1_ft_res18=torchvision.models.resnet18(pretrained=True)
for param in mode1_ft_res18.parameters():
    param.requires_grad=False
num_fc=mode1_ft_res18.fc.in_features
mode1_ft_res18.fc=torch.nn.Linear(num_fc,3)

定義自己的優(yōu)化器,注意這里的參數(shù)只傳入最后一層的

#loss function and optimizer
criterion=torch.nn.CrossEntropyLoss()
#parameters only train the last fc layer
optimizer=torch.optim.Adam(mode1_ft_res18.fc.parameters(),lr=0.001)

然后就可以開始訓(xùn)練了,定義好各種參數(shù)。

#start train
#label  not  one-hot encoder
EPOCH=1
for epoch in range(EPOCH):
    train_loss=0.
    train_acc=0.
    for step,data in enumerate(train_loader):
        batch_x,batch_y=data
        batch_x,batch_y=Variable(batch_x),Variable(batch_y)
        #batch_y not one hot
        #out is the probability of eatch class
        # such as one sample[-1.1009  0.1411  0.0320],need to calculate the max index
        # out shape is batch_size * class
        out=mode1_ft_res18(batch_x)
        loss=criterion(out,batch_y)
        train_loss+=loss.data[0]
        # pred is the expect class
        #batch_y is the true label
        pred=torch.max(out,1)[1]
        train_correct=(pred==batch_y).sum()
        train_acc+=train_correct.data[0]
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if step%14==0:
            print('Epoch: ',epoch,'Step',step,
                  'Train_loss: ',train_loss/((step+1)*20),'Train acc: ',train_acc/((step+1)*20))

測(cè)試部分和訓(xùn)練部分類似這里就不一一說(shuō)明。

這樣就完整了對(duì)自己網(wǎng)絡(luò)的訓(xùn)練測(cè)試,完整代碼如下:

import torch
import numpy as np
import torchvision
from torchvision import transforms,utils
from torch.utils.data import DataLoader
from torch.autograd import Variable
#perpare data set
#train data
train_data=torchvision.datasets.ImageFolder('F:/eyeDataSet/trainData',transform=transforms.Compose(
           [
               transforms.Scale(256),
               transforms.CenterCrop(224),
               transforms.ToTensor()
         ]))
print(len(train_data))
train_loader=DataLoader(train_data,batch_size=20,shuffle=True)
 
#test data
test_data=torchvision.datasets.ImageFolder('F:/eyeDataSet/testData',transform=transforms.Compose(
           [
         transforms.Scale(256),
         transforms.CenterCrop(224),
         transforms.ToTensor()
         ]))
test_loader=DataLoader(test_data,batch_size=20,shuffle=True)
 
# prepare model
mode1_ft_res18=torchvision.models.resnet18(pretrained=True)
for param in mode1_ft_res18.parameters():
    param.requires_grad=False
num_fc=mode1_ft_res18.fc.in_features
mode1_ft_res18.fc=torch.nn.Linear(num_fc,3)
 
#loss function and optimizer
criterion=torch.nn.CrossEntropyLoss()
#parameters only train the last fc layer
optimizer=torch.optim.Adam(mode1_ft_res18.fc.parameters(),lr=0.001)
 
#start train
#label  not  one-hot encoder
EPOCH=1
for epoch in range(EPOCH):
    train_loss=0.
    train_acc=0.
    for step,data in enumerate(train_loader):
        batch_x,batch_y=data
        batch_x,batch_y=Variable(batch_x),Variable(batch_y)
        #batch_y not one hot
        #out is the probability of eatch class
        # such as one sample[-1.1009  0.1411  0.0320],need to calculate the max index
        # out shape is batch_size * class
        out=mode1_ft_res18(batch_x)
        loss=criterion(out,batch_y)
        train_loss+=loss.data[0]
        # pred is the expect class
        #batch_y is the true label
        pred=torch.max(out,1)[1]
        train_correct=(pred==batch_y).sum()
        train_acc+=train_correct.data[0]
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if step%14==0:
            print('Epoch: ',epoch,'Step',step,
                  'Train_loss: ',train_loss/((step+1)*20),'Train acc: ',train_acc/((step+1)*20))
 
    #print('Epoch: ', epoch, 'Train_loss: ', train_loss / len(train_data), 'Train acc: ', train_acc / len(train_data))
 
# test model
mode1_ft_res18.eval()
eval_loss=0
eval_acc=0
for step ,data in enumerate(test_loader):
    batch_x,batch_y=data
    batch_x,batch_y=Variable(batch_x),Variable(batch_y)
    out=mode1_ft_res18(batch_x)
    loss = criterion(out, batch_y)
    eval_loss += loss.data[0]
    # pred is the expect class
    # batch_y is the true label
    pred = torch.max(out, 1)[1]
    test_correct = (pred == batch_y).sum()
    eval_acc += test_correct.data[0]
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
print( 'Test_loss: ', eval_loss / len(test_data), 'Test acc: ', eval_acc / len(test_data))

二、PyTorch 利用預(yù)訓(xùn)練模型進(jìn)行Fine-tuning

在Deep Learning領(lǐng)域,很多子領(lǐng)域的應(yīng)用,比如一些動(dòng)物識(shí)別,食物的識(shí)別等,公開的可用的數(shù)據(jù)庫(kù)相對(duì)于ImageNet等數(shù)據(jù)庫(kù)而言,其規(guī)模太小了,無(wú)法利用深度網(wǎng)絡(luò)模型直接train from scratch,容易引起過擬合,這時(shí)就需要把一些在大規(guī)模數(shù)據(jù)庫(kù)上已經(jīng)訓(xùn)練完成的模型拿過來(lái),在目標(biāo)數(shù)據(jù)庫(kù)上直接進(jìn)行Fine-tuning(微調(diào)),這個(gè)已經(jīng)經(jīng)過訓(xùn)練的模型對(duì)于目標(biāo)數(shù)據(jù)集而言,只是一種相對(duì)較好的參數(shù)初始化方法而已,尤其是大數(shù)據(jù)集與目標(biāo)數(shù)據(jù)集結(jié)構(gòu)比較相似的話,經(jīng)過在目標(biāo)數(shù)據(jù)集上微調(diào)能夠得到不錯(cuò)的效果。

Fine-tune預(yù)訓(xùn)練網(wǎng)絡(luò)的步驟:

1. 首先更改預(yù)訓(xùn)練模型分類層全連接層的數(shù)目,因?yàn)橐话隳繕?biāo)數(shù)據(jù)集的類別數(shù)與大規(guī)模數(shù)據(jù)庫(kù)的類別數(shù)不一致,更改為目標(biāo)數(shù)據(jù)集上訓(xùn)練集的類別數(shù)目即可,一致的話則無(wú)需更改;

2. 把分類器前的網(wǎng)絡(luò)的所有層的參數(shù)固定,即不讓它們參與學(xué)習(xí),不進(jìn)行反向傳播,只訓(xùn)練分類層的網(wǎng)絡(luò),這時(shí)學(xué)習(xí)率可以設(shè)置的大一點(diǎn),如是原來(lái)初始學(xué)習(xí)率的10倍或幾倍或0.01等,這時(shí)候網(wǎng)絡(luò)訓(xùn)練的比較快,因?yàn)槌朔诸悓樱渌鼘硬恍枰M(jìn)行反向傳播,可以多嘗試不同的學(xué)習(xí)率設(shè)置。

3.接下來(lái)是設(shè)置相對(duì)較小的學(xué)習(xí)率,對(duì)整個(gè)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,這時(shí)網(wǎng)絡(luò)訓(xùn)練變慢啦。

下面對(duì)利用PyTorch深度學(xué)習(xí)框架Fine-tune預(yù)訓(xùn)練網(wǎng)絡(luò)的過程中涉及到的固定可學(xué)習(xí)參數(shù),對(duì)不同的層設(shè)置不同的學(xué)習(xí)率等進(jìn)行詳細(xì)講解。

1. PyTorch對(duì)某些層固定網(wǎng)絡(luò)的可學(xué)習(xí)參數(shù)的方法:

class Net(nn.Module):
    def __init__(self, num_classes=546):
        super(Net, self).__init__()
        self.features = nn.Sequential(
 
            nn.Conv2d(1, 64, kernel_size=3, stride=2, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
        )
 
        self.Conv1_1 = nn.Sequential(
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
        )
 
  for p in self.parameters():
            p.requires_grad=False
        self.Conv1_2 = nn.Sequential(
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
        )

如上述代碼,則模型Net網(wǎng)絡(luò)中self.features與self.Conv1_1層中的參數(shù)便是固定,不可學(xué)習(xí)的。這主要看代碼:

for p in self.parameters():
    p.requires_grad=False

插入的位置,這段代碼前的所有層的參數(shù)是不可學(xué)習(xí)的,也就沒有反向傳播過程。也可以指定某一層的參數(shù)不可學(xué)習(xí),如下:

for p in  self.features.parameters():
    p.requires_grad=False

則 self.features層所有參數(shù)均是不可學(xué)習(xí)的。

注意,上述代碼設(shè)置若要真正生效,在訓(xùn)練網(wǎng)絡(luò)時(shí)需要在設(shè)置優(yōu)化器如下:

 optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), args.lr,
        momentum=args.momentum,
        weight_decay=args.weight_decay)

2. PyTorch之為不同的層設(shè)置不同的學(xué)習(xí)率

model = Net()
conv1_2_params = list(map(id, model.Conv1_2.parameters()))
base_params = filter(lambda p: id(p) not in conv1_2_params,
                     model.parameters())
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr}], args.lr,             
            momentum=args.momentum, weight_decay=args.weight_decay)

上述代碼表示將模型Net網(wǎng)絡(luò)的 self.Conv1_2層的學(xué)習(xí)率設(shè)置為傳入學(xué)習(xí)率的10倍,base_params的學(xué)習(xí)沒有明確設(shè)置,則默認(rèn)為傳入的學(xué)習(xí)率args.lr。

注意:

[{'params': base_params}, {'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr}]

表示為列表中的字典結(jié)構(gòu)。

這種方法設(shè)置不同的學(xué)習(xí)率顯得不夠靈活,可以為不同的層設(shè)置靈活的學(xué)習(xí)率,可以采用如下方法在adjust_learning_rate函數(shù)中設(shè)置:

def adjust_learning_rate(optimizer, epoch, args):
    lre = []
    lre.extend([0.01] * 10)
    lre.extend([0.005] * 10)
    lre.extend([0.0025] * 10)
    lr = lre[epoch]
    optimizer.param_groups[0]['lr'] = 0.9 * lr
    optimizer.param_groups[1]['lr'] = 10 * lr
    print(param_group[0]['lr'])
    print(param_group[1]['lr'])

上述代碼中的optimizer.param_groups[0]就代表[{'params': base_params}, {'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr}]中的'params': base_params},optimizer.param_groups[1]代表{'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr},這里設(shè)置的學(xué)習(xí)率會(huì)把a(bǔ)rgs.lr給覆蓋掉,個(gè)人認(rèn)為上述代碼在設(shè)置學(xué)習(xí)率方面更靈活一些。上述代碼也可如下變成實(shí)現(xiàn)(注意學(xué)習(xí)率隨便設(shè)置的,未與上述代碼保持一致):

def adjust_learning_rate(optimizer, epoch, args):
    lre = np.logspace(-2, -4, 40)
    lr = lre[epoch]
    for i in range(len(optimizer.param_groups)):
        param_group = optimizer.param_groups[i]
        if i == 0:
            param_group['lr'] = 0.9 * lr
        else:
            param_group['lr'] = 10 * lr
        print(param_group['lr'])

下面貼出SGD優(yōu)化器的PyTorch實(shí)現(xiàn),及其每個(gè)參數(shù)的設(shè)置和表示意義,具體如下:

import torch
from .optimizer import Optimizer, required
 
class SGD(Optimizer):
    r"""Implements stochastic gradient descent (optionally with momentum).
    Nesterov momentum is based on the formula from
    `On the importance of initialization and momentum in deep learning`__.
    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float): learning rate
        momentum (float, optional): momentum factor (default: 0)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        dampening (float, optional): dampening for momentum (default: 0)
        nesterov (bool, optional): enables Nesterov momentum (default: False)
    Example:
        >>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
        >>> optimizer.zero_grad()
        >>> loss_fn(model(input), target).backward()
        >>> optimizer.step()
    __ http://www.cs.toronto.edu/%7Ehinton/absps/momentum.pdf
    .. note::
        The implementation of SGD with Momentum/Nesterov subtly differs from
        Sutskever et. al. and implementations in some other frameworks.
        Considering the specific case of Momentum, the update can be written as
        .. math::
                  v = \rho * v + g \\
                  p = p - lr * v
        where p, g, v and :math:`\rho` denote the parameters, gradient,
        velocity, and momentum respectively.
        This is in contrast to Sutskever et. al. and
        other frameworks which employ an update of the form
        .. math::
             v = \rho * v + lr * g \\
             p = p - v
        The Nesterov version is analogously modified.
    """
 
    def __init__(self, params, lr=required, momentum=0, dampening=0,
                 weight_decay=0, nesterov=False):
        if lr is not required and lr  0.0:
            raise ValueError("Invalid learning rate: {}".format(lr))
        if momentum  0.0:
            raise ValueError("Invalid momentum value: {}".format(momentum))
        if weight_decay  0.0:
            raise ValueError("Invalid weight_decay value: {}".format(weight_decay))
 
        defaults = dict(lr=lr, momentum=momentum, dampening=dampening,
                        weight_decay=weight_decay, nesterov=nesterov)
        if nesterov and (momentum = 0 or dampening != 0):
            raise ValueError("Nesterov momentum requires a momentum and zero dampening")
        super(SGD, self).__init__(params, defaults)
 
    def __setstate__(self, state):
        super(SGD, self).__setstate__(state)
        for group in self.param_groups:
            group.setdefault('nesterov', False)
 
    def step(self, closure=None):
        """Performs a single optimization step.
        Arguments:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        """
        loss = None
        if closure is not None:
            loss = closure()
 
        for group in self.param_groups:
            weight_decay = group['weight_decay']
            momentum = group['momentum']
            dampening = group['dampening']
            nesterov = group['nesterov']
 
            for p in group['params']:
                if p.grad is None:
                    continue
                d_p = p.grad.data
                if weight_decay != 0:
                    d_p.add_(weight_decay, p.data)
                if momentum != 0:
                    param_state = self.state[p]
                    if 'momentum_buffer' not in param_state:
                        buf = param_state['momentum_buffer'] = torch.zeros_like(p.data)
                        buf.mul_(momentum).add_(d_p)
                    else:
                        buf = param_state['momentum_buffer']
                        buf.mul_(momentum).add_(1 - dampening, d_p)
                    if nesterov:
                        d_p = d_p.add(momentum, buf)
                    else:
                        d_p = buf
 
                p.data.add_(-group['lr'], d_p)
 
        return loss

經(jīng)驗(yàn)總結(jié):

在Fine-tuning時(shí)最好不要隔層設(shè)置層的參數(shù)的可學(xué)習(xí)與否,這樣做一般效果餅不理想,一般準(zhǔn)則即可,即先Fine-tuning分類層,學(xué)習(xí)率設(shè)置的大一些,然后在將整個(gè)網(wǎng)絡(luò)設(shè)置一個(gè)較小的學(xué)習(xí)率,所有層一起訓(xùn)練。

至于不先經(jīng)過Fine-tune分類層,而是將整個(gè)網(wǎng)絡(luò)所有層一起訓(xùn)練,只是分類層的學(xué)習(xí)率相對(duì)設(shè)置大一些,這樣做也可以,至于哪個(gè)效果更好,沒評(píng)估過。當(dāng)用三元組損失(triplet loss)微調(diào)用softmax loss訓(xùn)練的網(wǎng)絡(luò)時(shí),可以設(shè)置階梯型的較小學(xué)習(xí)率,整個(gè)網(wǎng)絡(luò)所有層一起訓(xùn)練,效果比較好,而不用先Fine-tune分類層前一層的輸出。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • pytorch 實(shí)現(xiàn)將自己的圖片數(shù)據(jù)處理成可以訓(xùn)練的圖片類型
  • pytorch 準(zhǔn)備、訓(xùn)練和測(cè)試自己的圖片數(shù)據(jù)的方法
  • Pytorch自己加載單通道圖片用作數(shù)據(jù)集訓(xùn)練的實(shí)例
  • Pytorch之finetune使用詳解

標(biāo)簽:南寧 牡丹江 六盤水 聊城 揚(yáng)州 楊凌 撫州 迪慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作》,本文關(guān)鍵詞  pytorch,finetuning,自己的,圖片,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    在线精品亚洲一区二区不卡| 蜜臀久久99精品久久久画质超高清| 精品在线观看视频| 国产日本欧洲亚洲| 亚洲a一区二区| 国产亚洲婷婷免费| 欧美午夜免费电影| 久久99精品久久久久| 欧美国产激情一区二区三区蜜月| 国产日韩视频一区二区三区| 一本一道综合狠狠老| 91麻豆精品国产91久久久久久久久| 成人av网址在线观看| 97久久久精品综合88久久| 色久优优欧美色久优优| 欧美精品自拍偷拍| 欧美精品一区二区三区在线| 中文字幕在线一区免费| 图片区小说区国产精品视频| 麻豆视频观看网址久久| 成人久久久精品乱码一区二区三区| 91在线国产福利| 日韩欧美成人一区| 亚洲人成网站精品片在线观看| 亚洲国产一区二区视频| 国产精品一区二区免费不卡 | 99久久伊人网影院| 久久99精品国产91久久来源| 午夜伦欧美伦电影理论片| 激情综合一区二区三区| 91精品国产全国免费观看| 欧美性色黄大片| 69堂国产成人免费视频| 日韩三级视频中文字幕| 26uuu色噜噜精品一区二区| 欧美国产亚洲另类动漫| 久久人人97超碰com| 欧美色综合天天久久综合精品| 337p粉嫩大胆噜噜噜噜噜91av | 日韩成人精品在线| 国产精品萝li| 麻豆91在线播放免费| 精品亚洲成a人| 中文欧美字幕免费| 欧美视频中文字幕| 国产成人综合网| 国产成人免费网站| 99久免费精品视频在线观看| 成人免费视频一区| 亚洲色图欧美偷拍| 国产日韩欧美高清| 欧美激情综合五月色丁香| 中文字幕一区二区日韩精品绯色| 欧美一区中文字幕| 国产区在线观看成人精品 | 青娱乐精品在线视频| 国产精品久久久久一区二区三区 | 欧美综合色免费| 日本一道高清亚洲日美韩| 国产成人精品亚洲777人妖 | 三级不卡在线观看| 秋霞午夜鲁丝一区二区老狼| 精品制服美女久久| 欧美日韩午夜精品| 国产女主播在线一区二区| 亚洲6080在线| 粉嫩13p一区二区三区| 欧美久久婷婷综合色| 中文字幕亚洲不卡| 国产一二三精品| 欧美一区二区三区播放老司机| 国产视频在线观看一区二区三区| 亚洲午夜一二三区视频| 国产成人a级片| 久久久精品国产免大香伊| 国产一区二区三区观看| 国产精品美女久久久久久久久久久| 国产不卡视频在线播放| ...中文天堂在线一区| 欧美日韩免费一区二区三区视频| 久久久久久久综合狠狠综合| 日韩欧美国产午夜精品| 男人操女人的视频在线观看欧美| 亚洲gay无套男同| 欧美一区二区播放| 91丨porny丨国产| 日日噜噜夜夜狠狠视频欧美人 | 亚洲国产日韩一区二区| 欧美成人r级一区二区三区| 99精品久久免费看蜜臀剧情介绍| 日产欧产美韩系列久久99| 欧美韩国日本综合| 精品理论电影在线观看| 欧美二区三区的天堂| 91精品国产一区二区三区| 欧美日韩亚洲综合在线| 亚洲精品一区二区三区福利| 日韩va亚洲va欧美va久久| 麻豆精品久久精品色综合| 久久精品国产亚洲一区二区三区| 亚洲午夜精品在线| 7799精品视频| 懂色av中文一区二区三区 | 日日摸夜夜添夜夜添亚洲女人| 国产欧美日韩在线视频| 中文字幕av一区二区三区| 激情综合色综合久久| 久久久精品黄色| 91影院在线观看| 日韩国产高清影视| 在线观看国产日韩| 狠狠久久亚洲欧美| 一区二区三区四区五区视频在线观看| 免费高清在线视频一区·| 精品电影一区二区三区| 成人av电影观看| 精品一区二区在线观看| 国产主播一区二区三区| 亚洲综合男人的天堂| 国产一区二区三区| 69久久99精品久久久久婷婷| 色综合色狠狠综合色| 国产激情视频一区二区三区欧美 | www.欧美日韩| 丝袜国产日韩另类美女| 中文字幕一区二区三区精华液 | 国产欧美日韩不卡| 欧美性色aⅴ视频一区日韩精品| 国内一区二区在线| 亚洲成人av在线电影| 亚洲天堂精品在线观看| 亚洲三级在线播放| 自拍偷拍亚洲综合| 日韩欧美国产小视频| 91精品在线观看入口| 欧美一级在线免费| 久久综合狠狠综合| 久久精品视频一区| 一区二区三区免费看视频| 亚洲黄色录像片| 亚洲欧洲日韩一区二区三区| 91精品国产综合久久久久久久| 日本久久电影网| 91精品国产全国免费观看| 日韩你懂的电影在线观看| 国产精品久久久久久久浪潮网站| 国产欧美日本一区视频| 视频在线观看一区| 成人激情午夜影院| 欧美日韩一区二区在线观看视频 | 日本最新不卡在线| 激情综合网天天干| 成人久久18免费网站麻豆| 99精品视频在线播放观看| 欧美视频你懂的| 国产婷婷色一区二区三区四区 | 久久先锋资源网| 夜色激情一区二区| 欧美日韩一区二区三区四区| 精品视频123区在线观看| 欧美大片日本大片免费观看| 国产精品入口麻豆原神| 秋霞电影一区二区| 一本色道久久综合精品竹菊| 日韩欧美中文字幕精品| 亚洲女爱视频在线| eeuss鲁片一区二区三区在线看| 欧美电影精品一区二区| 首页欧美精品中文字幕| 日韩一二三四区| 奇米一区二区三区| 色先锋aa成人| 国产精品视频观看| 成人午夜电影久久影院| 欧美精品一卡二卡| 久久夜色精品国产欧美乱极品| 久久成人av少妇免费| 久久精品人人做人人综合| 国产精品一区二区视频| 亚洲欧洲综合另类在线| 欧美一区二区三区思思人| 国产精品99久久久久久久vr| 欧美激情一区二区| 91看片淫黄大片一级在线观看| 日韩欧美国产高清| 精品一区二区三区在线播放| 国产精品白丝在线| 日韩一区二区免费电影| 《视频一区视频二区| 91精品婷婷国产综合久久竹菊| 国产成人午夜精品5599| 一区二区三区在线免费播放| 色综合久久久久久久久| 香蕉成人啪国产精品视频综合网| 亚洲国产成人av| 欧美r级电影在线观看| 国产 日韩 欧美大片| 亚洲品质自拍视频网站| 欧美喷水一区二区| 精品亚洲porn|