日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

AI入门:Transfer Learning(迁移学习)

發(fā)布時(shí)間:2025/3/8 ChatGpt 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AI入门:Transfer Learning(迁移学习) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

遷移學(xué)習(xí)是一種機(jī)器學(xué)習(xí)方法,就是把為任務(wù) A 開發(fā)的模型作為初始點(diǎn),重新使用在為任務(wù) B 開發(fā)模型的過程中

Pokemon Dataset

通過網(wǎng)絡(luò)上收集寶可夢的圖片,制作圖像分類數(shù)據(jù)集。我收集了5種寶可夢,分別是皮卡丘,超夢,杰尼龜,小火龍,妙蛙種子

數(shù)據(jù)集鏈接:https://pan.baidu.com/s/1Kept7FF88lb8TqPZMD_Yxw提取碼:1sdd

一共有1168張寶可夢的圖片,其中皮卡丘234張,超夢239張,杰尼龜223張,小火龍238張,妙蛙種子234張

每個(gè)目錄由神奇寶貝名字命名,對應(yīng)目錄下是該神奇寶貝的圖片,圖片的格式有jpg,png,jpeg三種

數(shù)據(jù)集的劃分如下(訓(xùn)練集60%,驗(yàn)證集20%,測試集20%)。這個(gè)比例不是針對每一類提取,而是針對總體的1168張

Load Data

在PyTorch中定義數(shù)據(jù)集主要涉及到兩個(gè)主要的類:Dataset和DataLoder

DataSet類

DataSet類是PyTorch中所有數(shù)據(jù)集加載類中都應(yīng)該繼承的父類,它的兩個(gè)私有成員函數(shù)__len__()和__getitem__()必須被重載,否則將觸發(fā)錯(cuò)誤提示

其中__len__()應(yīng)該返回?cái)?shù)據(jù)集的樣本數(shù)量,而__getitem__()實(shí)現(xiàn)通過索引返回樣本數(shù)據(jù)的功能

首先看一個(gè)自定義Dataset的例子

class NumbersDataset(Dataset):def __init__(self, training=True):if training:self.samples = list(range(1, 1001))else:self.samples = list(range(1001, 1501))def __len__(self):return len(self.samples)def __getitem__(self, idx):return self.samples[idx]

