久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

零基礎(chǔ)用PyTorch做食物圖片分類:從數(shù)據(jù)到模型全流程實戰(zhàn)

零基礎(chǔ)用PyTorch做食物圖片分類:從數(shù)據(jù)到模型全流程實戰(zhàn) 最開始接觸 PyTorch 時我第一個完整跑通的項目就是食物圖片分類。那時候我連tensor的形狀都經(jīng)常搞混nn.Module怎么繼承也是邊查邊寫但食物分類這個任務(wù)給了我很大的正反饋圖片直觀、類別接近生活、模型效果一眼就能看出來而且數(shù)據(jù)集、預(yù)訓(xùn)練模型、參考資料都相對好找。如果你也是零基礎(chǔ)想入門 PyTorch我的建議很直接——別去啃復(fù)雜的檢測或分割先從食物圖片分類這種“短平快”的分類任務(wù)切入把數(shù)據(jù)、模型、訓(xùn)練、評估這條鏈路完整走一遍比看一百篇教程都有用。這篇文章我會按我自己實際做項目的順序從數(shù)據(jù)準(zhǔn)備、模型搭建到訓(xùn)練調(diào)參、評估排查完整講一遍。代碼不是玩具都是能直接跑的級別同時會解釋每個關(guān)鍵選擇背后的原因以及我踩過的坑。適合剛看完 Python 語法、對深度學(xué)習(xí)有一點概念但還沒獨(dú)立做過項目的讀者。你會發(fā)現(xiàn)很多看似復(fù)雜的流程其實只需要幾十行代碼。1. 項目概述與整體思路1.1 為什么首推食物圖片分類作為入門項目圖像分類是計算機(jī)視覺最基礎(chǔ)的任務(wù)也是入門深度學(xué)習(xí)最自然的起點。食物圖片分類這個方向恰好把“任務(wù)難度”和“學(xué)習(xí)成本”放在了一個很舒服的位置你不需要去理解目標(biāo)框、分割掩碼這些復(fù)雜概念只需要讓模型判斷一張圖屬于哪一類食物。我選它的另一個人理由是結(jié)果可感知。你做貓狗分類模型錯了你甚至覺得正常但食物分類錯了你能立刻發(fā)現(xiàn)它把“宮保雞丁”認(rèn)成了“辣子雞丁”這種錯誤會讓你愿意去分析原因。而且食物類別的視覺差異往往很細(xì)微比如不同做法的炸雞、不同種類的面食這天然要求模型學(xué)習(xí)更細(xì)粒度的特征對理解features到底在學(xué)什么很有幫助。從工程角度看食物分類的數(shù)據(jù)獲取成本也低。公開數(shù)據(jù)集中既有幾十萬張的大規(guī)模食物數(shù)據(jù)集也有單類別幾千張的小型子集新手完全可以用幾個類的子集練手十幾分鐘就能下載完。配合 PyTorch 生態(tài)里的預(yù)訓(xùn)練模型幾十行代碼就能達(dá)到一個不錯的基線這種快速反饋對建立信心特別重要。1.2 零基礎(chǔ)需要準(zhǔn)備的工具與環(huán)境在開始寫代碼之前先把環(huán)境梳理清楚。你不需要一開始就配齊深度學(xué)習(xí)專用的 GPU 服務(wù)器一臺普通電腦也能跑只是訓(xùn)練慢一點。我個人的建議是有 NVIDIA 顯卡最好顯存 4GB 以上就夠訓(xùn)練 ResNet18 這種規(guī)模的模型沒有顯卡也不用慌先拿 CPU 跑一個小數(shù)據(jù)集把流程走通后面再上 GPU。依賴方面核心是 PyTorch 和 torchvision。建議用虛擬環(huán)境避免重裝環(huán)境時搞亂已有的包。安裝完以后順手驗證一下python -c import torch; print(torch.__version__, torch.cuda.is_available())如果輸出True說明 CUDA 可用如果輸出False也沒關(guān)系代碼里我會用device torch.device(cuda if torch.cuda.is_available() else cpu)自動切換。除此以外還需要matplotlib用于可視化numpy用于數(shù)值處理tqdm顯示進(jìn)度條這幾個用 pip 一下就好。新手容易忽略的一件事是數(shù)據(jù)格式。PyTorch 的torchvision提供了很多圖像處理工具但底層讀取圖片依賴 PIL 或 OpenCV。裝好pillow就行不需要額外裝 OpenCV除非你要做一些特殊預(yù)處理。1.3 整體流程與關(guān)鍵決策一個標(biāo)準(zhǔn)的圖像分類項目流程其實非常固定準(zhǔn)備數(shù)據(jù)下載或收集圖片按類別組織目錄結(jié)構(gòu)。預(yù)處理縮放、裁剪、歸一化讓模型輸入更規(guī)范。構(gòu)建數(shù)據(jù)加載器把海量圖片分成一個個 batch訓(xùn)練時逐批送入模型。定義模型選一個預(yù)訓(xùn)練模型把最后一層換成自己的分類層。定義損失函數(shù)和優(yōu)化器分類任務(wù)一般用交叉熵?fù)p失。訓(xùn)練循環(huán)前向傳播、計算損失、反向傳播、更新參數(shù)循環(huán)多個 epoch。評估在驗證集上算準(zhǔn)確率、混淆矩陣用可視化發(fā)現(xiàn)模型缺陷。推理加載保存好的模型對單張圖片做預(yù)測。這套流程幾乎所有 CV 任務(wù)都適用所以只要跑通一次后面遷移到其他項目會快很多。這里有個關(guān)鍵決策用自定義的小型 CNN還是用遷移學(xué)習(xí)加載預(yù)訓(xùn)練模型我的答案是如果你是想學(xué)習(xí)原理兩者都該懂但目標(biāo)是“零基礎(chǔ)跑通第一個項目”直接用預(yù)訓(xùn)練模型是最省力也最穩(wěn)妥的方案。原因很簡單深度學(xué)習(xí)模型不是越大越好也不是從零訓(xùn)練的模型效果一定好。對于個人項目、小規(guī)模數(shù)據(jù)集預(yù)訓(xùn)練模型提供了在大型數(shù)據(jù)集上已經(jīng)學(xué)好的通用特征我們只需要微調(diào)最后一層或者全部參數(shù)就能在很短的時間內(nèi)獲得不錯的效果。等跑通之后再回頭寫一個簡單的 CNN理解卷積、池化這些概念效果會好很多。2. 數(shù)據(jù)準(zhǔn)備與預(yù)處理決定模型上限的隱形功臣2.1 數(shù)據(jù)集獲取與目錄規(guī)劃做食物分類最常見的選擇是使用公開的食物數(shù)據(jù)集規(guī)模大的有幾十萬張圖覆蓋多種菜系。但零基礎(chǔ)階段我不建議一上來就搞大的類別多、圖片多訓(xùn)練時間長排查問題也麻煩。我當(dāng)時的做法是先抽取 10 個類每類幾百張圖一共幾千張用來驗證思路。跑通之后再逐步擴(kuò)大到完整類別。無論用什么數(shù)據(jù)集目錄規(guī)劃會直接影響后續(xù)代碼的簡潔程度。推薦按下面的結(jié)構(gòu)組織data/ ├── train/ │ ├── burger/ │ │ ├── 001.jpg │ │ └── ... │ ├── pizza/ │ └── ... └── val/ ├── burger/ │ ├── 101.jpg │ └── ... ├── pizza/ └── ...這樣用torchvision.datasets.ImageFolder可以直接讀取類名自動從文件夾名里解析順序按字母排序。千萬別把圖片和標(biāo)簽放在 Excel 里再手動讀那樣增加一層不必要的復(fù)雜度。下載完數(shù)據(jù)后我強(qiáng)烈建議先隨機(jī)抽查一下圖片內(nèi)容確認(rèn)數(shù)據(jù)和類名是否對得上。食物數(shù)據(jù)集的公共資源也可能存在少量標(biāo)注錯誤尤其在類間相似度高的時候。這一步只需要打印幾張圖看看成本很低但能避免后面訓(xùn)了半天發(fā)現(xiàn)標(biāo)簽是亂的。2.2 數(shù)據(jù)增強(qiáng)到底該做哪些先記住一個核心原則訓(xùn)練集要“折騰”驗證集要“規(guī)矩”。訓(xùn)練集的數(shù)據(jù)增強(qiáng)是用來模擬現(xiàn)實中千變?nèi)f化的拍攝條件的。我們拍照時食物可能正放、斜放、大小不一、光線不同如果模型只在干凈的圖片上訓(xùn)練到了真實場景就會很脆弱。常用的增強(qiáng)手段包括隨機(jī)縮放裁剪RandomResizedCrop相當(dāng)于讓模型看不同比例、不同位置的局部內(nèi)容。隨機(jī)水平翻轉(zhuǎn)RandomHorizontalFlip讓模型學(xué)會鏡像對稱的食物。隨機(jī)旋轉(zhuǎn)RandomRotation應(yīng)對拍攝角度變化。顏色擾動ColorJitter調(diào)整亮度、對比度、飽和度模擬不同光線環(huán)境。不可濫用。如果任務(wù)本身對方向敏感比如識別文字就不要做隨意翻轉(zhuǎn)旋轉(zhuǎn)。食物分類這類任務(wù)方向不會改變類別本質(zhì)做這些增強(qiáng)是安全的。驗證集不需要增強(qiáng)但需要統(tǒng)一尺寸和歸一化。因為驗證集是對模型真實水平的客觀評估增強(qiáng)帶來的隨機(jī)性會影響評估的穩(wěn)定性和可復(fù)現(xiàn)性。驗證集的預(yù)處理通常是Resize到較大的尺寸再做CenterCrop剪到模型輸入尺寸。這樣能保證圖片內(nèi)容不因裁剪丟失太多。歸一化是新手最容易忽略的一步。預(yù)訓(xùn)練模型在 ImageNet 上訓(xùn)練時輸入圖片的像素分布有特定均值和標(biāo)準(zhǔn)差。我們用預(yù)訓(xùn)練模型做遷移學(xué)習(xí)輸入也應(yīng)該盡量服從同樣分布否則預(yù)訓(xùn)練特征的優(yōu)勢就大打折扣。標(biāo)準(zhǔn)值就是那組均值[0.485, 0.456, 0.406]標(biāo)準(zhǔn)差[0.229, 0.224, 0.225]不用自己算記住就能用。from torchvision import transforms train_transforms transforms.Compose([ transforms.Resize(256), transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_transforms transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])這里的Resize(256)是為了保證長邊縮放到 256然后RandomResizedCrop(224)或CenterCrop(224)裁出模型輸入尺寸。PyTorch 預(yù)訓(xùn)練模型的默認(rèn)輸入是 224×224這個尺寸在計算成本和效果之間比較平衡。2.3 數(shù)據(jù)加載器的配置細(xì)節(jié)數(shù)據(jù)加載器決定了訓(xùn)練時如何把數(shù)據(jù)集一小批一小批地喂給模型。這里有幾個概念新手一定要理清batch_size是每批多少張圖epoch是整個訓(xùn)練集過完一遍iteration是處理一個batch的過程。一次訓(xùn)練通常由許多iteration組成所有iteration共同組成一個epoch。DataLoader的配置看似簡單但幾個參數(shù)能直接影響訓(xùn)練速度。from torch.utils.data import DataLoader train_dataset ImageFolder(rootdata/train, transformtrain_transforms) val_dataset ImageFolder(rootdata/val, transformval_transforms) train_loader DataLoader(train_dataset, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue) val_loader DataLoader(val_dataset, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue)shuffleTrue只在訓(xùn)練集使用。每次 epoch 前打亂數(shù)據(jù)順序避免模型學(xué)到數(shù)據(jù)排列中的偶然規(guī)律。比如文件夾里先全是第一類再全是第二類如果不打亂模型可能在連續(xù)的 batch 里只看到單一類別梯度更新方向會來回震蕩收斂變慢。驗證集不需要打亂因為評估結(jié)果和順序無關(guān)。num_workers是數(shù)據(jù)加載使用多少個并行進(jìn)程。設(shè)為 0 的話數(shù)據(jù)加載在主進(jìn)程中運(yùn)行簡單但慢設(shè)為 4 或 8 通常能顯著提高吞吐量。不過 Windows 下進(jìn)程并行需要把訓(xùn)練代碼包在if __name__ __main__:里否則可能報與多進(jìn)程相關(guān)的錯誤。我第一次跑的時候就卡在這里改了入口后才順利。pin_memoryTrue對 GPU 訓(xùn)練有幫助。它讓數(shù)據(jù)保存在鎖頁內(nèi)存中GPU 拷貝數(shù)據(jù)更快。CPU 上訓(xùn)練時設(shè)不設(shè)都行影響不大。3. 模型搭建不是所有代碼都要自己寫3.1 從一個迷你 CNN 到遷移學(xué)習(xí)我見過很多教程一上來就貼一個完整的 CNN然后說“這就是模型”。但對零基礎(chǔ)的人來說那一堆nn.Conv2d、nn.BatchNorm2d、nn.ReLU、nn.MaxPool2d名詞很容易勸退。我的建議是先動手跑再回頭拆細(xì)節(jié)。如果你堅持想先看一個最簡單的 CNN 長什么樣下面是迷你版import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, num_classes): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 16, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(16, 32, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), ) self.classifier nn.Linear(64 * 28 * 28, num_classes) def forward(self, x): x self.features(x) x x.view(x.size(0), -1) return self.classifier(x)這個網(wǎng)絡(luò)輸入 224×224 的彩色圖經(jīng)過三個池化層后空間尺寸變成 28×28通道數(shù)變成 64最后展平接全連接層。它能工作但在少量數(shù)據(jù)下效果一般而且訓(xùn)練收斂速度遠(yuǎn)不如預(yù)訓(xùn)練模型。所以我更推薦用 PyTorch 里現(xiàn)成的預(yù)訓(xùn)練模型這也是大多數(shù)實際項目的做法import torchvision.models as models model models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT)ResNet18屬于殘差網(wǎng)絡(luò)核心思想是在層與層之間增加“短路連接”讓梯度更容易從深層回傳到淺層。它是在 ImageNet 上預(yù)訓(xùn)練過的已經(jīng)學(xué)會了很多通用的視覺特征比如邊緣、紋理、形狀。我們要做的是在這個基礎(chǔ)上適應(yīng)新的分類任務(wù)。遷移學(xué)習(xí)的本質(zhì)就是把別人在超大數(shù)據(jù)集上花很長時間練出來的“通用視覺能力”拿過來然后在我們自己的小數(shù)據(jù)集上微調(diào)。這就好比你會開車換一輛車只需要適應(yīng)一下方向盤靈敏度而不是從學(xué)踩油門開始。3.2 替換分類頭與層結(jié)構(gòu)預(yù)訓(xùn)練模型原本的分類層是按 ImageNet 的 1000 個類別設(shè)計的最后是一個nn.Linear(512, 1000)ResNet18 是 512 維特征。我們的食物分類類別可能是 10 類、40 類所以必須把最后一層替換掉。num_classes 10 in_features model.fc.in_features model.fc nn.Linear(in_features, num_classes)model.fc在 ResNet 里是最后一個全連接層in_features是它輸入的維度。你不需要關(guān)心它前面經(jīng)過了什么樣的卷積層只需要知道特征維度是多少然后接一個大小匹配的分類頭就行。接下來還需要選擇訓(xùn)練策略。這里有兩個選項只微調(diào)最后一層把前面的卷積層參數(shù)全部凍結(jié)requires_gradFalse只在新的fc層上訓(xùn)練。優(yōu)點是訓(xùn)練很快占顯存少缺點是模型只調(diào)整了分類層前面通用的特征可能不完全適配食物這種細(xì)粒度任務(wù)。全部微調(diào)所有層的參數(shù)都參與更新模型能更充分地適應(yīng)新數(shù)據(jù)。數(shù)據(jù)量不太少時效果通常更好。缺點是訓(xùn)練時間更長容易過擬合新手需要配合數(shù)據(jù)增強(qiáng)和早停。我的實際經(jīng)驗是如果數(shù)據(jù)集只有幾千張圖類間差異不是特別大先試“只微調(diào)最后一層”把基線跑出來如果準(zhǔn)確率不滿意再解凍更多層做全量微調(diào)。對于零基礎(chǔ)入門我更推薦直接全量微調(diào)因為食物分類的細(xì)粒度特征確實需要底層特征的參與而且全量微調(diào)在 ResNet18 這種小模型上的訓(xùn)練開銷完全可以接受。3.3 損失函數(shù)和優(yōu)化器選擇分類任務(wù)的默認(rèn)選擇是nn.CrossEntropyLoss()。這個函數(shù)在 PyTorch 里做了兩件事先對模型輸出做 softmax再計算交叉熵?fù)p失。所以你的模型最后一層不要提前做 softmax直接輸出原始 logits 就行。計算損失時傳入模型的預(yù)測 logits 和真實標(biāo)簽即可。CrossEntropyLoss有幾個好處數(shù)值上比手動 softmax 加 NLL 更穩(wěn)定而且它對類別不平衡有一定容忍度。對于食物分類這種類別相對均衡的任務(wù)基礎(chǔ)版本就夠了。優(yōu)化器的選擇同樣有講究。我最初圖省事用了torch.optim.Adam(model.parameters(), lr0.001)因為 Adam 自適應(yīng)學(xué)習(xí)率不太需要精細(xì)調(diào)節(jié)。Adam 在實際項目中確實省心尤其對新手不容易把學(xué)習(xí)率設(shè)得太離譜導(dǎo)致訓(xùn)練發(fā)散。如果你想更接近論文風(fēng)格可以試試帶動量的 SGDoptimizer torch.optim.SGD(model.parameters(), lr0.01, momentum0.9)SGD 往往在充分調(diào)參后效果更好但學(xué)習(xí)率、動量的組合需要經(jīng)驗。作為入門先上 Adam 是對的。學(xué)習(xí)率調(diào)度方面我建議加一個簡單的StepLR或CosineAnnealingLR。訓(xùn)練初期較大的學(xué)習(xí)率讓模型快速下降后期逐漸降低學(xué)習(xí)率讓損失在最小值附近收斂得更穩(wěn)。代碼長這樣scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max15)這里的T_max一般設(shè)為總的 epoch 數(shù)學(xué)習(xí)率會從初始值按余弦曲線降到接近 0。還有一個容易忽略的點如果使用了凍結(jié)部分層的策略model.parameters()會包含所有參數(shù)包括凍結(jié)的。凍結(jié)層的requires_gradFalse之后傳給優(yōu)化器時即使包含它梯度也是None不會更新但為了干凈通常直接傳入所有參數(shù)也沒問題。更細(xì)致的人可以只傳需要更新的參數(shù)列表但對這個小項目來說沒有太大區(qū)別。4. 訓(xùn)練循環(huán)與調(diào)參實戰(zhàn)4.1 標(biāo)準(zhǔn)訓(xùn)練循環(huán)的寫法訓(xùn)練循環(huán)是 PyTorch 項目里最核心、最模式的代碼。一旦你理解了這段循環(huán)以后所有模型都能套用。先明確每個 epoch 需要做的事把訓(xùn)練集所有圖片分成多個 batch逐個 batch 讓模型預(yù)測計算損失反向傳播更新權(quán)重完成整個訓(xùn)練集后在驗證集上計算當(dāng)前模型的準(zhǔn)確率判斷是否比之前更好。from tqdm import tqdm import torch def train_one_epoch(model, train_loader, criterion, optimizer, device): model.train() running_loss 0.0 correct 0 total 0 for images, labels in tqdm(train_loader): images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() * images.size(0) preds outputs.argmax(dim1) correct (preds labels).sum().item() total labels.size(0) epoch_loss running_loss / total epoch_acc correct / total return epoch_loss, epoch_acc有幾個細(xì)節(jié)新手必須理解model.train()和model.eval()不是擺設(shè)。像 BatchNorm、Dropout 這些層在訓(xùn)練和推理時行為不一樣。訓(xùn)練時 BN 會根據(jù)當(dāng)前 batch 統(tǒng)計均值方差Dropout 會隨機(jī)丟棄神經(jīng)元推理時要用固定的統(tǒng)計量和不丟棄。忘記切換會在驗證階段得到很詭異的結(jié)果。optimizer.zero_grad()一定要在每個 batch 前調(diào)用。PyTorch 的梯度是累積的如果不手動清零上一個 batch 的梯度會疊加到當(dāng)前 batch 上導(dǎo)致更新方向混亂。outputs.argmax(dim1)是取每一行最大值對應(yīng)的索引也就是預(yù)測類別。preds labels返回布爾向量sum()得到該 batch 中預(yù)測正確的數(shù)量。loss.item()用于從 loss 張量中取出 Python 浮點數(shù)。注意必須在loss.backward()之前或者之后調(diào)用都可以但只用于記錄不能影響梯度計算。4.2 驗證與保存最優(yōu)模型驗證集的作用是模擬模型在沒見過數(shù)據(jù)上的表現(xiàn)。每個 epoch 后我們把模型切到eval()模式下跑一遍驗證集torch.no_grad() def validate(model, val_loader, criterion, device): model.eval() running_loss 0.0 correct 0 total 0 for images, labels in val_loader: images, labels images.to(device), labels.to(device) outputs model(images) loss criterion(outputs, labels) running_loss loss.item() * images.size(0) preds outputs.argmax(dim1) correct (preds labels).sum().item() total labels.size(0) return running_loss / total, correct / totaltorch.no_grad()是驗證的關(guān)鍵。它告訴 PyTorch 不需要記錄梯度因為驗證階段只做前向傳播不需要反向傳播。這樣能省顯存、加快速度也避免誤調(diào)用.backward()導(dǎo)致梯度累積。訓(xùn)練過程中我習(xí)慣保存“驗證集準(zhǔn)確率最高”的模型而不是最后一個 epoch 的模型。原因是最后一個 epoch 不一定是最好的有時候已經(jīng)過擬合了。best_acc 0.0 for epoch in range(num_epochs): train_loss, train_acc train_one_epoch(model, train_loader, criterion, optimizer, device) val_loss, val_acc validate(model, val_loader, criterion, device) scheduler.step() print(fEpoch {epoch1}/{num_epochs} | fTrain Loss: {train_loss:.4f} | Train Acc: {train_acc:.4f} | fVal Loss: {val_loss:.4f} | Val Acc: {val_acc:.4f}) if val_acc best_acc: best_acc val_acc torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), best_acc: best_acc, }, best_model.pth) print(fBest model saved, val_acc{best_acc:.4f})保存時用字典包起來是個好習(xí)慣。只保存model.state_dict()也夠用但帶上 epoch、優(yōu)化器狀態(tài)等信息以后想接著訓(xùn)練或者看信息就方便了。4.3 關(guān)鍵超參數(shù)和訓(xùn)練技巧超參數(shù)不靠背靠試和觀察。我第一次訓(xùn)練時就是踩了不少坑下面是一些比較實用的經(jīng)驗先用幾十張圖跑一個 batch 或幾個 step確保前向、反向、更新的代碼沒有 bug。我習(xí)慣在正式訓(xùn)練前取一個 batch 數(shù)據(jù)過一遍比如loss能正常下降再從完整數(shù)據(jù)開始。這樣能省掉大量反復(fù)試錯的等待時間。學(xué)習(xí)率用1e-3起步比較穩(wěn)。如果發(fā)現(xiàn) loss 震蕩劇烈就把學(xué)習(xí)率降為原來的十分之一再試。如果 loss 下降非常慢可能是學(xué)習(xí)率太小適當(dāng)調(diào)大。固定隨機(jī)種子能讓結(jié)果可復(fù)現(xiàn)。在數(shù)據(jù)加載和模型初始化前調(diào)用torch.manual_seed(42)如果用了 GPU 再調(diào)用torch.cuda.manual_seed_all(42)。雖然不能做到嚴(yán)格百分之百復(fù)現(xiàn)但能減少很多奇怪的不確定性。監(jiān)控驗證集準(zhǔn)確率而不是訓(xùn)練集準(zhǔn)確率。訓(xùn)練集準(zhǔn)確率 90% 但驗證集只有 60%說明過擬合了這時候不是繼續(xù)訓(xùn)練而是找辦法正則化。訓(xùn)練輪數(shù)不要貪多。使用預(yù)訓(xùn)練模型加數(shù)據(jù)增強(qiáng)10~20 個 epoch 通常就能看到收斂。小數(shù)據(jù)集下跑 50 個 epoch 往往是浪費(fèi)時間還會增加過擬合風(fēng)險。如果顯卡有amp自動混合精度可以嘗試開啟scaler torch.cuda.amp.GradScaler() with torch.autocast(device_typecuda): outputs model(images) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()混合精度訓(xùn)練能減少顯存占用同時訓(xùn)練速度提升不少。對新手來說不是必須但用起來也不難可以等流程跑通后再加。5. 模型評估與結(jié)果可視化5.1 準(zhǔn)確率不夠還要看混淆矩陣訓(xùn)練結(jié)束后我們通常先看一個總體準(zhǔn)確率。但準(zhǔn)確率只能告訴你“模型有多好”不能告訴你“模型在哪里不好”。比如模型把“炸雞”識別成“薯條”和把“壽司”識別成“刺身”這兩類錯誤的含義完全不同。混淆矩陣能非常直觀地展示類別之間的互相混淆。它的每一行代表真實類別每一列代表預(yù)測類別對角線上的數(shù)字越大越好非對角線上的點代表錯誤。from sklearn.metrics import confusion_matrix import numpy as np all_preds [] all_labels [] model.eval() with torch.no_grad(): for images, labels in val_loader: images, labels images.to(device), labels.to(device) outputs model(images) preds outputs.argmax(dim1).cpu().numpy() all_preds.extend(preds) all_labels.extend(labels.cpu().numpy()) cm confusion_matrix(all_labels, all_preds)畫熱力圖時可以按類別數(shù)量調(diào)整圖片大小類別多就用大一點畫布。如果看到某兩類互相混在一起比如“炸雞”和“炸魚”混淆嚴(yán)重說明它們在紋理或顏色上確實接近這時候可以考慮加強(qiáng)數(shù)據(jù)增強(qiáng)中的顏色擾動或者收集更多這類樣本。5.2 從錯誤樣本找出模型短板只看指標(biāo)永遠(yuǎn)不夠把預(yù)測錯誤的圖片真正打開看一眼你會迅速理解模型的困境。我寫了一個小的可視化邏輯遍歷驗證集找出preds ! labels的圖片把原圖、真實標(biāo)簽、預(yù)測標(biāo)簽、預(yù)測概率畫在一張圖上。這部分代碼量不大但對判斷問題特別有效。看了錯誤樣本后常見的發(fā)現(xiàn)有以下幾類數(shù)據(jù)標(biāo)注錯誤圖片里明明不是那個菜標(biāo)簽是錯的。這種問題只能靠人工修正。圖片過于相似比如不同菜系的“紅燒肉”外觀很像。這種情況模型表現(xiàn)不佳是可以理解的需要更細(xì)的類別定義或更多樣本。圖像質(zhì)量差過暗、過糊、被遮擋?,F(xiàn)實中拍照經(jīng)常這樣可以考慮在訓(xùn)練集加更強(qiáng)的數(shù)據(jù)增強(qiáng)甚至用模糊增強(qiáng)模擬噪點。錯誤樣本分析不是什么高深技術(shù)但它能幫你建立直覺模型到底是在學(xué)食物本身還是在學(xué)背景顏色、盤子形狀。這個直覺對以后做任何視覺任務(wù)都有幫助。5.3 用訓(xùn)練好的模型預(yù)測單張圖模型訓(xùn)練好了最終目的是給一張新圖片預(yù)測類別。加載模型的方式checkpoint torch.load(best_model.pth, map_locationdevice) model.load_state_dict(checkpoint[model_state_dict]) model.to(device) model.eval()單張圖片的預(yù)處理必須和驗證集保持一致尤其是Resize、CenterCrop、Normalize這三個步驟。很多人直接在讀圖后縮放到 224×224 就喂給模型結(jié)果發(fā)現(xiàn)準(zhǔn)確率驟降就是因為沒有做CenterCrop和Normalize。from PIL import Image def predict_image(image_path, model, class_names, device): image Image.open(image_path).convert(RGB) tensor val_transforms(image).unsqueeze(0).to(device) model.eval() with torch.no_grad(): outputs model(tensor) probs torch.softmax(outputs, dim1) top_prob, top_idx probs.max(dim1) return class_names[top_idx.item()], top_prob.item()softmax把 logits 轉(zhuǎn)成概率max(dim1)取最大值對應(yīng)的類別。說實話這里直接argmax也能得到類別但用softmax能額外看到概率值方便判斷模型是確信還是猶豫。如果概率低于 0.5說明模型信心不足這時候要么模型對該類沒見過足夠多樣本要么圖片與訓(xùn)練集分布差異太大。實用一點的做法是設(shè)置一個閾值低于閾值就返回“無法確定”這在真實業(yè)務(wù)場景里很有價值。6. 常見問題與排查技巧實錄6.1 訓(xùn)練 loss 一直不下降最讓人沮喪的情況就是訓(xùn)練了好幾輪loss一直在初始值附近波動幾乎沒有下降。這時候不要盲目調(diào)學(xué)習(xí)率按順序排查以下問題首先檢查數(shù)據(jù)是否真的被正確讀取了。打印一個 batch 的形狀和標(biāo)簽范圍。圖片是 3 通道大小和模型輸入匹配標(biāo)簽從 0 到 num_classes-1沒有越界。如果標(biāo)簽不是從 0 開始的連續(xù)整數(shù)CrossEntropyLoss會對不上。其次檢查歸一化是否忘寫了。如果圖片沒做Normalize像素值在 0~255 之間預(yù)訓(xùn)練模型的輸入分布被破壞可能讓 loss 不收斂。然后檢查學(xué)習(xí)率是否過大或過小。過大時 loss 會跳來跳去甚至變成 NaN過小時 loss 緩慢但一直不降。以 Adam 為例1e-3是個不錯的起點如果不降可以試1e-4或3e-4。最后建議做一次“小樣本過擬合測試”只取 20 張訓(xùn)練圖片不放增強(qiáng)強(qiáng)制讓它擬合。如果小樣本上 loss 能降到接近 0說明模型和訓(xùn)練流程沒問題問題出在數(shù)據(jù)量或數(shù)據(jù)分布上如果小樣本也降不下去問題大概率在輸入處理或代碼邏輯。6.2 GPU 顯存不夠很多人的顯卡顯存只有 4GB 或 6GB訓(xùn)練一個 ResNet18 雖然夠用但如果 batch_size 設(shè)置得太大會立刻報CUDA out of memory。解決策略按優(yōu)先級排序降低batch_size。從 32 降到 16 或 8顯存占用成比例下降。代價是每個 epoch 的迭代次數(shù)變多訓(xùn)練時間變長一點。降低輸入尺寸。ResNet18 雖然默認(rèn)是 224但用 192 或 160 也能運(yùn)行。不過輸入越小信息損失越大準(zhǔn)確率可能輕微下降不推薦新手一開始就改。驗證和預(yù)測時用torch.no_grad()。如果忘了加驗證集也會建計算圖顯存占用會明顯上升。開啟混合精度AMP。在 4.3 小節(jié)提到的autocast和GradScaler能減少約一半顯存占用而且速度通常更快。如果嘗試以上方法后仍然不夠還有一個辦法是換更小的模型。ResNet18已經(jīng)算小的了可以考慮ResNet18之外更輕量的MobileNetV3或EfficientNet-B0。這些模型專門為移動端設(shè)計參數(shù)量更少訓(xùn)練更快適合資源有限時使用。6.3 訓(xùn)練準(zhǔn)確率很高但驗證集很低這是典型的過擬合信號。訓(xùn)練準(zhǔn)確率 95% 以上但驗證集只有 70%說明模型沒有學(xué)到泛化的規(guī)律而是記住了訓(xùn)練集中的細(xì)節(jié)或者噪聲。過擬合的應(yīng)對手段有很多我按實用程度排序增加數(shù)據(jù)增強(qiáng)。訓(xùn)練集已有的增強(qiáng)如果不夠“狠”可以加RandomRotation的角度、ColorJitter的幅度甚至加RandomAffine。要讓模型在更多變體中學(xué)習(xí)不變特征。使用正則化。在CrossEntropyLoss中沒有自帶正則你可以給優(yōu)化器加weight_decay。Adam 的weight_decay一般設(shè)1e-4或1e-5能有效抑制大權(quán)重。減少模型容量。如果你已經(jīng)用了很大的預(yù)訓(xùn)練模型考慮換更小的模型或者只微調(diào)最后兩層。參數(shù)量越少越不容易記住噪聲。早停。觀察驗證集準(zhǔn)確率一旦連續(xù)幾個 epoch 沒有提高就停止訓(xùn)練恢復(fù)之前保存的最佳模型。檢查驗證集是否“臟”。如果你把訓(xùn)練集里的一部分圖片也混進(jìn)了驗證集模型在驗證集上表現(xiàn)好就是假象。目錄劃分時一定保證類別文件不重疊。還有一個被很多人忽略的問題數(shù)據(jù)增強(qiáng)只有在訓(xùn)練集上做驗證集不要做。如果為了“公平”給驗證集也加了隨機(jī)翻轉(zhuǎn)驗證集每次評估結(jié)果都會有波動而且這種波動并不代表模型的真實能力。6.4 可視化中的中文字體亂碼折騰到畫混淆矩陣和錯誤樣本時你大概率會遇到中文字體顯示成方框的情況。這是因為 matplotlib 默認(rèn)字體不支持中文。最省事的辦法是在繪制圖之前設(shè)置字體import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False但前提是系統(tǒng)里已經(jīng)裝了對應(yīng)字體。如果沒有不少人的做法是把所有類別標(biāo)簽映射成英文拼音或者英文翻譯畫圖時顯示英文。這樣其實更省心因為在命令行和大多數(shù)圖表環(huán)境中英文的兼容性最穩(wěn)定。如果你是在演示項目標(biāo)簽直接顯示中文當(dāng)然更友好那就按上面的配置調(diào)字體。6.5 一些容易忽略但很實用的小細(xì)節(jié)最后分享幾個我在實際項目中反復(fù)用到、但教程里很少強(qiáng)調(diào)的小細(xì)節(jié)。模型和數(shù)據(jù)的設(shè)備一定要統(tǒng)一。最常見的報錯就是“Expected all tensors to be on the same device”通常是因為模型在了 GPU數(shù)據(jù)還在 CPU。解決辦法就是訓(xùn)練循環(huán)里把每個 batch 的images和labels都.to(device)模型在定義后也.to(device)。計算準(zhǔn)確率時outputs.argmax(dim1)出來的結(jié)果和labels的類型要能直接比較。如果labels也是 LongTensor直接用就行如果不放心可以.long()統(tǒng)一一下。對新手來說盡量別在一開始就追求復(fù)雜的分布式訓(xùn)練或混合精度那些花活。先把 CPU/GPU 訓(xùn)練跑穩(wěn)再逐步嘗試優(yōu)化。我在最初做食物分類時連tqdm都不用每次訓(xùn)練只能干等著后來加了進(jìn)度條那種隨時能看到進(jìn)度的感覺對保持耐心幫助很大。還有一個小技巧訓(xùn)練時每多少個 step 打印一次 batch 損失不要等一個 epoch 結(jié)束才看。因為 epoch 結(jié)束往往要好幾分鐘中途看了才能及時發(fā)現(xiàn)問題。我習(xí)慣在每 50 或 100 個 iteration 的時候打印一次當(dāng)前 loss這樣能更早發(fā)現(xiàn)學(xué)習(xí)率是否合適。如果你已經(jīng)跑通了上面的流程恭喜你你已經(jīng)具備了做一個圖像分類項目的基礎(chǔ)能力。接下來可以往兩個方向走一是增加類別數(shù)把模型換成 ResNet50 或 EfficientNet探索更多預(yù)訓(xùn)練模型的效果二是把訓(xùn)練代碼整理成可復(fù)用的模板加入命令行參數(shù)、日志系統(tǒng)、更多評估指標(biāo)讓它成為一個真正屬于自己的項目框架。食物圖片分類雖然小但模型訓(xùn)練的整套思路在里面是完整的。把它吃透后面再接觸目標(biāo)檢測、圖像分割這些復(fù)雜任務(wù)時你會發(fā)現(xiàn)自己不是從零開始了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
青青草大香蕉视频| 小骚逼被操的爽不爽| 91综合在线| 中文字幕av一区二区三区人妻少妇 | 日韩电影天堂视频二区三区| 日本十八禁免费看污网站| 亚洲综合网电影91| 1024午夜激情男人的天堂| 日韩99精品视频综合区| 中亚黄色三级大片| 大香蕉伊利av| 欧美18 在线观看| 久草视频观看视频在线| 亚洲偷91色| 玖色AV| 欧美十八禁导航成人| 欧美 综合 亚洲| 伊人五月天| 五月婷婷丁香六月丁香| 久污| 精品国产久久乱码| 97超碰亚洲| 久久成人午夜精品影院| 亚洲性爱电影| 亚洲激情久久| 美女操逼福利视频| 乱伦AVxx| 亚欧无码线免费观看视频| 色悠久久久av| 日韩电影天堂视频二区三区| 亚洲精品 欧美精品| 国产欧美亚洲精品a第2页| 久久久日本电影| 亚洲情色第一页| 亚洲精品99| 欧美自拍偷拍免费观看| se吧提供91精品国产91久久久久久| 丝袜综合网| 97公开久久| 青青草吊丝| 被体育老师抱着c到高潮| 国产高清自拍| 国产黑白丝在线| 97精品国产97久久久| 日本激情免费大片| 99久久久久久亚洲精品不卡| 乱伦一二三区| 欧美网站免费| 日本在线一二 | 97欧美色综合| 亚洲图片欧美偷拍| 久久婷婷苹果| 中出后入| 久操电影网| 中文字幕人妻色偷偷久久皮 | 亚洲欧洲日产国产综合网| 欧美亚洲国产自久久| 91精品伊人久久久大香线蕉91| 韩国一级AAA| 超碰精品日韩欧美国产| 亲子敌伦对白在线播放| 97国产|免费| 九热中文字幕| 亚洲男人天堂手机版| 欧美性爱网97| 天天干1区2区在线| 极品久久久久久久久久久久久久| 国产人妻精品一区二区三区秋霞| 国产精品视频在线观看| 91内射| 在线人成亚洲视频免费观看| 一本一道vs波多野结衣| 天欧美在线| 亚洲色图久久精品蜜| 97精品久久| 粉嫩av在线一区二区| 成人丁香五月| 中文字幕在线观看丝袜| 二级久久网| 欧洲视频在线| 午夜视频好爽啊| 国产亚洲色停停久久99精品91| 亚洲av综合色| 丁香五月综合| 四虎av在线| 揉揉揉夜夜| 久操97| 国产午夜精品一区二区三区牛牛| 九月丁香综合网| 成人看片网站| 亚洲天堂资源在线| 国产AV激情无码久久无码 | 中文字幕国产精品1区| 久久久国产精品人妻丝袜| 天美av在线观看| 91天射| 东京男人天堂| 乱伦a片视频| 日本色色网| 九九人妻| www.99中文字幕| 肉丝网站91| 欧美另类自拍 | 另类TS人妖一区二区三区| 日本天天吊| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 新版天堂中文资源8在线| 精品人妻一区二区三区-国产| 亚洲AV资源| 可乐操亚洲蜜911| 草草影院日本第一页| 高清不卡一二三区视频......| KK色在线影院| 亚洲av在线免费观看| 无码精品啪啪啪一区二区三区三州| 91亚洲黄色网| 色欲天天综合网| 欧美综合在线第一页| 精品人妻中文字幕4399| oumeizonghese,www| 精品在线蜜臀| 青青操在线亚洲视频观看欧美在线 | 高清视频一区| 欧美一二三区四五区| 欧美日韩人妻少妇 一区二区三区| 色综合一本| 大香蕉 222| 久久午夜色播影院免费高清| 5278欧美一区二区三区| 大香蕉日韩欧美| www.国产高潮精品| 欧美精品不卡一二三四在线91| 国产精品无码AV网站| 欧洲一区二区三区四区在线观看| 日本熟女中文| 操淫穴亚洲五月丁香| 日韩免费高清大片在线| 用力操死我| AV麻豆免费一区| 一区二区三区机械有限公司| 国偷自 一区二区| 中文字幕中文字幕一区二区| 亚洲九九视频| 久久久久久波多野吉衣高潮| 蜜桃无码AV一区二区| 屌妞视频久久久久久久| 欧美色视频在线| 大香蕉2017| 久久久久免费少妇| 国产黄色影片在线观看| 激情欧美97| 久久久亚洲精品电影免费看| 伊人久久AV诱惑悠悠| 无码91| 内射老妇BBWX0C0CK| 成人综合网 欧美| 自拍偷拍国产欧美日韩韩| 99热这里只有是精品10| 三级三久久线久久99久目本WW| 人妻天堂网| 午夜精品久久久99| 婷婷丁香熟妇综合网| 天天影视色香欲综合网小说| 日本顶级天天操狠狠操夜夜操中文字幕| 午夜久久无码1000合集| 9Ⅰ超碰| 九一屌逼| 欧美熟妇视频| 97国产高清视频在线观看| 一本色道人妻久久| 日韩人妻精品中文字幕| 亚洲精品天天影视综合网 | 欧美最大综合网| 亚洲 91 在线| 国语对白在线播放视频| 8x福利精品第一福利视频导航| 国产精品丝袜在线| 金典av| 99热在线播放| 欧美日韩精品一区二区三区高清| 日本成人在线不卡一区二区三区| 久久久∴| 夜草欧美| 欧美老妇女内射网址| 色婷婷久久| 久久大| 国产97在线播放| 国产午夜视频| 成人热久久精品| 日韩AV一区二区三区四四| 啊啊啊在线观看| 日韩精品资源| 久操| 蘋果手機免費看成人Av| 熟啊v色欧美热| 四虎AV在线观看| 天天视频黄网站| www.yeyecao| 中欧人妻丝袜中文字幕| 老熟妇91| 日躁天天爽爽| 东京热一区二区中文字幕| 亚洲精品电影| 香蕉精品二区二区| 密臀在线一区尤物| 国产精品白丝| 草草电影院| 色99久草| 欧美日韩小说| 精品国产a∨一区天美传媒| 色偷偷人人玩人人舔人人操人人摸人人爽| 国产精品久久久久久久久久久久久久久久 | 亚洲日韩东京热一区| 97超碰久| 国产精品乱码久久久久久| 91久久国产综合精品| 人妻内射一区二区在线视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 超碰人妻97| 97久久超碰日韩精品| 蜜臀网址在线| 欧综合网| 少妇xx精品| 国产精品久久久久久久毛片1| 三级色综合| 日韩无码a片| 久久AV无码网址| 国产欧美日韩精品中文| 99热婷婷| 天天舔天天日天天射| 狠狠2050在线观看| 清纯唯美综合| 日本国产高清色www视频在线| 亚洲1区2区三区高清中文字幕| 久久性爱网站| 九九热免费国产视频婷婷伊人| 国产乱码久久| 久久伊人青青草| 99热日| 台湾佬大香蕉| 国产精品爽爽v| 97国产高清视频在线观看| 99视频只有精品| 偷窥自拍亚洲色图| 91N综合网在线| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 天天激清| 色综合久久88色综合久久天天| 大香蕉手机视频| 狠狠躁AV| 亚洲天天自拍| 精品高清av中文字幕| 国产亚洲禁久一区二区| 美女在线H91| 天堂涩涩| av影片在线观看不卡| 无码操逼网| 成年女人一区| 91狠狠综合久久| AⅤ片水多多| AV无码久久久精品| 日韩少妇丰满亚洲| 精品对白久久不卡| 亚洲第一成人影院色播| 屌妞视频久久久久久久久久久久| 老熟女阿 国产91| 中日韩免费看男女操逼大全| 五月丁香激情综合| 中文字幕欧美日本乱码一线二线 | 欧美老熟另类| 国产精品乱码久久久久| 岛国精品视频在线观看| 加勒比综合a∨| 欧美人体性爱互联网第一页婷婷日本| 可以免费观看的AV| 久久亚洲日韩国产欧| 影音先锋每日最新资源在线观看| 国产精品对白内射| 色综合加勒比| 久久,精品一二三| 中出后入| 国产专区第一页| 国产人伦精品一区二区三区| 免费视频一二三区| 大香蕉宗合网在线| 久久嫩草| 97碰在线视频| 色97干| 日本一级黄色电影| 大香蕉中文网| 久久女婷| 东京热,男人的天堂| 男男H黄动漫啪啪无遮挡网站| 天天干人妻| 亚洲图片色图欧美另类| 亚洲熟妇熟在线电影视频| 97超碰精品| 人妻精品综合中文字幕在线 | 天天影视色香色欲| 屁股久久久久久| 亚洲性爱高潮影院| 国产精品久久久 | 五月丁香婷婷色| 中日韩久久久免费看| A片 AV一级在线播放观看免费 | 国产精品一区二区手机看片| 9热9热综合网| 成人无码在线超碰网| 99re只有精品| 91啪啪视频| 97碰碰色| 欧美亚综合色图| 少妇一级婬片免费放一级a性色.| 成人欧美日超碰| 奇米狠999| 高清不卡 中文 人妻| 99久久婷婷国产综合| 91丝袜| 黑丝91视频| 都市久久精品激情亚洲| 91操人| 久久亚洲av成人无码国产| 欧美中日韩XXXX| 亚洲麻豆精品二区三区| 日韩熟女无码| 久久久91福利姬| 精品国产精品一区二区| 天天影视色香欲综合网小说| 超碰在线综合97| 亚洲91少妇| 亚洲色图尤物视频| 四虎884| 久久97资源 网| 干日本人少妇午夜寂寞影院| 夜夜欢天天干| 国产精品午夜福利视频| 69人妻精品一区二区绯色| 91P0RNY大屁股人妻| 欧洲自拍第一页| 久久一二三四五六七八九区区区 | 男女啪啪啪18禁网站| 99久热精品99re6热| 婷婷色综合| 日韩激情毛片一级久久久| 东京热,男人的天堂| 97超碰色屌| 狠狠狠狠狠干| 午夜福利免费福利视频| 偷拍 欧美 日韩| 91在线丝袜| 久久久久久久78| 超碰九色| av网页一区二区三区| 精品91日日夜夜超清资源| 91男同| 天天操天天射青青草| 色噜噜人妻丝袜a∨先锋影| 久久在线观看免费视频| 久久男人的天堂| 人人澡人人澡人人| 久久久精| 97久久精品不卡| 91在线限制级| 亚洲 欧美 中文 日韩超碰| 中文久久爆乳| 免费啪啪一级视频| 无码高清国产AV| av网站免费看| 欧美v日韩v亚洲v最新在线| 91日韩网站| 97超碰超欧美。| 另类亚洲图色| 台湾佬中文娱乐自偷自拍| 婷婷五月天伊人| 亚欧韩av| 丁香九月激情啪| 视频分类 国内精品| 啪啪AV导航| 日韩亚洲精品一区二区| 亚洲天堂无码| 欧美成人黄网色网站| 亚洲国产精品无码AV在线| 伊人一区二区在线播放| 日韩黄色片子| 国产 亚洲 丝袜 制服| 日韩精品在线视频在线观看| 91搞逼视频| 午夜福利1区2区3区| 国产v片在线免费观看| 爱妃国产亚洲视频中文字幕| 操操操五月天婷婷丁香影院| 日本黄大片在线观看视频| 91AV入口| av最新免费中文字幕| av无线看| 一区二区三区机械有限公司| 99精品久久| 97人妻色| 97人亚洲综合字幕| 欧美日韩97在线| 狠狠97| 久久人| 91欧洲国产成人久久精品网站| 欧美色图片| 超碰97人妻免费在线| 亚洲综合另类小说色区亚洲成av人片在www| 超碰精品日韩欧美国产| 一区二区三区黄片免费观看| 亚洲精品三| 狠狠久久亚洲欧美专区| 亚洲熟女乱熟乱熟妇综合网二区| 久久久精品久久| 日日骚av| 国产v片在线免费观看| 天天操夜夜嗨| www99热| 嗯嗯啊啊用力视频免费| 208天天久久九九九| 97狠狠| wwwxxx日本爽| 亚洲s在线观看| 亚洲天堂日本| 91性色| 自拍偷拍 高清无码| 婷婷综合久久| 2017大香蕉国产精品久久| 青青草在线视频美女| 日韩无码极品| 久久久精品成人国产| 91人人爽人人爽| 超碰碰小说97| 被窝影院午夜看片无码| 亚洲精品久久久久久久蜜桃臀| 内射白嫩美女| 亚洲欧美综合图片| 欧美色视频在线| 亚州精人品大香蕉| 果冻传媒A片一二三区| 日韩啊V| 国产超碰人人操| 久久国99999| 欧洲人妻视频| 天天躁日日躁XXXXYY| 亚洲巨爆乳一区二区三区四季网| 婷婷激情四射| 乱伦av麻豆| 亚洲精品无码久久AV| 人妻中文在线| 久久原创中文| 中国一级操逼视频| 强上我不卡卡| 欧成人精品H无码| 大伊香蕉在线视频免费| 色在线69堂| 久久透逼视频| 欧美少妇一区二区三区| 久久中文字幕在线观看| 亚洲天堂 视频你懂的| 91久久18禁| 激情五月天中文字幕色| 日本三级韩国三级99| 亚洲97网站| 欧美强奸乱能| 亚洲性感丝袜诱惑在线观看| 密乳AV免费观看| 国产suv精品一区二六| 激情抓乳插进去啪啪啪日韩 | 人妻熟女一区二区在线视频| 久草福利在线资源站| 日韩丝袜高跟制服在线观看| 久久久久亚洲av综合波多野制衣| 色五月天AV| 麻豆国产精品午夜视频| 久久神马影院| 在线岛| 97超碰免费人人性爱| 一本色道久久天天射天天干| 91爰爱欧美| 逼操网站| 热热色青青草| 亚洲男人的天堂亚洲| 欧美色网络| 日韩亚洲美州欧洲综三区一品在线| 伦理第一页| 加勒比在线视频| 高清国产无码av| 伊人久久大香线综合无码| 国产女人和拘做爰视频| julia ann久久| 九九99精品视频在线观看| 69久久| 97资源制服丝袜| V A在线| 国产中文福利| 人妻精品一区二区在线| 日韩情色一区二区| 人人澡人人弄| 欧美日综合| 老女人综合网| 久久偷偷色综合蜜桃| 秋霞视频一区二区| 97超碰色| 亚洲色图第四色| 嗯嗯啊中文字幕| 成人av福利在线观看| 色婷婷一区二区三区久久午夜| 色色操| 欧美区亚洲区偷拍区| 天天综合网~91综合网| 艹我哪美一区无码| 婷婷去俺也去六月色| 国产综合久| 97超碰逼| oumeisetu综合| 国产精品久久久久久久毛片1| 农村少妇久久久久久久| 日本啊啊啊啊啊视频| 超碰成人国产| 日韩有码 一区二区三区| AV男人天堂网| 国产精品亚洲四五区在线观看| 五月婷婷丁香中文字幕| 影音先锋新男人| 大鸡巴久久| 骚女高跟AV在线| 天天欧美色| 在线可观看的黄色网址| 精品人妻一区二区三区四区石在线| 国产自啪精品视频网站黑丝| 男人的天堂VA在线| 日韩欧美亚洲国产日韩| 色婷婷综合网站| 亚洲精品一二区| 夜夜骑夜夜操| 久久99九九九九6666免费观看软件| 97频视在线| 高凊专区人人操| 亚洲人妻AV| 亚洲暴力强奸AV| 老子午夜伦不卡影院| 亚洲综合97| 天天躁日日躁狠狠狠躁| 尤物视频偷拍免费| 久久久久久裸体| 欧美页片| 日日夜夜青青草母狗| 久久久久9久久久久| 资源在线观一 二| 色婷婷久久| 日本理论在线| 国产女性无套 免费观看| 久久五十路熟女人妻| 91性高朝久久久久久久久| 97免费视频在线观看| 哈哈操电影| 日韩久射综合| 九久9精品| 97视频播放| 在线看污网站| 伊人九九九| 舔足天天操天天射| 高清无码人妻久久久一区二区三区aⅴ| 精品一区二区久久| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 日韩av在线精品观看| 日日超碰亚洲| 伊人热综合| 婷婷av在线中文字幕| 无码一区免费在线不卡| 強姦亂倫a| 成人a级高清视频在线观看| 国产兽交视频在线播放| 午夜视频好爽啊| 亚洲无码?第一页| 亚洲一区二区三区欧美日韩| 免费毛片在线播放| 性色一线| 台湾肥佬网一区二区三区| 大香蕉天天看妹子| 亚洲综合一| av橘色网站| 久久久9999| 国产探花日韩援交| 亚洲少妇中文字幕网址| av优播| 午夜欧美神马久久久久| 啊啊啊啊,啊啊好多水 | 丝袜夫妻自拍| 97视频7| 久久久久深夜无码| 欧美亚洲天堂| 新婚人妻扶着粗大强行坐下| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 欧美 综合 亚洲| 尤物视频新赏网鲜网色诱网| 蜜臀无码视频在线观看| 国产AV久久野战精品| 91GD.COM| 成人A片男人的天堂| 亚洲 中文 欧美 日韩 在线| 亚洲一级黄色毛片| 无码在线亚洲| 免費人妻夜夜爽天天爽爽一区| 欧美性综合| 91无遮挡| 色爱国产| 色麻豆AV| 欧美精品宗合| 少妇滛荡视频| 裸体美女久久久| 国产97在线视频| 久久亚洲AV无码专区国产精品| 久久黄黄| 国产精品对白自产拍| 永久免费av无码网站国产app| 综合久| 天天射夜夜| 2020久久免费视频| 丁香五月婷婷啪啪| 98福利在线视频| 国产精品久久久吖| 日韩欧美女优电影| 国产丁香精品露脸视频| 亚洲精品无码久久AV| 美女露胸露屁股| 99色热| 久久国内| 媚薬在线视频麻豆| 黄色操人| 国产婷婷一区| 久久夜夜| 国产不卡精品91| 久久高潮妇女视频| 强奸xx国产| 日韩av情韩国爱禁区av一区二区| 飘花国产午夜精品不卡| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 春色91| 成片免费观看视频大全| 日韩高清一二三| 中文字幕乱在线伦视频中文字幕乱码在线 | 大鸡吧尹人在线| 综合 亚洲 欧美| 丁香六月激情综合| 国产一线二线三线av| 丁香六月综合激情| 超碰97国产欧美| 99色天堂| 97极品无码| 久久久久久亚洲精品不卡人乳| 一区二区三区一亚洲中文字幕、综合区灬| 亚洲精品乱码久久久久久蜜桃麻豆| 蜜桃丰满熟妇av无码区不卡| 麻花传媒免费网站在线观看| 91AV天美在线视频| 一区三区啪啪| 久久久久成人网| 91视频国品一二三区| 啊啊啊免费视频| 色婷婷aV一区二区三区麻豆综合| 91被操| 新视频sss国产| 亚欧Av| 国产精品农村妇女| 一区二区三区 丝袜 高跟 美腿| 国产内射爽爽大片| 99色骚| 在线观看国产黄色| 人人妻人人澡人人爽久久av| 中文字幕视频2区| 岛国毛片在线观看免费| 九九九九九九九九九九九蜜桃 | 熟妇一区二区| 夜夜狼人妻| 成人美女av| 天天干嫩逼网| 中文字幕55555| 欧美另类精品xxxx| 亚洲小说视频| 欧美色图私拍91| 日韩午夜精品一区二区三区电影| 四虎在线视频| 91欧美长吊| 91丨熟女丨丰满熟女| 97精| 蜜桃精品视频一区二区三区| 中文字幕二区日韩天堂| 欧美老妇曰批的视频| 天天干夜夜鈤| 日夜干射色啊| 91黑丝在线播放| 精品国产人成在线| 嗯嗯啊啊操我| 亚洲涩图欧美| 日韩精品高清资源在线| 操逼网站视频漫画国产| 69视频入口| 超碰偷拍| 日本不卡二三区| 长长久久88视频| 少妇xx精品| 国产一区二区三区高清视频| 国产又粗又长的视频| 欧美老妇综合网| 婷婷六月色| 老熟女乱子伦中文字幕一区二区| 亚洲欧美情色| 97 国产精品| 97色视频在线| 欧美熟妇视频| 91久操| 手机在线观看不卡无码av| 91精品人| 春色综合网| 久久久9 9 9精品| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产精品操| 91美女视频。| 男女香蕉一区二区| 丝袜美女诱惑 91 视频| 欧美亚综合色图| 精品一区二区啪啪啪| 久久久久国产一区二| 性爱乱伦视频免费| 男人女人18禁片免费看网站| 天久久久噜噜噜久久国产精品爽爽| 91亚.色| 综合激情一一91| 亚洲吊色| 91网站视频在线观看| 无码一区二区三区四区五区六区七区八区九区十区视频 | 国产久久成人| www.99色| 欧美特大AA级黄片| 亚洲av无码国产精品字幕| 97综合在线| 三四中文字幕| 日韩图色| 亚洲精品99999| 91丝袜视频在线观看| 国语精品av| 97欧美日韩综合| 东京太热男人的天堂久久久| 亚洲欧美骚| 大香久久| 91春色| 香蕉国产精品麻豆亚洲欧美日韩| 国产午夜精品理论片一二三区区| 精品日韩人妻精品一二三区| 欧美亚洲素人制服精品| 无码高清国产AV| www国产天美久久久| 人妻中文字幕日韩电影| 五月丁香综合啪啪| 五月天色图影视| 97AV爱| 二对二中文字幕。| 久久精品国产久精国产| 玖色av| …亚洲黄色厕厕女女在线播…| 啪啪视频免费在线观看| 国模私拍一区二区三区神乳| 国模艳艳啪啪一区| 亚洲国产无码精品首页久久久| 99热66| 欧美综合第一| 大香蕉伊然在亚洲91| 老司机香蕉| 家庭乱伦麻豆| 欧美日韩一区二区三区四区蜜桃| 人妻熟女av国产网站| 欧美亚州手机在线| 熟女AV一区| 18+91网站| 国产偷人伦激情在线观看| 午夜一级免费毛片| 亚洲黄色影视| 美腿丝袜高跟网免费视频免费视频| 久久成人午夜狠狠| 少妇久久久久久久| 欧美日本中字另类在线| 精品超碰中文在线| 亚洲色图 图片| 男人天堂新| 成人性爱av| 香蕉婷婷| 另类 综合 日韩 欧美 亚洲| 久久欧美激情| 两女互慰AV高潮喷水在线观看| www色日本| 99999精品成人| 色69大色97香蕉| 国内精品嫩模A∨私拍小视频| 人人天天干干| 91久久久视| 亚州性色| 久久久久久国产精品免费网站| 欧美黑人猛交春色影视大全| 天天日熟妇| 色婷婷六月丁香七月婷婷| 26uuu国产| 99热日| 国产精品黑人一区二区三区| 99久视频| 亚洲情色综合网| 麻豆国产97在线| 天天做天天爱| 无码九九| 美国一区二区三区视频| 亚洲男人的天堂V| 99re视频在线播放青草| 免费A V在线播放| 最新中文字幕av| 视频不卡中文字幕| 激情五月综合| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 色香欲影| www.丁香五月| 久久久久幕乱码| 曰韩操B| 国产综合久久久鬼色| 极品另类| 五月激情在线| 东京热,男人的天堂| 国产又大又硬又长又粗| 1000午夜黄色| 国产精品毛片?v一区二区三区| 九久久九精品视频| 91亚洲欧美| 超碰超碰95| 啊啊啊啊操死我| 首页亚洲国产高跟丝袜诱惑视频| 麻豆天天躁天天揉揉AV| 日本韩欧美在线播放a| 日韩综合色网| 国产大学生高潮在线播放| 91N综合网在线| 日本欧美亚洲高清在线看| 91色色综合| 久久久国产亚洲精品系列| 制服诱惑亚洲一区二区三区在线观看| 九九热久久99精品re| 久久亚洲人妻| 久久久久亚洲AV无码专区少妇| 歐美性天天| 在线国产福利网址导航| 天天插天天操天天摸天天射天天看| 精品国产人成在线| 人妻色情天天操| 丁香成人五月天| 美女久久久久久久久久久| 69精品在线| 女欧美一区二三区| 久久大陆| 日韩性爱网址| juliaann丝袜| 熟女色图在线| 无码高清专| 精品玖九九久| 9999伦理视频| 亚洲精品xxx| 97操碰| 青青草九九九九九| 欧美A片中文字幕| 精吧天堂| 91国产精品在线看| 超碰国产精品无码| 超碰碰小说97| 天天看天天综合成人网| 亚洲高清无毛一区二区| 91色s| 国产精品91一样| 亚洲综合另类小说色区亚洲成av人片在www| 久久九操在线观看| 亚洲精品 大香蕉| 国产精品探花色| 国产精品夜夜夜| 午夜天天碰综合视频| 亚洲最新av无码成人精品区| 蜜臀99久久国产| 亚洲熟妇熟在线电影视频| 国产精品无码AV网站| 青娱乐国产剧情av一区| 色偷偷超碰亚洲| 色综合91| 18禁超污无遮挡无码免费网| 午夜性生活av免费在线看 | 九九黄色视频在线观看| 秋霞一集毛片观看| 美女t无毒不卡不卡| 操b网站亚洲无码| 亚洲操操| 国产偷拍自拍在线视频| 免费AV中文网在线观看| 亚洲第一页综合在线| 欧亚第一综合网| 色久综合| 国产精品久久久久无码AV会牛| 91综合色噜噜| 9久久久久久| 亚洲熟女一区| 日日日啊啊啊| 小少妇| 免费a在线播放v| 99re热有精品视频国产| 国产99999| 91精品在线播放| 素颜老阿姨乱情色| 少妇一区二区三区在线观看| 天天插天天干| 亚洲国产一区二区三区四区国产| 成人精品一区二区91毛片不卡| 超碰色综合| 日韩精品 欧美激情| 熟女久久久| 欧美伦乱爱| 久久国产精品,久久国产| 曰韩精品九九无码| 在线不卡视频| 动漫爆乳3D奶水一区在线观看 | 视频在线观看青青99国产| 大香网伊人久久综合网eew| 亚洲美女精品| 青青网三级视频| 婷婷伊人綜合中文字幕| 大香蕉综合在线| 日本韩欧美在线播放a| 91久久精品中文字幕| 啪啪视频亚洲第一| 高潮的A片激情扒开一区| 国产精品黑人一区二区三区| 超碰成人人人爽人人爽| 97天堂| 久久久少妇| 日本一区二区不卡| 日日爱99| 国产强奸乱伦无码视频| 久久伊人最新网址视频| 麻豆国产97在线| 极品销魂美女一区二区| 中文AV制服乱伦| 日B操| 美国人人操人人操| 乱论91| 人人干人人操人人..com| 中文字幕av亚洲在线| 在线v中文字幕一区二区三区| 一级久久性爱视频| 国产99 中文字幕日韩小视频| www.久久久久| 天天综合91在线| 男人的天堂在线2| 中文字幕少妇色 | 日韩97P| 国产精品一区二区a| 国产探花日韩援交| 久久夜黄色无码A级大片| 亚洲古典另类欧美在线| 日本黄 R色 成 人网站| 中文字幕黑人大片| 9热9热综合网| 日本熟妇精品九九| 啊啊啊啊嗯嗯在线久久久| 96久久久| 人人操人人摸人人看人人干| 丰满的三级少妇欧美久久久| 91欧美高清| 青青色综合| 韩国嫰模上门援交视频| 精品一区二区三区蜜桃| jazzjazz国产精品麻豆| 亚洲最新av无码成人精品区| 五月婷婷久久综合| 欧美综合色站| 激情四射婷婷六月天| 青青操国产夫妻| 精品美女久久久久| 成人免费在线网站| 亚洲图片欧美91N| 中文一区在线日| 97精品在线视频| 欧美亚洲一级在线观看| 五月天色图| 97综合日韩| 天天碰久久入| 乱操乱伦AV| 亚洲五月婷| 日韩av色图综合| 97国产|免费| 久久久亚洲Av| 亚洲综合网电影91| 4虎在线视频| 999久久久| 亚洲精品中文字幕一区在线视频| 久久这里都是精品| 9.1小视频| 国产精品永久免费10000| 91丨九色丨东北熟女| 美性中文综合网| 久操97| 欧美性爱精品一区二区| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 97久久久久| 精品人妻av在线播放| 毛片视频白嫩| 久久久999国产| 免费的很黄很污的全部视频| 天美av在线观看| 久久久无码精品人妻二区 | 中文字幕一区 二 区 三 四 五 区日 日 骚 | 91老熟女91老女人| 男女激烈网站最新| 久久手机好看网站| 日韩精品一区二区人人人| 2019天天干天天操| 熟妇艹鸡八| 蜜臀久久99精品久久久| 国产亚洲在线| 国产中文字幕在线| 免费A V在线播放| 婷婷另类小说| 中文字幕黄片在线| 精品一区二区三区最新| 久久久久久九| 五月天社区| 色欧美在线| 成人国产精品三级A片| 91欧美巨乳| 黄色AAAAAAAAAAA大片| 夜夜人妻爽| 人人艹亚洲| 青青草手机在线免费观看| 国产精品不卡高清在线观看| 女色视频社区| 五月丁香激情四射| 国产精品老熟女一区二区| 九久9精品| 九九色色| 999久久久九九九九| 色色色综合网| 99在线精品视频| 在线观看一卡二卡| 中文字幕一区二区三区50路| 91狠| 神马久久久久| 不卡超碰护士AV在线免费播放| 国产9区| 特级大荫道BBwBBwBBW| 欧美成年人性爱视频免费观看| 精品人妻一区二区免费蜜桃| 日韩视频精品在线观看| 91久久久视| 精品偷拍13p欧美dodk视频| 在线观看 99热| 日韩欧美经典在线观看| 91 偷| 欧美大码在线视频| 久久精品福利影院| 精品人妻一区春色| 黄色大香焦1级‘′‘| 超碰4A| 欧美少妇大量自拍视频在线观看| av毛片aaaaa免费看| 99精品网站| 久久精品国产亚洲AV片多多| 一区二区无码视频| 欧美少妇熟女| 亚洲日韩视频二区| 亚洲AV无线| 久久亚州高清| 国产成人精品必看 | 美国一区二区三区视频| 欧亚日韩综合精品国产| 一块操欧美| 色欧洲| 91欧美美女日韩国产婷婷| 1024人妻熟女一区二区三区| 久久一区二区蜜桃| 2019AV天堂| 精品超碰国产| 国产精品内射婷婷一级二| 久久同城AV| 亚洲高潮少妇| 国产日韩欧美中文在线播放| 国产国产亚洲一二三久久| 亚洲城人男人的天堂| 操逼操逼逼操操逼91 | 丁香婷婷啪啪| 国产成人亚洲精品无码最新在线| 美国三级日本三级久久99| 爱爱动态120秒| av无码精品久久久久| 91老熟女| 久久精品成人| 欧美人妻色| 五月天色图影视| 秋霞蝌科网日本一区| 亚洲 暴爽 AV人人爽日日碰| 日本精品九九九| 色老汉色| 99热超碰| 十八禁成人网站在线观看| 操逼网站网站| 91白虎| 长久操视频| 另类av天堂| 天天爽爽爽爽| 九九无码视频| 亚洲阿v天堂无码z2018| 久久国产乱子伦精品免费女,网站| 青木玲在线不卡| 国产精品亚洲四五区在线观看| 伊人久久婷婷| 亚洲成熟国产精品美女| 中文字幕日韩专区精品系列| 欧美色性情| 久草色在线观看| 日韩 欧美 国产 麻豆| 久草新免费| 乱日视频| 熟妇熟女视频一区二区三区| 免费人成?大片在线播放| 国产av又色又爽又黄| 欧美精品精品一区二区| 精品久久久久综合无码| 9九九国产| 综合97久久| 成人久久久精品| 人妻色情天天操| 自拍偷拍草一草| 日本不卡二区| 超碰99re| 青青草一区二区高清无码视频| 亚洲天堂电影网| 97精品国产精品免费观看| 九九九九日本| 欧美性暴力猛交XXXX| 日产国产精品中文久久婷婷| 亚洲午夜免费狠狠干| 狠狠色丁香| renqi久久久久久久久久久久| 另类专区在线观看| 国产欧美一区激情交| 韩国一级做A片免费的| 熟妇操花| 91麻豆va国产精品| 热九九精品| 狠狠干,狠狠操| 操人妻少妇中文 | 精品久操| 国产精品午夜福利| 人妻精品一区二区三区| 一本色道熟妇| 久久啊啊啊| 97在线看| 日韩熟女无码| 国产中文大片资源中文字幕| 乱伦av国产| 国产 三级自拍| 红杏大香蕉|