然后需要對圖片做Preprocessing

  • Image Resize:224*224 for ResNet18

  • Data Argumentation:Rotate & Crop

  • Normalize:Mean & std

  • ToTensor

  • 首先我們在__init__()函數(shù)里將name->label,這里的name就是文件夾的名字,然后拆分?jǐn)?shù)據(jù)集,按照6:2:2的比例

    class Pokemon(Dataset):def __init__(self, root, resize, model):super(Pokemon, self).__init__()self.root = rootself.resize = resizeself.name2label = {} # 將文件夾的名字映射為label(數(shù)字)for name in sorted(os.listdir(os.path.join(root))):if not os.path.isdir(os.path.join(root, name)):continueself.name2label[name] = len(self.name2label.keys())# image, labelself.images, self.labels = self.load_csv('images.csv')if model == 'train': # 60%self.images = self.images[:int(0.6*len(self.images))]self.labels = self.labels[:int(0.6*len(self.labels))]elif model == 'val': # 20%self.images = self.images[int(0.6*len(self.images)):int(0.8*len(self.images))]self.labels = self.labels[int(0.6*len(self.labels)):int(0.8*len(self.labels))]else: # 20%self.images = self.images[int(0.8*len(self.images)):]self.labels = self.labels[int(0.8*len(self.labels)):]

    其中l(wèi)oad_csv()函數(shù)的作用是將所有的圖片名(名字里包含完整的路徑)以及l(fā)abel都存到csv文件里,例如,有一個(gè)圖片的路徑是pokemon\\bulbasaur\\00000000.png,對應(yīng)的label是0,那么csv就會寫入一行pokemon\\bulbasaur\\00000000.png, 0,總共寫入了1167行(有一張圖片既不是png,也不是jpg和jpeg,找不到,算了)。load_csv()函數(shù)具體如下所示

    def load_csv(self, filename):if not os.path.exists(os.path.join(self.root, filename)):images = []for name in self.name2label.keys():images += glob.glob(os.path.join(self.root, name, '*.png'))images += glob.glob(os.path.join(self.root, name, '*.jpg'))images += glob.glob(os.path.join(self.root, name, '*.jpeg'))random.shuffle(images)with open(os.path.join(self.root, filename), mode='w', newline='') as f:writer = csv.writer(f)for img in images: # pokemon\\bulbasaur\\00000000.pngname = img.split(os.sep)[-2] # bulbasaurlabel = self.name2label[name]# pokemon\\bulbasaur\\00000000.png 0writer.writerow([img, label])print('writen into csv file:', filename)# read csv fileimages, labels = [], []with open(os.path.join(self.root, filename)) as f:reader = csv.reader(f)for row in reader:image, label = rowlabel = int(label)images.append(image)labels.append(label)assert len(images) == len(labels)return images, labels

    然后是__len__()函數(shù)的代碼

    def __len__(self):return len(self.images)

    最后是__getitem__()函數(shù)的代碼,這個(gè)比較復(fù)雜,因?yàn)槲覀儸F(xiàn)在只有圖片的string path(字符串形式的路徑),要先轉(zhuǎn)成三通道的image data,這個(gè)利用PIL庫中的Image.open(path).convert('RGB')函數(shù)可以完成。圖片讀取出來以后,要經(jīng)過一系列的transforms,具體代碼如下

    def __getitem__(self, idx):# idx [0~len(images)]# self.images, self.labels# pokemon\\bulbasaur\\00000000.png 0img, label = self.images[idx], self.labels[idx]tf = transforms.Compose([lambda x:Image.open(x).convert('RGB'), # string path => image datatransforms.Resize((int(self.resize*1.25), int(self.resize*1.25))),transforms.RandomRotation(15),transforms.CenterCrop(self.resize),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])img = tf(img)label = torch.tensor(label)return img, label

    Normalize的參數(shù)是PyTorch推薦的,直接寫上就可以了

    DataLoader類

    Dataset類是讀入數(shù)據(jù)集并對讀入的數(shù)據(jù)進(jìn)行了索引,但是光有這個(gè)功能是不夠的,在實(shí)際加載數(shù)據(jù)集的過程中,我們的數(shù)據(jù)量往往都很大,因此還需要以下幾個(gè)功能:

  • 每次讀入一些批次:batch_size

  • 可以對數(shù)據(jù)進(jìn)行隨機(jī)讀取,打亂數(shù)據(jù)的順序(shuffling)

  • 可以并行加載數(shù)據(jù)集(利用多核處理器加快載入數(shù)據(jù)的效率)

  • 為此,就需要DataLoader類了,它里面常用的參數(shù)有:

    • batch_size:每個(gè)batch的大小

    • shuffle:是否進(jìn)行shuffle操作

    • num_works:加載數(shù)據(jù)的時(shí)候使用幾個(gè)進(jìn)程

    DataLoader這個(gè)類并不需要我們自己設(shè)計(jì)代碼,只需要利用它讀取我們設(shè)計(jì)好的Dataset的子類即可

    db = Pokemon('pokemon', 224, 'train') lodder = DataLoader(db, batch_size=32, shuffle=True, num_workers=4)

    完整代碼如下:

    import torch import os, glob import random, csv from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Imageclass Pokemon(Dataset):def __init__(self, root, resize, model):super(Pokemon, self).__init__()self.root = rootself.resize = resizeself.name2label = {} # 將文件夾的名字映射為label(數(shù)字)for name in sorted(os.listdir(os.path.join(root))):if not os.path.isdir(os.path.join(root, name)):continueself.name2label[name] = len(self.name2label.keys())# image, labelself.images, self.labels = self.load_csv('images.csv')if model == 'train': # 60%self.images = self.images[:int(0.6*len(self.images))]self.labels = self.labels[:int(0.6*len(self.labels))]elif model == 'val': # 20%self.images = self.images[int(0.6*len(self.images)):int(0.8*len(self.images))]self.labels = self.labels[int(0.6*len(self.labels)):int(0.8*len(self.labels))]else: # 20%self.images = self.images[int(0.8*len(self.images)):]self.labels = self.labels[int(0.8*len(self.labels)):]def load_csv(self, filename):if not os.path.exists(os.path.join(self.root, filename)):images = []for name in self.name2label.keys():images += glob.glob(os.path.join(self.root, name, '*.png'))images += glob.glob(os.path.join(self.root, name, '*.jpg'))images += glob.glob(os.path.join(self.root, name, '*.jpeg'))random.shuffle(images)with open(os.path.join(self.root, filename), mode='w', newline='') as f:writer = csv.writer(f)for img in images: # pokemon\\bulbasaur\\00000000.pngname = img.split(os.sep)[-2] # bulbasaurlabel = self.name2label[name]# pokemon\\bulbasaur\\00000000.png 0writer.writerow([img, label])print('writen into csv file:', filename)# read csv fileimages, labels = [], []with open(os.path.join(self.root, filename)) as f:reader = csv.reader(f)for row in reader:image, label = rowlabel = int(label)images.append(image)labels.append(label)assert len(images) == len(labels)return images, labelsdef __len__(self):return len(self.images)def __getitem__(self, idx):# idx [0~len(images)]# self.images, self.labels# pokemon\\bulbasaur\\00000000.png 0img, label = self.images[idx], self.labels[idx]tf = transforms.Compose([lambda x:Image.open(x).convert('RGB'), # string path => image datatransforms.Resize((int(self.resize*1.25), int(self.resize*1.25))),transforms.RandomRotation(15),transforms.CenterCrop(self.resize),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])img = tf(img)label = torch.tensor(label)return img, labeldb = Pokemon('pokemon', 224, 'train') lodder = DataLoader(db, batch_size=32, shuffle=True, num_workers=8)

    Build Model

    用PyTorch搭建ResNet其實(shí)在我之前的文章(https://wmathor.com/index.php/archives/1389/)已經(jīng)講過了,這里直接拿來用,修改一下里面的參數(shù)就行了

    import torch import torch.nn as nn import torch.nn.functional as Fclass ResBlk(nn.Module):def __init__(self, ch_in, ch_out, stride=1):super(ResBlk, self).__init__()self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)self.bn1 = nn.BatchNorm2d(ch_out)self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)self.bn2 = nn.BatchNorm2d(ch_out)self.extra = nn.Sequential()if ch_out != ch_in:self.extra = nn.Sequential(nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),nn.BatchNorm2d(ch_out),)def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))# short cutout = self.extra(x) + outout = F.relu(out)return outclass ResNet18(nn.Module):def __init__(self, num_class):super(ResNet18, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(3, 16, kernel_size=3, stride=3, padding=0),nn.BatchNorm2d(16),)# followed 4 blocks# [b, 16, h, w] => [b, 32, h, w]self.blk1 = ResBlk(16, 32, stride=3)# [b, 32, h, w] => [b, 64, h, w]self.blk2 = ResBlk(32, 64, stride=3)# [b, 64, h, w] => [b, 128, h, w]self.blk3 = ResBlk(64, 128, stride=2)# [b, 128, h, w] => [b, 256, h, w]self.blk4 = ResBlk(128, 256, stride=2)self.outlayer = nn.Linear(256*3*3, num_class)def forward(self, x):x = F.relu(self.conv1(x))x = self.blk1(x)x = self.blk2(x)x = self.blk3(x)x = self.blk4(x)x = x.view(x.size(0), -1)x = self.outlayer(x)return x

    Train and Test

    訓(xùn)練的時(shí)候,嚴(yán)格按照Training和Test的邏輯,就是在訓(xùn)練epoch的過程中,間斷的做一次validation,然后看一下當(dāng)前的validation accuracy是不是最高的,如果是最高的,就把當(dāng)前的模型參數(shù)保存起來。training完以后,加載最好的模型,再做testing。這就是非常嚴(yán)格的訓(xùn)練邏輯。代碼如下:

    batchsz = 32 lr = 1e-3 epochs = 10 device = torch.device('cuda') torch.manual_seed(1234)train_db = Pokemon('pokemon', 224, model='train') val_db = Pokemon('pokemon', 224, model='val') test_db = Pokemon('pokemon', 224, model='test') train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True, num_workers=2) val_loader = DataLoader(val_db, batch_size=batchsz, num_workers=2) test_loader = DataLoader(test_db, batch_size=batchsz, num_workers=2)def evalute(model, loader):correct = 0total = len(loader.dataset)for x,y in loader:with torch.no_grad():logits = model(x)pred = logits.argmax(dim=1)correct += torch.eq(pred, y).sum().float().item()return correct / totaldef main():model = ResNet18(5)optimizer = optim.Adam(model.parameters(), lr=lr)criteon = nn.CrossEntropyLoss()best_acc, best_epoch = 0, 0for epoch in range(epochs):for step, (x, y) in enumerate(train_loader):# x:[b, 3, 224, 224], y:[b]logits = model(x)loss = criteon(logits, y)optimizer.zero_grad()loss.backward()optimizer.step()if epoch % 2 == 0:val_acc = evalute(model, val_loader)if val_acc > best_acc:best_epoch = epochbest_acc = val_acctorch.save(model.state_dict(), 'best.mdl')print('best acc:', best_acc, 'best_epoch', best_epoch)model.load_state_dict(torch.load('best.mdl'))print('loaded from ckt!')test_acc = evalute(model, test_loader)print('test_acc:', test_acc)

    截至到目前為止,能完整運(yùn)行的代碼如下:

    import torch import os, glob import warnings import random, csv from PIL import Image from torch import optim, nn import torch.nn.functional as F from torchvision import transforms from torch.utils.data import Dataset, DataLoader warnings.filterwarnings('ignore')class Pokemon(Dataset):def __init__(self, root, resize, model):super(Pokemon, self).__init__()self.root = rootself.resize = resizeself.name2label = {} # 將文件夾的名字映射為label(數(shù)字)for name in sorted(os.listdir(os.path.join(root))):if not os.path.isdir(os.path.join(root, name)):continueself.name2label[name] = len(self.name2label.keys())# image, labelself.images, self.labels = self.load_csv('images.csv')if model == 'train': # 60%self.images = self.images[:int(0.6*len(self.images))]self.labels = self.labels[:int(0.6*len(self.labels))]elif model == 'val': # 20%self.images = self.images[int(0.6*len(self.images)):int(0.8*len(self.images))]self.labels = self.labels[int(0.6*len(self.labels)):int(0.8*len(self.labels))]else: # 20%self.images = self.images[int(0.8*len(self.images)):]self.labels = self.labels[int(0.8*len(self.labels)):]def load_csv(self, filename):if not os.path.exists(os.path.join(self.root, filename)):images = []for name in self.name2label.keys():images += glob.glob(os.path.join(self.root, name, '*.png'))images += glob.glob(os.path.join(self.root, name, '*.jpg'))images += glob.glob(os.path.join(self.root, name, '*.jpeg'))random.shuffle(images)with open(os.path.join(self.root, filename), mode='w', newline='') as f:writer = csv.writer(f)for img in images: # pokemon\\bulbasaur\\00000000.pngname = img.split(os.sep)[-2] # bulbasaurlabel = self.name2label[name]# pokemon\\bulbasaur\\00000000.png 0writer.writerow([img, label])print('writen into csv file:', filename)# read csv fileimages, labels = [], []with open(os.path.join(self.root, filename)) as f:reader = csv.reader(f)for row in reader:image, label = rowlabel = int(label)images.append(image)labels.append(label)assert len(images) == len(labels)return images, labelsdef __len__(self):return len(self.images)def __getitem__(self, idx):# idx [0~len(images)]# self.images, self.labels# pokemon\\bulbasaur\\00000000.png 0img, label = self.images[idx], self.labels[idx]tf = transforms.Compose([lambda x:Image.open(x).convert('RGB'), # string path => image datatransforms.Resize((int(self.resize*1.25), int(self.resize*1.25))),transforms.RandomRotation(15),transforms.CenterCrop(self.resize),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])img = tf(img)label = torch.tensor(label)return img, labelclass ResBlk(nn.Module):def __init__(self, ch_in, ch_out, stride=1):super(ResBlk, self).__init__()self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)self.bn1 = nn.BatchNorm2d(ch_out)self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)self.bn2 = nn.BatchNorm2d(ch_out)self.extra = nn.Sequential()if ch_out != ch_in:self.extra = nn.Sequential(nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),nn.BatchNorm2d(ch_out),)def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))# short cutout = self.extra(x) + outout = F.relu(out)return outclass ResNet18(nn.Module):def __init__(self, num_class):super(ResNet18, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(3, 16, kernel_size=3, stride=3, padding=0),nn.BatchNorm2d(16),)# followed 4 blocks# [b, 16, h, w] => [b, 32, h, w]self.blk1 = ResBlk(16, 32, stride=3)# [b, 32, h, w] => [b, 64, h, w]self.blk2 = ResBlk(32, 64, stride=3)# [b, 64, h, w] => [b, 128, h, w]self.blk3 = ResBlk(64, 128, stride=2)# [b, 128, h, w] => [b, 256, h, w]self.blk4 = ResBlk(128, 256, stride=2)self.outlayer = nn.Linear(256*3*3, num_class)def forward(self, x):x = F.relu(self.conv1(x))x = self.blk1(x)x = self.blk2(x)x = self.blk3(x)x = self.blk4(x)x = x.view(x.size(0), -1)x = self.outlayer(x)return xbatchsz = 32 lr = 1e-3 epochs = 10 device = torch.device('cuda') torch.manual_seed(1234)train_db = Pokemon('pokemon', 224, model='train') val_db = Pokemon('pokemon', 224, model='val') test_db = Pokemon('pokemon', 224, model='test') train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True, num_workers=2) val_loader = DataLoader(val_db, batch_size=batchsz, num_workers=2) test_loader = DataLoader(test_db, batch_size=batchsz, num_workers=2)def evalute(model, loader):correct = 0total = len(loader.dataset)for x,y in loader:with torch.no_grad():logits = model(x)pred = logits.argmax(dim=1)correct += torch.eq(pred, y).sum().float().item()return correct / totaldef main():model = ResNet18(5)optimizer = optim.Adam(model.parameters(), lr=lr)criteon = nn.CrossEntropyLoss()best_acc, best_epoch = 0, 0for epoch in range(epochs):for step, (x, y) in enumerate(train_loader):# x:[b, 3, 224, 224], y:[b]logits = model(x)loss = criteon(logits, y)optimizer.zero_grad()loss.backward()optimizer.step()if epoch % 2 == 0:val_acc = evalute(model, val_loader)if val_acc > best_acc:best_epoch = epochbest_acc = val_acctorch.save(model.state_dict(), 'best.mdl')print('best acc:', best_acc, 'best_epoch', best_epoch)model.load_state_dict(torch.load('best.mdl'))print('loaded from ckt!')test_acc = evalute(model, test_loader)print('test_acc:', test_acc)if __name__ == '__main__':main()

    Transfer Learning

    運(yùn)行上面的代碼,基本上最終test accuracy可以達(dá)到0.88左右。如果想要提升的話,就需要使用更多工程上的tricks或者調(diào)參

    當(dāng)然還有一種方法,就是遷移學(xué)習(xí),我們先看下面這張圖,這張圖展示的問題在于,當(dāng)數(shù)據(jù)很少的情況下(第一張圖),模型訓(xùn)練的結(jié)果可能會有很多情況(第二張圖),當(dāng)然最終輸出就一個(gè)結(jié)果。然而這個(gè)結(jié)果可能test accuracy并不高。就比方說我們的pokemon圖片,只有1000多張,算是一個(gè)比較少的數(shù)據(jù)集了,但是由于pokemon和ImageNet都是圖片,它們可能存在某些共性。那我們能不能用ImageNet的一些train好的模型,拿來幫助我們解決一下特定的圖片分類任務(wù),這就是Transfer Learning,也就是在A任務(wù)上train好一個(gè)分類器,再transfer到B上去

    我個(gè)人理解Transfer Learning的作用是這樣的,我們都知道神經(jīng)網(wǎng)絡(luò)初始化參數(shù)非常重要,有時(shí)候初始化不好,可能就會導(dǎo)致最終效果非常差。現(xiàn)在我們用一個(gè)在A任務(wù)上已經(jīng)訓(xùn)練好了的網(wǎng)絡(luò),相當(dāng)于幫你做了一個(gè)很好的初始化,你在這個(gè)網(wǎng)絡(luò)的基礎(chǔ)上,去做B任務(wù),如果這兩個(gè)任務(wù)比較接近的話,夸張一點(diǎn)說,這個(gè)網(wǎng)絡(luò)的訓(xùn)練可能就只需要微調(diào)一下,就能在B任務(wù)上顯示出非常好的效果

    下圖展示的是一個(gè)真實(shí)的Transfer Learning的過程,左邊是已經(jīng)training好的網(wǎng)絡(luò),我們利用這個(gè)網(wǎng)絡(luò)的公有部分,吸取它的common knowledge, 然后把最后一層去掉,換成我們需要的

    先上核心代碼

    import torch.nn as nn from torchvision.models import resnet18class Flatten(nn.Module):def __init__(self):super(Flatten, self).__init__()def forward(self, x):shape = torch.prod(torch.tensor(x.shape[1:])).item()return x.view(-1, shape) trained_model = resnet18(pretrained=True) model = nn.Sequential(*list(trained_model.children())[:-1],# [b, 512, 1, 1]Flatten(), # [b, 512, 1, 1] => [b, 512]nn.Linear(512, 5) # [b, 512] => [b, 5])

    PyTorch中有已經(jīng)訓(xùn)練好的各種規(guī)格的resnet,第一次使用需要下載。我們不要resnet18的最后一層,所以要用list(trained_model.children())[:-1]把除了最后一層以外的所有層都取出來,保存在list中,然后用*將其list展開,之后接一個(gè)我們自定義的Flatten層,作用是將output打平,打平以后才能送到Linear層去

    上面幾行代碼就實(shí)現(xiàn)了Transfer Learning,而且不需要我們自己實(shí)現(xiàn)resnet,完整代碼如下

    import torch import os, glob import warnings import random, csv from PIL import Image from torch import optim, nn import torch.nn.functional as F from torchvision import transforms from torchvision.models import resnet18 from torch.utils.data import Dataset, DataLoader warnings.filterwarnings('ignore') from matplotlib import pyplot as pltclass Pokemon(Dataset):def __init__(self, root, resize, model):super(Pokemon, self).__init__()self.root = rootself.resize = resizeself.name2label = {} # 將文件夾的名字映射為label(數(shù)字)for name in sorted(os.listdir(os.path.join(root))):if not os.path.isdir(os.path.join(root, name)):continueself.name2label[name] = len(self.name2label.keys())# image, labelself.images, self.labels = self.load_csv('images.csv')if model == 'train': # 60%self.images = self.images[:int(0.6*len(self.images))]self.labels = self.labels[:int(0.6*len(self.labels))]elif model == 'val': # 20%self.images = self.images[int(0.6*len(self.images)):int(0.8*len(self.images))]self.labels = self.labels[int(0.6*len(self.labels)):int(0.8*len(self.labels))]else: # 20%self.images = self.images[int(0.8*len(self.images)):]self.labels = self.labels[int(0.8*len(self.labels)):]def load_csv(self, filename):if not os.path.exists(os.path.join(self.root, filename)):images = []for name in self.name2label.keys():images += glob.glob(os.path.join(self.root, name, '*.png'))images += glob.glob(os.path.join(self.root, name, '*.jpg'))images += glob.glob(os.path.join(self.root, name, '*.jpeg'))random.shuffle(images)with open(os.path.join(self.root, filename), mode='w', newline='') as f:writer = csv.writer(f)for img in images: # pokemon\\bulbasaur\\00000000.pngname = img.split(os.sep)[-2] # bulbasaurlabel = self.name2label[name]# pokemon\\bulbasaur\\00000000.png 0writer.writerow([img, label])print('writen into csv file:', filename)# read csv fileimages, labels = [], []with open(os.path.join(self.root, filename)) as f:reader = csv.reader(f)for row in reader:image, label = rowlabel = int(label)images.append(image)labels.append(label)assert len(images) == len(labels)return images, labelsdef __len__(self):return len(self.images)def __getitem__(self, idx):# idx [0~len(images)]# self.images, self.labels# pokemon\\bulbasaur\\00000000.png 0img, label = self.images[idx], self.labels[idx]tf = transforms.Compose([lambda x:Image.open(x).convert('RGB'), # string path => image datatransforms.Resize((int(self.resize*1.25), int(self.resize*1.25))),transforms.RandomRotation(15),transforms.CenterCrop(self.resize),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])img = tf(img)label = torch.tensor(label)return img, labelclass Flatten(nn.Module):def __init__(self):super(Flatten, self).__init__()def forward(self, x):shape = torch.prod(torch.tensor(x.shape[1:])).item()return x.view(-1, shape) batchsz = 32 lr = 1e-3 epochs = 10 device = torch.device('cuda') torch.manual_seed(1234)train_db = Pokemon('pokemon', 224, model='train') val_db = Pokemon('pokemon', 224, model='val') test_db = Pokemon('pokemon', 224, model='test') train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True, num_workers=2) val_loader = DataLoader(val_db, batch_size=batchsz, num_workers=2) test_loader = DataLoader(test_db, batch_size=batchsz, num_workers=2)def evalute(model, loader):correct = 0total = len(loader.dataset)for x,y in loader:with torch.no_grad():logits = model(x)pred = logits.argmax(dim=1)correct += torch.eq(pred, y).sum().float().item()return correct / totaldef main():trained_model = resnet18(pretrained=True)model = nn.Sequential(*list(trained_model.children())[:-1],# [b, 512, 1, 1]Flatten(), # [b, 512, 1, 1] => [b, 512]nn.Linear(512, 5))optimizer = optim.Adam(model.parameters(), lr=lr)criteon = nn.CrossEntropyLoss()best_acc, best_epoch = 0, 0for epoch in range(epochs):for step, (x, y) in enumerate(train_loader):# x:[b, 3, 224, 224], y:[b]logits = model(x)loss = criteon(logits, y)optimizer.zero_grad()loss.backward()optimizer.step()if epoch % 2 == 0:val_acc = evalute(model, val_loader)if val_acc > best_acc:best_epoch = epochbest_acc = val_acctorch.save(model.state_dict(), 'best.mdl')print('best acc:', best_acc, 'best_epoch', best_epoch)model.load_state_dict(torch.load('best.mdl'))print('loaded from ckt!')test_acc = evalute(model, test_loader)print('test_acc:', test_acc)if __name__ == '__main__':main()

    最終test accuracy在0.94左右,比我們自己從0開始訓(xùn)練效果好了很多

    往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)備注:加入本站微信群或者qq群,請回復(fù)“加群”獲取一折本站知識星球優(yōu)惠券,請回復(fù)“知識星球”喜歡文章,點(diǎn)個(gè)在看

    總結(jié)

    以上是生活随笔為你收集整理的AI入门:Transfer Learning(迁移学习)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    九九在线国产视频 | 久草在线视频在线观看 | 久久久在线视频 | www.日韩免费| 国产精品成人久久久久 | 亚洲视频,欧洲视频 | 亚洲精品国产免费 | 丁香久久| 国产在线精品福利 | 在线精品亚洲一区二区 | 一区二区三区四区五区在线 | 欧美激情精品久久久 | 青草视频网| 国语自产偷拍精品视频偷 | 婷婷 综合 色 | 在线免费三级 | 一区二区三区免费在线观看视频 | 91视频在线观看大全 | 色91av | 午夜av在线| 五月婷婷色 | 色香天天 | 国产精品久久久久久麻豆一区 | 九九综合久久 | 成人午夜电影久久影院 | www日韩欧美| 日韩高清免费在线 | 欧美专区日韩专区 | 日韩欧美在线中文字幕 | 亚洲视频 在线观看 | 午夜精品久久久久久久99婷婷 | 国产日韩中文字幕 | 四虎最新域名 | 黄色av电影免费观看 | 国产成人亚洲精品自产在线 | 黄污视频网站大全 | 中文字幕免费中文 | 久久综合免费视频影院 | 亚洲视频播放 | 91x色| 在线播放国产一区二区三区 | 国产精品综合在线 | 久草视频在 | 日本99精品| 日韩伦理一区二区三区av在线 | 日韩欧美在线影院 | 日日夜夜精品免费观看 | 一区二区三区精品久久久 | 精品一区二区三区四区在线 | 久草在线免费资源站 | 激情伊人五月天 | 免费高清在线一区 | 一区二区三区精品在线视频 | 日本精品视频免费观看 | 日韩免费电影一区二区三区 | 黄av在线| 精品国产99国产精品 | 在线免费观看av网站 | 免费 在线 中文 日本 | 免费日韩视 | 国产小视频在线免费观看 | 日韩中文字幕国产精品 | 国产另类av | 天天久久夜夜 | 三级黄色片在线观看 | 五月天综合网 | 中文字幕免费观看全部电影 | 99热亚洲精品 | 日本大片免费观看在线 | 天堂网一区 | 在线观看黄色av | 国产精品 亚洲精品 | 中文字幕在线视频一区 | 99人久久精品视频最新地址 | 在线视频你懂得 | 美女网站久久 | 成人欧美在线 | 一区二区三区免费看 | 美女精品| 中文字幕精品一区 | 国产亚洲片| 国产日韩三级 | 精壮的侍卫呻吟h | 色狠狠婷婷 | 永久免费毛片在线观看 | 成人国产精品久久久久久亚洲 | 日韩www在线 | 91视频链接 | 天天在线免费视频 | 免费看一级特黄a大片 | 亚洲电影在线看 | 精品一区在线看 | 国内精品久久久久久久影视简单 | 五月婷丁香 | 日韩免费一区二区在线观看 | 亚洲精品麻豆视频 | 深爱激情五月综合 | 天天操狠狠操网站 | 成人蜜桃 | 亚洲国产高清在线观看视频 | 亚洲精品国产精品久久99 | 91丨九色丨蝌蚪丨对白 | 久久在线 | 国产精品成人一区二区三区吃奶 | 日本精品免费看 | www.com久久久 | 99久久婷婷国产一区二区三区 | 欧美日韩视频在线观看一区二区 | 日本在线观看一区 | 91av网址| 国产麻豆精品久久 | 国产女人免费看a级丨片 | 中文字幕有码在线观看 | 国产精品成久久久久三级 | 欧美一区二区三区不卡 | 美女视频网站久久 | 欧美一级日韩免费不卡 | 六月丁香六月婷婷 | 天天干天天草天天爽 | 草久在线观看 | 久久久资源 | 成人av在线影视 | 久草免费在线视频观看 | 视频一区二区精品 | 69亚洲精品 | 激情综合五月婷婷 | 国产日本在线观看 | 黄网av在线 | 久久精品中文视频 | 91精品视频免费在线观看 | 91久久丝袜国产露脸动漫 | 日韩精品久久一区二区 | 国产精品国产三级国产aⅴ9色 | 国产亚洲永久域名 | 天天操夜夜操天天射 | 久久久精品国产一区二区三区 | 亚洲成人黄色在线 | 免费看三级网站 | 99爱这里只有精品 | 久久精品视频99 | 国产视频综合在线 | 久草视频在线播放 | 国产一在线精品一区在线观看 | 欧美日韩xx | 久久久久久欧美二区电影网 | 日韩欧美69 | www成人精品 | 五月婷网站| 手机看片国产 | 日韩中文字幕免费视频 | 国产成人福利在线 | 97在线免费观看视频 | 国产精品不卡 | 一级a性色生活片久久毛片波多野 | 国产精品久久久久影视 | 免费av 在线 | 成人av免费 | 国产久草在线 | 国产一级视频在线观看 | 免费黄在线看 | 欧美性免费 | 黄网站色成年免费观看 | 国产精品久久久久久999 | av中文字幕网站 | 免费在线观看毛片网站 | 免费久久久久久 | 人人狠| 亚洲爱视频 | 欧美久久精品 | 日韩av在线免费看 | 在线观看一区 | 久9在线 | 久久久久久久久国产 | avwww在线| 亚洲精品国产精品99久久 | 久久男人免费视频 | 91高清在线看 | 久久久久99999 | 国产日韩在线播放 | 国产中文字幕精品 | 亚洲国产资源 | 免费在线播放 | 日韩精品无 | 国产免费国产 | 超碰在线94 | 国产流白浆高潮在线观看 | 久久99久久99精品中文字幕 | 国产成人精品999在线观看 | 久久久久久高潮国产精品视 | 欧美综合干 | 国产精品久久久久高潮 | 一区二区三区高清在线观看 | 人人爽人人做 | 免费手机黄色网址 | 国产中文字幕视频在线 | 在线免费观看一区二区三区 | 亚洲最新av在线网站 | 久草精品视频在线播放 | 在线观看亚洲国产精品 | www.香蕉视频 | 久久精品3 | 99精品久久精品一区二区 | 蜜臀久久99精品久久久无需会员 | 精品福利国产 | 天天综合中文 | 欧美视频不卡 | 国产精品网站一区二区三区 | 尤物一区二区三区 | 国产福利不卡视频 | 中文字幕精品视频 | 欧美在线观看视频一区二区 | 久久久一本精品99久久精品 | 2000xxx影视| 欧美日产一区 | 99色婷婷 | 999成人 | 欧美在线视频精品 | 日韩激情在线 | 国产黄色片网站 | 久久欧美视频 | 1000部国产精品成人观看 | 日韩美女黄色片 | 日韩精品久久久久久久电影99爱 | 国产不卡视频在线 | 色午夜影院 | 婷婷丁香自拍 | 9999在线观看 | 亚洲免费在线播放视频 | 国产高清免费在线播放 | 在线观看欧美成人 | 欧美精品久久久久久久久免 | 天堂av影院 | 国产精品高潮呻吟久久久久 | 97人人超碰在线 | 欧美精品久久久久久久久久久 | 日韩av片免费在线观看 | 久久一视频 | 免费看国产视频 | 伊人导航 | 亚洲成av人片在线观看 | 亚洲成人黄| 亚洲精品在| 亚洲精品mv在线观看 | 蜜臀av麻豆 | 久久国产精品视频 | bbb搡bbb爽爽爽 | 久久久综合电影 | 日韩av在线小说 | 99久久超碰中文字幕伊人 | 黄色毛片在线 | 亚洲国产成人在线播放 | 伊人天天操 | 国产精品久久久久久久免费观看 | 久久精品视频国产 | 一区二区三区不卡在线 | 在线播放国产一区二区三区 | 国产精品第72页 | 九九热在线视频 | 亚洲做受高潮欧美裸体 | 精品96久久久久久中文字幕无 | 国产高清av | 国产视频99 | 国产在线观看你懂得 | 亚洲精品av在线 | 91免费网址 | 人人擦| 天天玩天天干天天操 | 亚洲第一久久久 | 久久综合久久综合这里只有精品 | 欧美日韩一区二区在线 | 国产高清在线视频 | 伊人永久 | 亚洲乱亚洲乱亚洲 | 免费男女网站 | 欧美一区二区日韩一区二区 | 亚洲第一区在线观看 | 超碰在线免费97 | 欧美性色黄大片在线观看 | 欧美一区三区四区 | 激情视频免费在线 | 国产精品久久久一区二区 | 最新国产在线视频 | 成人av一区二区兰花在线播放 | 婷婷成人综合 | 91热这里只有精品 | 国产精品男女啪啪 | av最新资源 | 日本夜夜草视频网站 | 麻豆视频在线播放 | 久草精品资源 | 日韩精品免费在线观看 | 久久久免费国产 | 毛片永久新网址首页 | 欧美日韩精品免费观看视频 | 亚洲 中文字幕av | 久久久久国产a免费观看rela | 一区二区精品国产 | 伊人开心激情 | 天天干人人插 | 最近中文字幕视频完整版 | 免费看一级黄色 | 亚洲国产免费看 | 五月婷婷在线视频观看 | 69av视频在线观看 | 久久精品视频99 | av日韩国产 | 中文字幕av在线免费 | 男女拍拍免费视频 | 97超碰色偷偷 | av黄色av | 日本护士三级少妇三级999 | 亚洲第一区在线播放 | 免费看污在线观看 | 欧美日韩三级在线观看 | 国产999精品久久久久久麻豆 | av一级一片| 亚洲爱爱视频 | av播放在线 | 国产成人一区在线 | 色婷婷免费 | 成人av高清 | 欧美性春潮 | 久久久久久久99精品免费观看 | 国产小视频在线观看免费 | 亚洲婷婷在线视频 | 亚洲国产精品久久久久婷婷884 | 日韩成人中文字幕 | 欧美一区日韩精品 | 日批视频在线观看免费 | 免费av观看网站 | 亚洲成人中文在线 | 成年人在线免费看视频 | 久久久久久97三级 | 中文字幕av有码 | 精品91视频 | 国产精品免费看久久久8精臀av | 久久av中文字幕片 | 九九久久国产精品 | 特级毛片aaa | 五月开心网 | 看av免费网站 | 日韩a级黄色片 | 天天精品视频 | 久久久久福利视频 | 欧美视频18 | 国产 欧美 日产久久 | 成人午夜在线观看 | 手机av电影在线 | www.香蕉视频在线观看 | 在线免费观看av网站 | 四虎影视精品永久在线观看 | 99国内精品 | 狠狠操导航 | www久久| 国产中文字幕av | 日韩欧美视频在线 | 九九热在线免费观看 | 在线看日韩 | 精品在线免费观看 | 亚洲一级理论片 | 免费日韩在线 | 天天干,天天射,天天操,天天摸 | 美女免费视频观看网站 | 久av在线| 337p日本大胆噜噜噜噜 | 久久精品国产一区二区电影 | 日韩精品一区在线播放 | 日本精品久久久久中文字幕 | 国产精品久久久区三区天天噜 | 99久久精品免费视频 | 日本在线视频网址 | 国产精品久久久久久久久久久久冷 | 成年人免费在线播放 | 日韩专区中文字幕 | 黄色日批网站 | 成人久久久久久久久久 | 中文字幕 国产专区 | 婷婷六月久久 | 国产一级片播放 | 99re亚洲国产精品 | 久草在线观看视频免费 | 99视频在线免费 | 91av网址 | 911免费视频 | 亚洲影院国产 | 日本韩国在线不卡 | 欧美做受高潮1 | 96av视频| 97精品超碰一区二区三区 | 美女禁18| 天天干天天色2020 | 久久在线精品视频 | 亚洲精品国产精品久久99 | 在线视频一二三 | 三级av在线播放 | 欧洲一区二区三区精品 | 一本色道久久综合亚洲二区三区 | 在线播放视频一区 | 精品91在线 | 亚洲综合射 | 激情综合网五月激情 | 日韩免费看| 免费在线观看成年人视频 | 一区二区三区日韩在线观看 | 久久一区二区免费视频 | 99久久精品国产系列 | 精品自拍网 | 欧美整片sss | 欧美有色 | 亚州免费视频 | 天天爱天天射 | 热久久99这里有精品 | 四虎国产永久在线精品 | 丁香激情五月婷婷 | 人人干人人草 | 久久一区国产 | 99视频国产精品免费观看 | 久草热视频 | 91av蜜桃 | 91超碰在线播放 | av在线影片 | 国产精品第2页 | 国产一区二区久久 | 欧美二区视频 | 青青色影院| 天天操天天干天天爱 | 福利视频一二区 | 亚洲成av人片在线观看 | 五月丁婷婷| 97国产大学生情侣酒店的特点 | 婷婷综合影院 | 久草在线免费看视频 | 天天综合成人网 | 成人毛片一区 | 四虎国产精品成人免费4hu | av成人动漫在线观看 | 在线观看免费国产小视频 | 日本精品午夜 | 国产女教师精品久久av | 国产1区2区 | 麻豆91精品 | 黄色三级网站在线观看 | 少妇高潮流白浆在线观看 | 久久99视频 | 在线国产91 | 成人小视频在线播放 | 在线观看视频免费播放 | 日韩一二区在线观看 | 丁香伊人网 | 99精品视频精品精品视频 | 成人午夜精品福利免费 | 黄色一级在线视频 | 日日干 天天干 | 欧美精品成人在线 | 手机成人av在线 | 手机av网站 | 久久高清视频免费 | 人人爱人人做人人爽 | av中文在线观看 | 狠狠色丁香婷婷综合基地 | 国产麻豆果冻传媒在线观看 | 国产精品男女 | 操操综合网 | 日韩精品中文字幕久久臀 | 美女精品久久久 | 国产精品 日韩 欧美 | 免费日韩 精品中文字幕视频在线 | 欧美精品三级在线观看 | 久草视频免费在线观看 | 人人草人 | 激情文学丁香 | av女优中文字幕在线观看 | 国产在线无 | 日韩三级免费 | 久久综合中文色婷婷 | 婷婷久久精品 | 在线免费观看av网站 | 国产精品久久久区三区天天噜 | 国产黄色视 | 在线免费观看黄色小说 | 久久久久国产一区二区三区 | 一区二区三区在线视频观看58 | av3级在线 | 97免费在线观看视频 | 99久久久久久久 | 中文字幕日韩高清 | 国产精品中文字幕在线播放 | 中文字幕av在线不卡 | 精品国产一区二区三区不卡 | 韩国av三级 | 在线免费观看欧美日韩 | 国产精品久久久久av免费 | 婷婷丁香激情网 | 亚洲一级久久 | 亚洲视频1 | 日韩天堂网 | 中文字幕综合在线 | 国产精品自产拍在线观看桃花 | 国产高清免费视频 | 午夜视频播放 | 国产福利av | 日本不卡123 | 国产免费二区 | 国产99久久精品一区二区300 | 黄色av高清 | www.综合网.com| 性色av一区二区 | 久9在线 | 天天激情天天干 | 亚在线播放中文视频 | 91精品91| 亚洲精品乱码久久久一二三 | 中文字幕传媒 | 亚洲午夜精品久久久久久久久久久久 | 国产黄a三级三级 | 国产精品欧美久久久久三级 | 91av大全 | 免费看片黄色 | 日本xxxx.com| 狠狠干我 | 久久特级毛片 | 国产免费视频在线 | 精品二区久久 | 另类五月激情 | 九九久久精品 | 亚洲精品 在线视频 | 日韩经典一区二区三区 | 欧美成人在线网站 | 欧美在线视频不卡 | 久久在线免费视频 | 69热国产视频 | 午夜精品视频福利 | 在线看片a | 色香com.| 久久成人精品电影 | 亚洲欧洲国产日韩精品 | 一区二区三区免费网站 | 91久色蝌蚪| 黄色网www | 99热在线国产 | 成人久久18免费网站麻豆 | 欧美一级专区免费大片 | 91亚洲精品在线观看 | 在线观看国产福利片 | 日韩精品免费一线在线观看 | 免费看成人av | 91麻豆精品国产91久久久久久 | 成人免费网站视频 | 日本黄色大片免费看 | 国产亚洲日本 | 天天草网站 | 国产999| 成年人黄色免费看 | 日韩久久激情 | 久久在线精品 | 日韩高清一二三区 | www.com久久 | 欧美激情另类文学 | 97激情影院| 国产精品久久久久999 | 国产一区免费视频 | 99国产情侣在线播放 | 欧美日韩aa | 四虎在线观看 | 免费观看v片在线观看 | 精品在线播放 | 狠狠色狠狠综合久久 | 免费看片日韩 | 国产精品久久影院 | 91视频这里只有精品 | 国产亚洲精品久久久久久久久久 | 国产一级免费观看视频 | 午夜精品久久久久久久久久久久 | 亚洲码国产日韩欧美高潮在线播放 | 欧美极度另类性三渗透 | 在线看污网站 | 婷婷激情五月 | 中文字幕av最新更新 | 国产二区av | 精品在线播放视频 | 久久久久免费精品国产小说色大师 | 手机在线欧美 | 亚洲精品一区二区精华 | 97超在线视频 | 亚洲精品啊啊啊 | 国产亚洲va综合人人澡精品 | 丁香花在线观看视频在线 | japanese黑人亚洲人4k | 国产偷在线 | 日本动漫做毛片一区二区 | 久久这里只精品 | 色视频在线观看 | 免费日韩一区二区三区 | 国内综合精品午夜久久资源 | 亚洲欧美日韩国产精品一区午夜 | 特级西西444www大胆高清无视频 | 国产免费叼嘿网站免费 | 国产精品美乳一区二区免费 | 9999亚洲| 国产精品女人久久久 | 人人爱在线视频 | 欧美成人在线免费 | 成人黄色在线电影 | 日韩婷婷 | 日韩在线视频国产 | 精品99在线| www.狠狠操.com | 国产日韩欧美在线影视 | 91丨九色丨丝袜 | 麻豆影视在线观看 | 在线观看日韩国产 | 国产精品久久久久久久久久久久午夜片 | 久久久91精品国产 | 久久人人爽爽人人爽人人片av | 欧美激情xxxx性bbbb | 国产一二三区在线观看 | 成人黄色小说网 | 色中色资源站 | 伊人色**天天综合婷婷 | 在线激情小视频 | 亚洲国产中文字幕在线 | 久久中文欧美 | 视频在线日韩 | 欧美激情片在线观看 | 最新动作电影 | 99久久999久久久精玫瑰 | 免费韩国av | 久久精品免费 | 五月婷婷久久丁香 | 亚洲a免费| 国产91对白在线 | 久久99精品国产一区二区三区 | 久久免费的视频 | 在线导航av| 久久久999精品视频 国产美女免费观看 | 免费看短 | 97人人人| 国产成人三级在线播放 | 色播99| 国产精品系列在线观看 | 不卡的一区二区三区 | ,午夜性刺激免费看视频 | 久久免费视频1 | 国内精品久久久久久中文字幕 | 成 人 黄 色 片 在线播放 | 五月天天色 | 麻豆视频在线观看 | 在线播放 日韩专区 | 激情五月婷婷综合 | 中文字幕乱码日本亚洲一区二区 | 99电影456麻豆 | 精品国模一区二区三区 | 亚洲精品美女久久久久网站 | 国产一级性生活视频 | 在线观看视频你懂得 | 国产色道 | 亚洲欧洲国产日韩精品 | 中文字幕专区高清在线观看 | 亚洲精品乱码久久久久久按摩 | 18av在线视频 | 黄色免费大片 | 亚洲在线激情 | 国产精品视频久久 | 欧美日韩久 | 国产91在线免费视频 | 波多野结衣电影一区二区 | 久久精品免费看 | 天天干夜夜操视频 | 久射网| 免费影视大全推荐 | 韩国精品福利一区二区三区 | 久久99热这里只有精品国产 | 欧美在线视频一区二区三区 | 成人精品99 | 91中文视频 | 久草免费福利在线观看 | 国产超碰97 | 久久精品视频网址 | 狠狠色丁香婷婷 | 日韩一区二区三区免费电影 | 久久好看| 日韩黄色大片在线观看 | 色婷婷综合视频在线观看 | 国产在线精品一区二区三区 | 国产成人精品一区一区一区 | 国产精品久久久久久久电影 | 播五月综合 | 日韩色在线 | 日韩av男人的天堂 | 国产只有精品 | 香蕉在线视频观看 | 五月天九九 | 啪啪激情网 | 欧美日韩中文国产一区发布 | 欧美成人一二区 | 欧美国产日韩在线观看 | 91黄色在线视频 | 国产一区二区免费看 | 激情av综合| 精品视频一区在线 | 精品久久影院 | 久久在线看 | 在线观看不卡视频 | 国产色女人 | 国产视频在线播放 | 麻豆成人小视频 | 在线中文字母电影观看 | 天天操天天操天天操 | 97色免费视频| 91精品国产网站 | 99国产精品久久久久久久久久 | 日韩欧美专区 | 超碰久热| 最近能播放的中文字幕 | 国产一级免费观看视频 | 久久久久久久av麻豆果冻 | 日韩精品短视频 | 亚洲视频在线免费看 | 日日操日日操 | 九九免费在线观看 | 亚洲国产精品成人av | 99亚洲精品视频 | 天天爱天天操天天干 | 国产福利精品视频 | 日韩电影在线观看一区二区三区 | 中文字幕在线观看完整版 | 免费看成人a | 久久久激情视频 | 五月婷婷丁香综合 | 一区二区视频欧美 | 国产精品99久久久久人中文网介绍 | 欧美激情视频在线观看免费 | 最近最新mv字幕免费观看 | 免费观看黄色av | 国产精品久久久久久久久久免费看 | 91视频在线看 | 久草视频资源 | 国产精品久久久一区二区三区网站 | 免费看国产曰批40分钟 | 久久久久国产一区二区三区 | 韩日av一区二区 | 午夜三级理论 | 992tv成人免费看片 | 午夜美女福利直播 | 欧美日韩精品电影 | 久久久久久电影 | www.色com| 国产成人一区三区 | 开心丁香婷婷深爱五月 | www久草 | 香蕉视频在线免费看 | 成年人在线免费看视频 | www.黄色片.com | 亚洲精品自拍视频在线观看 | 久久久国产一区二区三区 | www激情com| 深夜激情影院 | 中文字幕久久精品 | 缴情综合网五月天 | 免费a视频在线 | 天天草天天 | 日韩成人在线免费观看 | 日韩欧美国产成人 | 又黄又刺激| 天天综合久久综合 | 九色精品在线 | 国产一级片免费视频 | 久久精品网站视频 | 国产伦理一区二区 | 91干干干| 亚洲精品456在线播放第一页 | 伊人久久国产 | 婷婷国产在线观看 | 国产精品久久9 | 99热网站 | 日日操夜 | 日韩天堂在线观看 | 亚洲欧洲av在线 | 国产精品免费在线观看视频 | www黄色软件 | 久久精品国产亚洲aⅴ | 欧美激情综合五月色丁香小说 | 久久久精品国产一区二区电影四季 | 黄色aa久久 | 欧美精品一区在线发布 | 手机av在线网站 | 亚洲少妇久久 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 在线免费成人 | 亚洲视频 一区 | 不卡国产视频 | 国产精品毛片一区二区在线看 | 亚洲精品91天天久久人人 | 综合久久网 | 中文字幕在线不卡国产视频 | 天天爱天天舔 | 日本精品视频在线播放 | 99re久久精品国产 | 欧美激情第一区 | 欧洲精品码一区二区三区免费看 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲涩涩网 | 国产精品一区在线播放 | 在线观看黄色av | 99久久综合狠狠综合久久 | 免费在线国产黄色 | 欧美视屏一区二区 | 人人草天天草 | 五月婷在线播放 | 欧美精品乱码久久久久 | 中文在线a∨在线 | 国产精品久久久久久麻豆一区 | 国产剧情一区二区 | 麻豆你懂的 | 天天射天天干天天插 | 国产精品一区二区在线播放 | 最近日本中文字幕 | a天堂一码二码专区 | 国产精品资源在线观看 | 亚洲乱亚洲乱妇 | 天天色天天干天天色 | 亚洲精品h | 国产精品系列在线 | 蜜桃av综合网 | 日本精品午夜 | 在线观看一区二区视频 | 亚洲一级黄色片 | 久久9999久久免费精品国产 | 一级欧美一级日韩 | 久久久久国产精品午夜一区 | 香蕉久久久久久av成人 | 丁香5月婷婷 | 成人性生交大片免费观看网站 | 亚洲精品一区二区三区高潮 | 亚洲精品视频在线观看免费视频 | 成人网页在线免费观看 | 91豆花在线 | 9999国产| 91精品国产乱码 | 人人草网站 | 日韩一级电影在线观看 | 精品99久久 | 久久不射电影网 | 日韩免费三级 | 日韩有码中文字幕在线 | 97精品欧美91久久久久久 | av黄免费看 | 亚洲女人天堂成人av在线 | 亚洲最快最全在线视频 | 精品视频999 | 精品不卡视频 | 91在线精品观看 | 人成在线免费视频 | 91最新在线视频 | 在线免费观看的av | 日韩在线观看免费 | 在线va网站 | 久久99婷婷 | 国产小视频你懂的 | 97人人澡人人爽人人模亚洲 | 国产精品久久久久久吹潮天美传媒 | 国产在线看一区 | 天天干天天拍天天操 | 在线精品国产 | av免费观看高清 | 狠狠婷婷| 久久久综合 | 日本一区二区不卡高清 | 国产成人福利在线 | 美女网站在线观看 | 视频在线一区二区三区 | 三级在线视频观看 | 日日操天天爽 | 久久69av | 亚洲激情综合 | 国产日韩中文字幕在线 | 日韩中文字幕电影 | 西西人体4444www高清视频 | 色综合天天射 | 亚洲精品视频中文字幕 | 夜添久久精品亚洲国产精品 | 一级黄色免费网站 | 国产精品久久久久久久午夜片 | 麻豆传媒视频观看 | 久久久精品欧美一区二区免费 | 欧美一级看片 | 国产综合片 | 黄色网在线播放 | 免费在线一区二区 | 在线色资源 | 一级一片免费看 | 中国一级特黄毛片大片久久 | 国产少妇在线观看 | 在线观看av黄色 | 亚洲第一av在线 | 欧美精品在线观看免费 | 天堂va在线高清一区 | 伊人va| 永久免费精品视频 | 在线观看的a站 | 少妇bbw搡bbbb搡bbb | 日韩在线视频网 | 亚洲国产成人av网 | 免费h漫在线观看 | 中文字幕一区二区在线播放 | 久久久久久久久精 | 狠狠狠狠狠狠狠 | 免费高清在线一区 | av资源在线观看 | 在线免费观看成人 | av中文字幕在线免费观看 | 狠狠色噜噜狠狠狠狠2021天天 | 国产高清在线免费观看 | 国产高清视频在线免费观看 | 麻花豆传媒一二三产区 | 国产精品成人免费一区久久羞羞 | 精品人人爽 | 在线导航av| 91精品国产一区二区在线观看 | 最近中文字幕第一页 | 欧美美女激情18p | 欧美日韩一区久久 | 久草在线最新免费 | 久久99亚洲精品久久久久 | 91在线免费播放 | 十八岁以下禁止观看的1000个网站 | 成人一区二区在线观看 | 中文字幕在线观看不卡 | 在线观看免费高清视频大全追剧 | 日本三级人妇 | 国产精品美女久久久网av | 天天摸日日摸人人看 | 日韩激情久久 | 9i看片成人免费看片 | 97视频在线观看成人 | 亚洲影视九九影院在线观看 | 日韩高清网站 | av免费电影在线观看 | 香蕉视频久久久 | 亚洲精品久久久蜜桃 | 国产精品毛片一区二区三区 | 欧美色图亚洲图片 | 一级片视频免费观看 | 日韩大片在线免费观看 | 99精品免费视频 | 黄色美女免费网站 | 色先锋av资源中文字幕 | 韩日精品在线观看 | 天天干人人插 | 精品福利在线 | 亚洲欧洲精品一区二区 | 国产精品久久久久久久久久久杏吧 | 色香网 | 天天天干天天射天天天操 | av一区二区在线观看中文字幕 | 免费观看91视频大全 | 欧美a级片网站 | 久久久久激情视频 | 国产午夜视频在线观看 | 不卡的av在线| 亚洲综合婷婷 | 91成人久久 | 激情五月婷婷综合 | 91丨九色丨丝袜 | 在线99视频 | 99热在线免费观看 | 天天天干夜夜夜操 | 国产精品一区二区白浆 | 国产资源av | 天天超碰 | 欧美精品在线视频观看 | 99久久精品久久久久久动态片 | 91一区啪爱嗯打偷拍欧美 | 成人午夜在线观看 | 亚洲成人午夜在线 | 亚洲五月婷婷 | 91精品国产三级a在线观看 | 欧美贵妇性狂欢 | 在线视频18在线视频4k | 久久成人国产精品免费软件 | 密桃av在线 | 日本午夜免费福利视频 | 激情婷婷色 | 欧美经典久久 | 五月激情在线 | 日韩av偷拍 | 人人涩| 免费看黄的| 黄色软件在线观看视频 | 国产精品专区h在线观看 | 欧美性大胆 | 日日摸日日爽 | 国产精品一区二区在线播放 | 中文字幕有码在线观看 | 热久久国产精品 | 欧美一区二区精品在线 | 中文字幕美女免费在线 | 经典三级一区 |