欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(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ù)準備、模型搭建到訓(xùn)練調(diào)參、評估排查完整講一遍。代碼不是玩具都是能直接跑的級別同時會解釋每個關(guān)鍵選擇背后的原因以及我踩過的坑。適合剛看完 Python 語法、對深度學(xué)習(xí)有一點概念但還沒獨立做過項目的讀者。你會發(fā)現(xiàn)很多看似復(fù)雜的流程其實只需要幾十行代碼。1. 項目概述與整體思路1.1 為什么首推食物圖片分類作為入門項目圖像分類是計算機視覺最基礎(chǔ)的任務(wù)也是入門深度學(xué)習(xí)最自然的起點。食物圖片分類這個方向恰好把“任務(wù)難度”和“學(xué)習(xí)成本”放在了一個很舒服的位置你不需要去理解目標框、分割掩碼這些復(fù)雜概念只需要讓模型判斷一張圖屬于哪一類食物。我選它的另一個人理由是結(jié)果可感知。你做貓狗分類模型錯了你甚至覺得正常但食物分類錯了你能立刻發(fā)現(xiàn)它把“宮保雞丁”認成了“辣子雞丁”這種錯誤會讓你愿意去分析原因。而且食物類別的視覺差異往往很細微比如不同做法的炸雞、不同種類的面食這天然要求模型學(xué)習(xí)更細粒度的特征對理解features到底在學(xué)什么很有幫助。從工程角度看食物分類的數(shù)據(jù)獲取成本也低。公開數(shù)據(jù)集中既有幾十萬張的大規(guī)模食物數(shù)據(jù)集也有單類別幾千張的小型子集新手完全可以用幾個類的子集練手十幾分鐘就能下載完。配合 PyTorch 生態(tài)里的預(yù)訓(xùn)練模型幾十行代碼就能達到一個不錯的基線這種快速反饋對建立信心特別重要。1.2 零基礎(chǔ)需要準備的工具與環(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顯示進度條這幾個用 pip 一下就好。新手容易忽略的一件事是數(shù)據(jù)格式。PyTorch 的torchvision提供了很多圖像處理工具但底層讀取圖片依賴 PIL 或 OpenCV。裝好pillow就行不需要額外裝 OpenCV除非你要做一些特殊預(yù)處理。1.3 整體流程與關(guān)鍵決策一個標準的圖像分類項目流程其實非常固定準備數(shù)據(jù)下載或收集圖片按類別組織目錄結(jié)構(gòu)。預(yù)處理縮放、裁剪、歸一化讓模型輸入更規(guī)范。構(gòu)建數(shù)據(jù)加載器把海量圖片分成一個個 batch訓(xùn)練時逐批送入模型。定義模型選一個預(yù)訓(xùn)練模型把最后一層換成自己的分類層。定義損失函數(shù)和優(yōu)化器分類任務(wù)一般用交叉熵損失。訓(xùn)練循環(huán)前向傳播、計算損失、反向傳播、更新參數(shù)循環(huán)多個 epoch。評估在驗證集上算準確率、混淆矩陣用可視化發(fā)現(xiàn)模型缺陷。推理加載保存好的模型對單張圖片做預(yù)測。這套流程幾乎所有 CV 任務(wù)都適用所以只要跑通一次后面遷移到其他項目會快很多。這里有個關(guān)鍵決策用自定義的小型 CNN還是用遷移學(xué)習(xí)加載預(yù)訓(xùn)練模型我的答案是如果你是想學(xué)習(xí)原理兩者都該懂但目標是“零基礎(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ù)準備與預(yù)處理決定模型上限的隱形功臣2.1 數(shù)據(jù)集獲取與目錄規(guī)劃做食物分類最常見的選擇是使用公開的食物數(shù)據(jù)集規(guī)模大的有幾十萬張圖覆蓋多種菜系。但零基礎(chǔ)階段我不建議一上來就搞大的類別多、圖片多訓(xùn)練時間長排查問題也麻煩。我當時的做法是先抽取 10 個類每類幾百張圖一共幾千張用來驗證思路。跑通之后再逐步擴大到完整類別。無論用什么數(shù)據(jù)集目錄規(guī)劃會直接影響后續(xù)代碼的簡潔程度。推薦按下面的結(jié)構(gòu)組織data/ ├── train/ │ ├── burger/ │ │ ├── 001.jpg │ │ └── ... │ ├── pizza/ │ └── ... └── val/ ├── burger/ │ ├── 101.jpg │ └── ... ├── pizza/ └── ...這樣用torchvision.datasets.ImageFolder可以直接讀取類名自動從文件夾名里解析順序按字母排序。千萬別把圖片和標簽放在 Excel 里再手動讀那樣增加一層不必要的復(fù)雜度。下載完數(shù)據(jù)后我強烈建議先隨機抽查一下圖片內(nèi)容確認數(shù)據(jù)和類名是否對得上。食物數(shù)據(jù)集的公共資源也可能存在少量標注錯誤尤其在類間相似度高的時候。這一步只需要打印幾張圖看看成本很低但能避免后面訓(xùn)了半天發(fā)現(xiàn)標簽是亂的。2.2 數(shù)據(jù)增強到底該做哪些先記住一個核心原則訓(xùn)練集要“折騰”驗證集要“規(guī)矩”。訓(xùn)練集的數(shù)據(jù)增強是用來模擬現(xiàn)實中千變?nèi)f化的拍攝條件的。我們拍照時食物可能正放、斜放、大小不一、光線不同如果模型只在干凈的圖片上訓(xùn)練到了真實場景就會很脆弱。常用的增強手段包括隨機縮放裁剪RandomResizedCrop相當于讓模型看不同比例、不同位置的局部內(nèi)容。隨機水平翻轉(zhuǎn)RandomHorizontalFlip讓模型學(xué)會鏡像對稱的食物。隨機旋轉(zhuǎn)RandomRotation應(yīng)對拍攝角度變化。顏色擾動ColorJitter調(diào)整亮度、對比度、飽和度模擬不同光線環(huán)境。不可濫用。如果任務(wù)本身對方向敏感比如識別文字就不要做隨意翻轉(zhuǎn)旋轉(zhuǎn)。食物分類這類任務(wù)方向不會改變類別本質(zhì)做這些增強是安全的。驗證集不需要增強但需要統(tǒng)一尺寸和歸一化。因為驗證集是對模型真實水平的客觀評估增強帶來的隨機性會影響評估的穩(wěn)定性和可復(fù)現(xiàn)性。驗證集的預(yù)處理通常是Resize到較大的尺寸再做CenterCrop剪到模型輸入尺寸。這樣能保證圖片內(nèi)容不因裁剪丟失太多。歸一化是新手最容易忽略的一步。預(yù)訓(xùn)練模型在 ImageNet 上訓(xùn)練時輸入圖片的像素分布有特定均值和標準差。我們用預(yù)訓(xùn)練模型做遷移學(xué)習(xí)輸入也應(yīng)該盡量服從同樣分布否則預(yù)訓(xùn)練特征的優(yōu)勢就大打折扣。標準值就是那組均值[0.485, 0.456, 0.406]標準差[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)練模型的默認輸入是 224×224這個尺寸在計算成本和效果之間比較平衡。2.3 數(shù)據(jù)加載器的配置細節(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ù)加載使用多少個并行進程。設(shè)為 0 的話數(shù)據(jù)加載在主進程中運行簡單但慢設(shè)為 4 或 8 通常能顯著提高吞吐量。不過 Windows 下進程并行需要把訓(xùn)練代碼包在if __name__ __main__:里否則可能報與多進程相關(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名詞很容易勸退。我的建議是先動手跑再回頭拆細節(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)練收斂速度遠不如預(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)整了分類層前面通用的特征可能不完全適配食物這種細粒度任務(wù)。全部微調(diào)所有層的參數(shù)都參與更新模型能更充分地適應(yīng)新數(shù)據(jù)。數(shù)據(jù)量不太少時效果通常更好。缺點是訓(xùn)練時間更長容易過擬合新手需要配合數(shù)據(jù)增強和早停。我的實際經(jīng)驗是如果數(shù)據(jù)集只有幾千張圖類間差異不是特別大先試“只微調(diào)最后一層”把基線跑出來如果準確率不滿意再解凍更多層做全量微調(diào)。對于零基礎(chǔ)入門我更推薦直接全量微調(diào)因為食物分類的細粒度特征確實需要底層特征的參與而且全量微調(diào)在 ResNet18 這種小模型上的訓(xùn)練開銷完全可以接受。3.3 損失函數(shù)和優(yōu)化器選擇分類任務(wù)的默認選擇是nn.CrossEntropyLoss()。這個函數(shù)在 PyTorch 里做了兩件事先對模型輸出做 softmax再計算交叉熵損失。所以你的模型最后一層不要提前做 softmax直接輸出原始 logits 就行。計算損失時傳入模型的預(yù)測 logits 和真實標簽即可。CrossEntropyLoss有幾個好處數(shù)值上比手動 softmax 加 NLL 更穩(wěn)定而且它對類別不平衡有一定容忍度。對于食物分類這種類別相對均衡的任務(wù)基礎(chǔ)版本就夠了。優(yōu)化器的選擇同樣有講究。我最初圖省事用了torch.optim.Adam(model.parameters(), lr0.001)因為 Adam 自適應(yīng)學(xué)習(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ù)也沒問題。更細致的人可以只傳需要更新的參數(shù)列表但對這個小項目來說沒有太大區(qū)別。4. 訓(xùn)練循環(huán)與調(diào)參實戰(zhàn)4.1 標準訓(xùn)練循環(huán)的寫法訓(xùn)練循環(huán)是 PyTorch 項目里最核心、最模式的代碼。一旦你理解了這段循環(huán)以后所有模型都能套用。先明確每個 epoch 需要做的事把訓(xùn)練集所有圖片分成多個 batch逐個 batch 讓模型預(yù)測計算損失反向傳播更新權(quán)重完成整個訓(xù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有幾個細節(jié)新手必須理解model.train()和model.eval()不是擺設(shè)。像 BatchNorm、Dropout 這些層在訓(xùn)練和推理時行為不一樣。訓(xùn)練時 BN 會根據(jù)當前 batch 統(tǒng)計均值方差Dropout 會隨機丟棄神經(jīng)元推理時要用固定的統(tǒng)計量和不丟棄。忘記切換會在驗證階段得到很詭異的結(jié)果。optimizer.zero_grad()一定要在每個 batch 前調(diào)用。PyTorch 的梯度是累積的如果不手動清零上一個 batch 的梯度會疊加到當前 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í)慣保存“驗證集準確率最高”的模型而不是最后一個 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í)率太小適當調(diào)大。固定隨機種子能讓結(jié)果可復(fù)現(xiàn)。在數(shù)據(jù)加載和模型初始化前調(diào)用torch.manual_seed(42)如果用了 GPU 再調(diào)用torch.cuda.manual_seed_all(42)。雖然不能做到嚴格百分之百復(fù)現(xiàn)但能減少很多奇怪的不確定性。監(jiān)控驗證集準確率而不是訓(xùn)練集準確率。訓(xùn)練集準確率 90% 但驗證集只有 60%說明過擬合了這時候不是繼續(xù)訓(xùn)練而是找辦法正則化。訓(xùn)練輪數(shù)不要貪多。使用預(yù)訓(xùn)練模型加數(shù)據(jù)增強10~20 個 epoch 通常就能看到收斂。小數(shù)據(jù)集下跑 50 個 epoch 往往是浪費時間還會增加過擬合風(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 準確率不夠還要看混淆矩陣訓(xùn)練結(jié)束后我們通常先看一個總體準確率。但準確率只能告訴你“模型有多好”不能告訴你“模型在哪里不好”。比如模型把“炸雞”識別成“薯條”和把“壽司”識別成“刺身”這兩類錯誤的含義完全不同?;煜仃嚹芊浅V庇^地展示類別之間的互相混淆。它的每一行代表真實類別每一列代表預(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)整圖片大小類別多就用大一點畫布。如果看到某兩類互相混在一起比如“炸雞”和“炸魚”混淆嚴重說明它們在紋理或顏色上確實接近這時候可以考慮加強數(shù)據(jù)增強中的顏色擾動或者收集更多這類樣本。5.2 從錯誤樣本找出模型短板只看指標永遠不夠把預(yù)測錯誤的圖片真正打開看一眼你會迅速理解模型的困境。我寫了一個小的可視化邏輯遍歷驗證集找出preds ! labels的圖片把原圖、真實標簽、預(yù)測標簽、預(yù)測概率畫在一張圖上。這部分代碼量不大但對判斷問題特別有效??戳隋e誤樣本后常見的發(fā)現(xiàn)有以下幾類數(shù)據(jù)標注錯誤圖片里明明不是那個菜標簽是錯的。這種問題只能靠人工修正。圖片過于相似比如不同菜系的“紅燒肉”外觀很像。這種情況模型表現(xiàn)不佳是可以理解的需要更細的類別定義或更多樣本。圖像質(zhì)量差過暗、過糊、被遮擋?,F(xiàn)實中拍照經(jīng)常這樣可以考慮在訓(xùn)練集加更強的數(shù)據(jù)增強甚至用模糊增強模擬噪點。錯誤樣本分析不是什么高深技術(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)準確率驟降就是因為沒有做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 的形狀和標簽范圍。圖片是 3 通道大小和模型輸入匹配標簽從 0 到 num_classes-1沒有越界。如果標簽不是從 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)練圖片不放增強強制讓它擬合。如果小樣本上 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 雖然默認是 224但用 192 或 160 也能運行。不過輸入越小信息損失越大準確率可能輕微下降不推薦新手一開始就改。驗證和預(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)練準確率很高但驗證集很低這是典型的過擬合信號。訓(xùn)練準確率 95% 以上但驗證集只有 70%說明模型沒有學(xué)到泛化的規(guī)律而是記住了訓(xùn)練集中的細節(jié)或者噪聲。過擬合的應(yīng)對手段有很多我按實用程度排序增加數(shù)據(jù)增強。訓(xùn)練集已有的增強如果不夠“狠”可以加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ù)量越少越不容易記住噪聲。早停。觀察驗證集準確率一旦連續(xù)幾個 epoch 沒有提高就停止訓(xùn)練恢復(fù)之前保存的最佳模型。檢查驗證集是否“臟”。如果你把訓(xùn)練集里的一部分圖片也混進了驗證集模型在驗證集上表現(xiàn)好就是假象。目錄劃分時一定保證類別文件不重疊。還有一個被很多人忽略的問題數(shù)據(jù)增強只有在訓(xùn)練集上做驗證集不要做。如果為了“公平”給驗證集也加了隨機翻轉(zhuǎn)驗證集每次評估結(jié)果都會有波動而且這種波動并不代表模型的真實能力。6.4 可視化中的中文字體亂碼折騰到畫混淆矩陣和錯誤樣本時你大概率會遇到中文字體顯示成方框的情況。這是因為 matplotlib 默認字體不支持中文。最省事的辦法是在繪制圖之前設(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)字體。如果沒有不少人的做法是把所有類別標簽映射成英文拼音或者英文翻譯畫圖時顯示英文。這樣其實更省心因為在命令行和大多數(shù)圖表環(huán)境中英文的兼容性最穩(wěn)定。如果你是在演示項目標簽直接顯示中文當然更友好那就按上面的配置調(diào)字體。6.5 一些容易忽略但很實用的小細節(jié)最后分享幾個我在實際項目中反復(fù)用到、但教程里很少強調(diào)的小細節(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)。計算準確率時outputs.argmax(dim1)出來的結(jié)果和labels的類型要能直接比較。如果labels也是 LongTensor直接用就行如果不放心可以.long()統(tǒng)一一下。對新手來說盡量別在一開始就追求復(fù)雜的分布式訓(xùn)練或混合精度那些花活。先把 CPU/GPU 訓(xùn)練跑穩(wěn)再逐步嘗試優(yōu)化。我在最初做食物分類時連tqdm都不用每次訓(xùn)練只能干等著后來加了進度條那種隨時能看到進度的感覺對保持耐心幫助很大。還有一個小技巧訓(xùn)練時每多少個 step 打印一次 batch 損失不要等一個 epoch 結(jié)束才看。因為 epoch 結(jié)束往往要好幾分鐘中途看了才能及時發(fā)現(xiàn)問題。我習(xí)慣在每 50 或 100 個 iteration 的時候打印一次當前 loss這樣能更早發(fā)現(xiàn)學(xué)習(xí)率是否合適。如果你已經(jīng)跑通了上面的流程恭喜你你已經(jīng)具備了做一個圖像分類項目的基礎(chǔ)能力。接下來可以往兩個方向走一是增加類別數(shù)把模型換成 ResNet50 或 EfficientNet探索更多預(yù)訓(xùn)練模型的效果二是把訓(xùn)練代碼整理成可復(fù)用的模板加入命令行參數(shù)、日志系統(tǒng)、更多評估指標讓它成為一個真正屬于自己的項目框架。食物圖片分類雖然小但模型訓(xùn)練的整套思路在里面是完整的。把它吃透后面再接觸目標檢測、圖像分割這些復(fù)雜任務(wù)時你會發(fā)現(xiàn)自己不是從零開始了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99re思思久久| 99热只有国产在线精品| 五月天六月色| 亚洲日韩人妻操逼| 激情综合在线观看| 91精品综合久久久久久五月丁香| 午夜婷婷五月天| 综合色网站| 久久婷婷内射| 久久婷婷影院| 色五婷婷开心缴| 亚州精品色情无码A片| 大战熟女丰满人妻AV| 天天射色五月天| 五月天大香蕉| 特级操b片| 色999五月色| 丁香五月23111| 毛片九九九九九九| 狠狠色丁香| 色婷婷色五月天| 婷婷五月丁香综合亚洲 | 六月合五月婷| 婷婷五月天激情AV影院| 日本精品。999| 婷婷激情啪啪| 国产精品色情AAAAA片软件| 久久精品性爱| 五月激情久久综合| 国产精品久久99| 亚洲激情四射色| 久久思思热| 亚洲成人网站在线观看| 色婷婷四色| 久久刺激网| 极品少妇XXXX精品少妇偷拍| 超碰三级片| 五月丁香六月婷精品视频| 一区二区你懂的| a网站免费观看| EEUSS鲁片一区二区三区| 日韩成人网站精品久久大全| 夜夜爽天天| 性欧美日本| 狠狠综合久久综合| 亚洲免费电影2| 色色三级视频| 亞洲自怕| 99热热热天天人人人超超碰| 97精品人人A片免费看| 啄木鸟丝袜美女福利视频| 五月天婷婷开心| 思思久久网| 91色色色18| 久久婷婷东京热大香樵| 97欧美在线| 色色丁香色五月| 婷婷情色五月| 色色色香蕉五月婷| 婷婷五月a| 成人在线免费网址| 婷婷五月激情图片| 欧美欧盟性爱网| 黄网网站在线播放| 99热热九九| 丁香综合网| 生活片五区| 91九色丨国产丨爆乳| 狠狠五月激情丁香六月| 亚洲激情电影五月天色婷婷丁香一起草 | 亚洲99精品欧美一区| 欧美视频在线观看噜噜| 日日夜夜狠狠| 天天日天天插| 久热大香蕉| 99性爱| 天天干天天爽| 色婷婷综合在线| 伊人大香久久| 六月丁香啪啪| 99久久er| 乱码操操| 狠狠色噜噜狠狠狠狠狠色综合久久| 嫩草免费视频| 狠狠色婷婷7777久| 五月丁香在线婷婷美女| 大香蕉九九| 乱码操操| 日本A片一区| 久久天堂精品| 日日想日日夜日日操| 丁香五月天啪啪激情综合网| 爱射综合| www.婷婷五月.com| 日本99热| 26uuu亚洲欧美日本| 成人丁香五月| 天天日天天插| 伊人九九综合| 婷婷六月激情啪啪| 亚洲乱码w在线观看| 激情第四色| WWW嗯嗯啊啊啊啊| 日逼影音先锋男人AV资源站| 久热中文字幕| 亚洲精品大片| 国产肥白大熟妇BBBB视频| 婷婷激情六月中文| 五月婷婷性爱| 色久影院| 99热久久日本| www.com操| 日韩aaa| 热久久91| 97AV人人插人人操| 婷婷激情六月综合| 99热国产免费| 91婷婷伊人牛牛| 熟女激情网| 日日操夜夜爽| 中文字幕操比影片| 国产日批视频| 天天插天天插天天插天天插| 天天综合 99久久婷婷| 伊人日日干| www.五月天婷婷| 狠狠精品干练久久久无码中文字幕| 九月丁香久久网| 丁香 婷婷 激情 综合 五月| 日本色99| 婷婷激情六月综合| 99久久这里只有精品| 五月天偷拍| 亚洲AV无码成人精品区电影网| www.五月激情.com| 538在线精品| 日本色99| 丁香六月婷婷久久综合| 亚洲欧美婷婷五月色综合| 天天操天天草天天草天天| AV九九| 99九九热视频| 久草狼人| 久久久99久久| 欧美日韩成人在线| 热九九精品| 日日夜夜干| 色色色综合网| 五月丁花色综合网| 久久久久久久久月丁| 开心婷婷五月激情网小说 | 五月综合激情| 天天操九九插| 伊人高清无码| 97色色色色色| 伊人网啪啪| 99热免| 秋霞AV吧| 五月天网站亭亭| 五月婷婷六月丁香| 丁香六月激| 五月的色婷婷高潮| 玖玖五月| 亚洲热久久| 性爱动图国产麻豆一区二区三区| 丁香五月AV| 亚洲无码成人网| 久久久无码精品成人A片小说| 1024亚洲| 91九色中文字幕女在线观看| 日本色天堂| 色五月婷婷av| 新99思思视频| 深夜婷婷 丁香| 色色亚卅| 五月丁香婷婷激情影院欧美| 开心激情婷婷| 艾小青av| 亚洲99综合| 五月天激情四射| 伊人婷婷大香蕉| 综合99综合久久久久久久| 国产激情在线| 久久免费精彩视频| 天天色天天| 久99视频在线观看| 国精产品一区一区三区免费视频| 操射国产日本| 精品国产人人爱人人| 久久人妻超碰一区| 五月婷在线观看| 能看的AV网站| 久久色五月| 中文中文在线| 国产熟女一区二区三区五月婷| 91亚洲免费片| 五月丁香啪啪啪| 欧美激情综合色综合| 9在线9在线婷婷在线国产| 爱操人妻| 色色色色色色网站| 日本www五月婷婷| 亚洲啪视频| 开心深爱五月天| 久草A片| 综合网五月| 色色色色色色色五月| 色婷五月天| 99爱在线视频| 亚洲情a| 久久色大香蕉| 久久免费操| 草草视频91| 久色网| 国产Va视频| tingtingseav| 香蕉久久国产AV一区二区| 99热国产这里只有| 日韩啪图| 婷婷五月AV| 91精品婷婷国产综合久久| 婷婷丁香五月综合| 播四月婷婷六月丁香| 五月丁香六月婷婷成人| 99热个人在线| 四色永久成人网站| 天天射色五月天| 涩九九九九| 亚洲V国产V欧美V久久久久久| 一级性爱视频| 亚洲婷婷六月天| www.久久久久久| 少妇性BBB搡BBB爽爽爽视頻| 天天摸天天肏| 五月婷婷丁香五月 | 97在线日韩| 97人人操人人爽| 极品五月天| 殴美激情综合网| 日本激情综合| 精品99只有。| 激情丁香婷婷六月天| 精品9l九九九九九77777| 大香网伊人久久综合| 99爱在线视频观看| 色婷婷五月天小说网| 大香蕉五月天婷婷| 97五月久久丁香婷婷| 日韩欧美不卡| 午夜精品人妻无码一区二区三区 | www.激情五月天.com| 色999亚洲人成色| 色婷婷综合视频| 五月天婷五月天综合网在线观| 亚洲无aV在线中文字幕| 五月婷婷亚洲综合在线| 婷婷丁香五月天之开心少妇| 超碰成人公开| 强辱丰满人妻HD中文字幕| AV伊人青草丁香六月| 久操人| 婷婷香草网| 丁香六月激情综合| 五月天婷婷综合网| 天天色天天操天天射| 99久久这里只有精品| 激情网婷婷婷| 五月激情五月婷婷五月天在线| 天天肏屄夜夜爽| 97碰碰视频在线观看免费| 色婷婷啪啪| 亚洲狠狠丁香婷婷香蕉| 99热10在线高清播放| 国产精品18久久久| 国产精品久久久久久久久久 | 国产精品成人AV在线观看春天| 天天干天天操天天拍| 婷婷综合97| 五月亭亭性| 综合激情深爱| 天天天综合网| 91九色视频在线观看| 激情综合五月婷婷六月丁香| 99综合网| 色五月激情网| 丁香五月在线播放| 无码色| 五月丁香啪啪网| 久久亚洲婷婷| 五月激情视频| 欧美性生交A片免费看| 99精品视频在线观看| 婷婷色丁香五月| 中文字幕日韩无码制服诱或| www色中色综合| 天天檫天天爽| 综合色色婷婷| 丁香六月欧美| 成人免费黄色短视频| 嫩草极品| 丁香五月天婷婷91| 久久久五月天| 这里只有国产精品在线| 色色色图| 激情文学久久| 免费无码毛片一区二区A片| 风流少妇A片一区二区蜜桃 | 色九九丁香九月色九九色| 色色综合热| 九九人人看| www.99热在线观看| 六月综和久久| 久久人妻人人| 俺去也五月天| 665566 无码| 色吧99| 卡视频1区2区| 婷婷丁香色五月亚洲| 色天天久婷婷| 俺去也五月天| 色屌丝中文字幕| 欧亚成人A片一区二区| 五月美女婷婷风骚| 丁香婷婷色色| 婷婷丁香成人网址| 久久精品系列| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 欧美色爱五月天| 天天噜| 综合激情五月丁香| wwwav大香蕉| 久久99精品久久久久久青青AR| 狠狠爱婷婷爱| 婷婷五月综合激情小说| 欧美色色色色色色色色色色| 艳妇野外情欲放荡HD| 久热9热| 久久伊人婷婷| 开心五月天激情网站| 99热亚洲| 大香蕉丁香五月| 五月丁香好婷婷A片网| 久久婷婷成人视频| 五月丁香婷婷综合| 精品人妻午夜一区二区三区四区| 丁香狠狠色婷婷| 激情深爱综合| 亚洲人人操| 202丰满熟女妇大| 久久久精品99| 亚洲婷婷丁香五月视频| 超碰亚洲天堂| 五月婷婷www| 激情综合五月激情XXXX| 97九色视频| 少妇人妻丰满做爰XXX| 九草性爱| 中文字幕色色色| 五月天色色网站| 一级韩国产精品毛| 五月丁香六月婷婷免费| 狠狠干在线| 日韩美女在线视频19| 99色看这里只有精品| 天天日日夜夜| 人妻六月天| 亚洲精品操一操、噜一噜、摸一摸、爽 | 久久精品亚洲一级牲爱综合| 色色五月天婷婷| 五月婷婷日| 丁香五月天婷婷久久综合| WWW.婷婷五月天.COM| 亚洲AV在线免费看| 亚色网站小视频| 五月丁香六月色| 久久精彩免费视频| 久久婷婷五月综合色丁香花| Av性爱网站| 99热热这里只精品996小说| 91色性感五月婷婷丁香| 97激情五月天| 中文字幕成人| 99久久免费性爱视频`| 色色com| 五月婷婷久久爱| 天天在线久久综合| 人人摸人人干| 2020久久婷婷五月| 亚洲视频在线观看| 日本va网站| 婷婷五月天伊人网| 97人人草| 五月丁香成人网| 丁香五月日韩| 狠狠色婷婷7777久| 久9视频| 一区二区乱码视频| 久热黄色| 欧美日韩成人在线| 99爱视频精品在线观看| 五月丁香亭亭| AV五月丁香| 五月婷婷激情综合| 成人欧美一区二区三区在线观看| 亚洲妇女熟BBW| 99热这里只有精品手机在线观看| 日本欧美成人片AAAA | 九九激情综合| 女人露出p毛视频www网站| 激情婷婷色色| 五月天合网| 亚洲人人干| 天天操夜夜操| 天天操天天操综合| 91九色白丝| 五月丁香六月婷婷婷婷| 日本久碰| www.yw色| www.婷婷| 国产亚洲精品久久久久久牛牛| 激情六月丁香综合| 国产毛片操B| 五月丁香花开综合网| 伊人久久丁香五月91| 五月婷婷激情综合拍| 婷婷九月丁香中文| 丁香五月激情综合| 5月色婷婷| 无码AV免费精品一区二区三区| 狠色狠色狠色狠色狠色网| 无码成人AAAAA毛片AI换脸| 五月丁香在线国产 | 日韩成人AV在线| 99日韩| 色五月五月婷婷| 色婷婷六月综合| 99精品久| www.99热| 丁香五月婷婷综合网| www.久久99精品| 五月天丁香婷婷社区| 伊九九三级区| 五月四色激情| 九九这里是免费的视频5| 色色激情五月天| 少妇大叫太大太粗太爽了A片 | 五月丁香亭亭激情操逼网| 天天爽免费视频| 在线观看欧美| 精品一二三区久久AAA片| 99亚洲色| 五夜婷婷| 婷婷桃色网| 久久婷婷五月综合色奶水99啪| jiujiu热在线视频| 玖玖@三月天天丁香婷婷| 4399亚洲视频| 婷婷丁香五月噜噜噜| 欧美网站视频4399| 国产成人精品一区二区三区视频 | 五月天另类综合网| 99色日本| 九九亚洲天堂| 香蕉综合在线| 久久这里只有精品视频1| 123草逼网| 日本欧美成人片AAAA| 99热免| 另类天堂| 免费AV在线网址| 五月丁香在线| 五月天婷综合| 亚洲激情综合五月婷婷啪啪| 丁香五月天AV在线| 九九色天堂| 九九色精品| 婷婷五月天六点丁香五月| 九九久久综合| 色色五月激情| 一本色道久久88加勒比| 狠狠狠狠狠狠狠狠| 色色色热热热| 夜夜撸天天日| 亚洲精品乱码久久久久久综合| 精品九九婷婷| 青青草大香| 亚洲激情在线| 精品爆操| 色婷婷激情五月天| 3p日韩网站视频| 欧美色色色色色色色| 精品热青草| 婷婷久久综合久| 九九青草热| 无码人妻一区二区三区免费九色| 色五月xxx| 狠狠干综合网| 五月丁香婷婷婷激情爱爱| 伊人丁香在线| 欧美日韩中文国产一区发布| 偷拍五月丁香| www色色com| 超碰国产AV| 五月深爱激情网| 丁香六月 人妻| 久久伊人大香蕉| 97婷婷狠狠久久综合9色| 亚洲综合色婷| 在线中文AV| 成人无码精品1区2区3区免费看| 庭庭久久内射| 久久最新色| 色五月婷婷在线观看| 五月色婷婷AV| 亚洲中文乱字字幕线在永久| 激情五月婷婷综合网| 久久欧洲久久| 丁香六月婷婷缴情欧美| 九月丁香婷婷综合激情| 成人五月天在线观看| 狼人婷婷综合| 9191avse| 久久伊人大香蕉| 在线另类视频| 丁香五月婷婷啪啪啪| 五月婷婷亚洲| 91九色网| 韩国情人在线电视剧免费观看高清版全集 | 婷婷六月天激情| 青草青青草| 色五开心五月五月深深爱| 国产精品久久久久久五月天加勒比| 丁香五月老师| 大地资源色婷婷视频在线| 五月婷婷免费视频| 色婷婷五月天小说| 五月丁香六月婷婷激情视频在线观看免费 | 噜噜噜精品欧美成人在线观看| 色狠狠综合网| 婷婷五月色網站| 亚洲AV色婷婷人禽五月天| 日本色色色| 久久丁香五月| 99久re热视频精品98| 99色免费观看全部| 丰满人妻一区二区三区| 六月婷婷色色网| 色综合色综合色综合| 一本九九色| 99色在线观看视频| 看婷婷五月天网| 婷婷六月爽| 丁香五月欧美色综合| 久久黄色片| 色婷婷久久| 五月丁香婷婷色色| 亚洲精品又粗又大又爽A片| 色欲一区二区三区精品A片| 天天躁日日躁狠狠躁日日躁2022年5月9日| 欧美日本国产| 日本久久爽| 五月丁香爱婷婷深深| 精品九九视频| 婷婷色婷婷| 色5月婷婷| 性做久久久久久久免费看| 9热在线| 亚洲成人av在线播放| 97AV在线视频| 五月激情基地| 色五月91| 色婷婷五月天av在线| 五月天婷婷久草丁香| 色墦五月丁香| 六月丁香色婷婷| 激情综合网址| 久久婷婷五月天激情新地址| 亚洲黄色精品| 五月丁香九九九综合| 欧美黄色韩日网| 99亚洲精品视频| 精品婷婷丁香五| 大香蕉九操| 五月婷婷黄色视频| 超碰9| 九九99九九精品免费| 色综合色色色色| mmm1717.6dbm人人爱人人操| 激情小说五月天| 欧美电影在线播放| 婷婷五月天激情电影| 天天舔天天| 丁香婷婷色色| 狠狠色噜噜狠狠狠777奇米| 九九色99| 婷婷五月天堂| 99热在线观看| 激情五月天视频| 午夜婷婷五月天| 狠狠干五月天| 天堂爱啪啪| 丁香五月丁香伊人| 色色五月天婷婷| 色综合色综合色综合| 国产乱码久久| www.maotanji.com| 国产综合A片| www.99热最新视频8| 欧美日比视频| 色色网91| 日日做夜夜爱| 少妇真实被内射视频三四区| 九九aV| 亚洲婷婷五月天激情| 欧美成人精品A片免费一区99| 九色七七| 99热66| 97日本操| 丁香伊人综合| 天天干一干| 一逼色综合| 丁香五月天激情综合| 久久5 9视频免费观看| 婷丁五月| 丁香五月偷拍| 日本九九九九| 色综合丁香| 色99无码| 五月婷婷真爱激情网| caop视频| 26uuu欧美亚洲日韩| 五月天综合在线| 99在线69| 婷婷色九月| 九色 在线| 色综合色色| 艹色18p| 日本五月视频| 91re色综合视频| 五月丁香花伦理电影| 久久五月丁香| 第四色色六月色综合| 99九九精品| 欧美影院婷婷| 91久久婷婷| 少妇高潮一区二区三区99欧美| 丁香婷婷色色| 人人综合久| 丁香五月先锋| 中文字幕人妻在线| 啊V视频在线观看| 五月色色网| 色五月首页| 色九九综合| 久久永久网址| 久久99久久99久久99人受| 亚洲国产精品五月天| 五月丁香婷婷啪啪| 色丁香在线视频| 成人.在线日韩| 五月天狠狠干| 九九精品re免费视频| 99re8在这里只有精品| 99资源在线| 天天插天天插| 99综合| 国产成人+综合亚洲+天堂| 99re热精品视频国| 国产真人做爰视频免费| 五区毛片七区毛片| 99er热精品视频| 亚洲网站999| 日本欧美在线| 国产成人精品一区二三区熟女在线| 色欲香综合网| 大香蕉娱乐| 91AV婷婷| 狠狠色性| 久久九九亚洲| 91丨九色丨熟女高潮| 激情婷婷五月亚洲| 午夜成人av在线| 综合久久9| 亚洲色综合| 婷婷五月天激情在线观看| 另类在线免费视频| 影音先锋天天日| 欧美激情丁香五月| 五月天久久色| 另类 在线| 成人操呦av| 国产99久| av网址在线| 婷婷丁香五| 午夜福利8055| 久热婷婷| 狠狠摸狠狠摸| 色之综合网| 艹色18p| 色婷婷狠狠| 偷拍视频五月天| 五月天久久网站| 亚洲综合九九| 婷婷激情视频欧美视频自拍视频欧美剧| 色婷婷六月天| 九九色网专区| 九九久久99| 亚洲激情精品| 亚洲久热| 琪琪色网址| 少妇激情五月婷婷| 日本操片| 精品欧美性爱超级爽| 亚洲综合五月天婷婷丁香| 狠狠干天天内射| 99热超| 丁香五月天欧美| 停停综合色色| 夜夜操加勒比| 国产激情综合五月久久| 战争与艾拉电影免费观看| 婷婷综合五月天| 99久久欧美| 婷婷色六月| 开心激情网五月天| 色五月婷婷大| 五月丁香六月综合情在线观看| 婷婷五月天亚洲综合网| 日韩成人免费电影| 182TV大香蕉| 婷婷五月噜噜| 丁香五月天天日| 99热1| 潮汕成人AV片在线| 精品夜夜澡人妻无码AV| 成人 在线 日韩| 婷婷五月婷| 婷婷一本和五月丁香| 婷婷天堂综合| 色综合色色色色| 丁香六月婷婷操逼网| 五月婷婷之综合激情| 激情综合五| 日日夜夜小色哥| 色婷婷五月丁香在线观看| 天天搡日日搡aaaaⅩ| 91精品视频男人的天堂| 色五月婷婷777| 久久综合婷婷| 99视频在线精品免费观看2| 久久怡红院| 99热这里只有精品在线播放| yazhouzonghesese| 五月婷婷伦理| 日韩色色小视频| 久久女人天堂| 人人九色| 99精品久久久久| 久久九⑨| 另类丁香综合| 五月天婷婷涩涩| 午夜]香婷婷深深爱| 色色欧美。| 9热网站| 五月天开心网| 99热思思| 99热国品| 国产AV一区二区三区最新精品 | 久久综合影院| 99日精品视频| 九九综合色综合| 久久加勒比| 色婷婷激情四射视频| 狠狠色狠狠爱| 亚洲综合一区二区| 欧洲S级在线观看| 97九色视频| 9有码中文| 婷婷久久五月天丁香| 九热免费视频| 五月色网| 激情五月开心五月在线视频| 狠狠色婷婷7| 婷婷九月激情| 能看的AV网站| 日韩十国产极品久久| 日韩欧美一级大黄网站| 五月天开心激情综合网| 停婷丁五月在线| 天天干天天爽| 久久久久婷婷| 日韩无码成人电影| 亚洲最大成人综合网720P| 全部老头和老太XXXXX| 激情五月天。| 九月av在线| 69久久99精品久久久久婷婷| WWW久久久| 天天操天天日天天爱| 亚洲在线激情婷婷五月| 丁香五月丁香伊人| 能直接看的av网站| 亚欧州精品视频| 丁香五月天堂网| 中文字幕精品无码一区二区| 国产九月婷婷| 四月婷婷五月丁香| 丁香婷婷人妻| 黄页大全十八禁| 99精品视频免费| 亚洲网视屏| 五月丁香| 99视频在线看| 97人人操在线| 亚洲色婷婷激情| 涩五月色婷婷| 色综合久久888| 成人免费120分钟啪啪| 日本玖玖在线| 色婷| 久久婷婷五月激情网站| 婷婷五月色播放| 狠狠色婷婷7777久| 精品少妇人妻AV无码专区偷人| 亚洲天堂九九九| 五月丁香啪啪婷婷| 99亚洲大片精品永久在线观看 | 特黄三级又爽又粗又大| 亚卅毛片| 婷婷五月永远18免费久久久| 国产精品久久久海的味道| 9色在线| 九九精品9| 任你爽免费视频| 狠狠久综合| 4399在线日本A片| 色135综合网| 91久久综合亚洲噜噜成人在线 | 久久99热这里只频精品6学生| 91色性感五月婷婷丁香| 色哟哟精品| 三级大香蕉网| 五月色网| 就爱日五月天| 色婷婷五月天中文字幕| 婷婷开心五月| 99免费在线视频| 婷婷va| 操逼福利视频| 中文字幕在线日亚洲9| 丁香五月激情久久麻豆| 激情久久综合| 久久精品性爱| 三级黄色大片视频| 婷婷五月电影院| 丁香六月激情综合啪啪| 天天综合色| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 99A级片| 亚洲天堂色| 久久久久久xxxxx| 五月天停婷基地| 美女婷婷激情亚洲| 九九国产精视频| 亚洲美女网Va| 99热午夜精品| 美妞av| 91九色国产| 综合婷| 激情九九这里只有精品| 久操婷婷| 在线色色| 婷婷六月色| 97色碰碰公开视频| 婷婷字幕在线| 婷婷丁香六月五月天| 色婷久久| 九月婷婷在线观看| www激情网| 噼里啪啦完整版中文在线观看| 色五月色图| 狠狠高潮精品亚洲1| 日韩黄色影院| 亚洲综合丁香五月| 色婷婷香蕉| 91丨九色丨大屁股| 天堂色婷婷| www.99热在线| 婷婷天天婷婷天天澡| 日韩AC在线免费观看| www天天干| 色五月综合| 久久精彩综合视频| 91狠狠综合久久| 色色激情五月| 欧美视频五区| 香焦网五月天| 色色无码| 五月天婷婷色色网| 婷婷的色色五月天| 亚洲色综久久五月| 丁香五月成人网| 影音先锋91男人资源在线播放| 五月丁香花激情综合网| 综合色、色综合| 丁香六月婷婷色XXXX| 八戒青柠影视剧在线观看| 热无码A∨| 国产FREESEXVIDEOS性中国| 国产伦理精品高清在线观看网站一区二区 | 色色色色色色综合| 激情婷婷丁香| 激情综合色婷婷啪啪六月天| 五月婷婷香蕉视频| 五月天婷婷深深爱| 亚洲xx在线| 婷婷色丁香六月| 日韩久久欧亚| 婷婷 伊人 久久| 99超级碰碰| 97色久| 大香蕉啪啪网| 欧美日综合| 九九免费视频在线| 国产性爱在线| 婷婷色狠狠| 嫩草国产| 九月婷婷久久久| 人人爽天天莫| 极品人妻VIDEOSSS人妻| 青青草视频福利| 免费V片在线| 另类视在线| 色啪影院| 另类图片五月天| 中文字幕簧片| 丁香五月婷婷总啪啪| 五月天婷久精视频| AV成人在线播放| 五月丁香久久| 久久与婷婷| 人操综合| 国产精品色色| 丁香五月激情啪啪| 成人午夜视频精品一区| 五月之婷婷| 秋霞日本免费毛片A片| 久久久久久久久久8888| 欧洲亚洲免费视频区| 日韩久久系列| 182TV大香蕉| 思恩热国产视频右线观看| 强辱丰满人妻HD中文字幕| 色色COm| 操B五月天| 少妇AB又爽又紧无码网站 | 电影《战争与艾拉》免费观看| 日韩AV中文在线观看| 婷婷丁香18| 天天狠狠婷婷在线| 综合久久十三| 色婷婷A| 欧美日本韩国亚洲| 可以免费观看的av| 婷婷久久婷婷色五月| 在线看AV| 99自拍视频| 五月天婷婷黄色| 狠狠爱婷婷爱| 亚洲乱码日产精品BD| 99热国产免费| 天天 日综合| 色五月欧美| 国产看真人毛片爱做A片| 亚洲成人噜噜| 久久久精品99亚洲综合| 婷婷性爱五月天丁香网| 亚洲激情在线| 深夜A片| 五月丁香婷婷网网网网| 高清av在线国产| 日韩aaa| 日本婷婷色日| 亚洲性爱干干| 成人永久免费视频在线观看| 婷婷久久综合| 任你操精品免费| 日本熟妇人妻在线| 全高清无码视頻| 99热10在线高清播放| 大香蕉av在线| 九九色热| 襙逼网| 丁香婷婷基地| 婷婷五月丁香性爱| 伊人婷婷五月天| 五月丁香六月激情| 婷婷五月色网| 五月天婷基地| 激情啪啪五月| 九九久久色| 日韩婷婷| 殴美日比视频| 亚洲热视频在线| 久久这里只有精品无码| 天天射影| 激情爱爱网站超大免费| 久久男人网婷婷| 五月天婷婷成人网| 色婷婷狠狠爱| 99综合视频| 伊人五月天婷婷| 婷婷五月天在线观看av| 成人亚洲精品| 99碰| 狠狠色丁香久久综合婷婷亚洲成人福利| 99在线精品视频| 色色五月天激情| 五月天成人综合| 丁香六月婷婷综合在线| 久久久久综合激动五月天| 亚洲久热| 99久在线精品| 蜜臀av粉嫩av懂色av| 殴美97色| 久cao香蕉影院| 精国产品一区二区三区A片| 99热6精品| 91碰| 丁香五月色五月| 欧美五月丁香| 五月婷在线视频免费看| 五月婷AV| 情涩婷婷五月天| 日韩激情人伦人| 色婷婷色五月色丁香| 成人精品视频99在线观看免费 | 五月丁婷香| 久久五月天婷婷| 91欧美日韩综合| 亚洲五月天婷婷| www.射伊蕉婷婷| 伊人9在线| 欧美伊人9| 五月天激情网址| 黄久久久| 亚洲综合一区二区| 91精产品自偷自偷综合| 五月婷婷丁香六月 | yw国产AV| jiujiuxiangjiaowang| 五月综合激情啪啪啪啪啪| 丁香五月婷婷免费视频| 狠狠婷婷综合| 色欲AVV| 99视频日韩| 97在线/日本| 亚洲成人av在线播放| 久婷首页| 9久久久久久久久久久| 久久五月网| 性色人人爽| 婷婷五月天成人娱乐| 丁香丁香激情网| 日本熟女三区| 99 这里只有精品| 色婷婷在线视频综合| 婷婷激情5月| 久久偷拍综合五月天| 激情六月色| 色综合九九| 六月丁香久久| 亚洲亚洲人成综合网络| 日韩在线观看网址| 99九九99九九九视频精品| 久久人操-久草婷婷-成人AV| 99玖玖在线视频| 亚洲综合1024| 开心丁五月| 天天透天天摸天天舔| 色XX综合网| 国产操碰| 五月天成人综合| 婷婷最新地址| 久久99久久久| 丁香五月天啪啪| 婷婷丁香五另类网站| 另类激情网| 久久色五月| 色激情五月天| 影音先锋男士资源网一区| 五月丁香婷婷婷激情爱爱| 日韩成人无码人妻| 婷婷丁香五月天综合网| 99免费视频网| 人人操AV| 成人无码精品1区2区3区免费看| 亚洲无码猫咪| 五月丁香啪啪婷婷| 天天综合天天做天天综合| 久热这里只有精品视频免费观看| 久久婷婷内射| 欧美成人精品A片免费一区99| 激情五月婷婷色综合| 激情图片婷婷| 亚洲婷婷开心五月| 五月婷婷丁香婷婷| 99成人| 日韩人人操| www.丁香五月| 国产高清精品色| 综合AV在线| 天天日中文| 亚洲六月婷婷| 九月色婷婷综合| 天天射美女| 久久久久久久久久久-久五月天婷婷| 99超碰在线免费| 99热这里只有精品在线免费| 婷婷十月激情综合网| 狠狠干五月天婷婷网| 婷婷干五月综合在线播放| 综合色色网| 日本三级第一页| 99精品自拍| 国产精品香蕉| 97干在线视频| 九月丁香欧美综合| 色色影院aaaav| 天天插天天插| 艹B高清无码| 午夜成人AV在线| 国产精品香蕉| 色色婷婷五月| 色色色色色五月丁香| WWW.桔色成人.COM入口| 成人电影在线免费试看| 亚洲综合五月天婷婷| 色香蕉影院| 99色精品| 成熟妇人A片免费看网站 | 91人操| 久热re视频在线观看网站| 激情五月天视频| 在线综合网| 爆乳熟妇一区二区三区四区| 六月色色| 五月天激情婷婷| 热99玖玖99玖玖99九九| 五月婷婷新网站| 99亚洲视频| 97超碰色| 天天爽曰日爽| www.夜夜操.com| 97久人人| 亚洲va在线∨a天堂va欧美va| 无码成人AAAAA毛片AI换脸| 激情五月天视频| 丁香五月开心亚洲| 天堂va久久久噜噜噜久久Va| 亚洲五月天天| 五月激情婷婷在线| 久久新| 激情綜合W W W,激情五月天| 九九成人电影婷婷| 天天草天天爱| 99热综合| 伊人激情| 在线中文字幕视频| 最新日韩久热免费视频看看| 丁香六月婷婷综合在线| 强辱丰满人妻HD中文字幕| 五月天婷婷激情网| 五月丁香综合啪啪| 久久色五月| 国产精品久久久海的味道| 91在线看片| 天天日天天干天天插天天射| 无码色| 欧洲婷婷五月天| 五月色综合| 日本三级韩三级99久久| 4399亚洲视频| 九九综合色综合| 五月丁香在线| 密乳Va| 色爱综合网| 在线视频激情网站| 噜噜吧天天爱| 亚洲精品网址| 国产精品久久久海的味道| 午夜福利8055| 99网| 激情五月综合第一页| 人人操av| 九九人人自拍| 色六月婷婷| 99亚洲欧洲| 熟女婷婷网站一婷婷五月一丁香婷婷一婷婷激情网 | 99国产精品久久久久久久久久久| 五月婷五月婷伊人伊人五月婷| 久热这里只有精品99re| 色婷婷综合网| 日本狠狠干| 丁香五月天色| 国产精产国品一二三在观看| 成人久久天天x资源站| A片试看120分钟做受视频红杏| 色综合久久伊伊婷婷五月| 一级黄在线| 五月婷婷丁香在线视频| 一本狠婷婷综合| 色五月涩涩婷婷| 激情六月婷婷| 精品人妻伦一二三区久久| www。88热在线视频免费观看| 国产美女无遮挡裸体毛片A片| 婷婷丁香一月| 丁香五月 性爱| 激情丁香五月婷婷| 99激情网| 婷婷五月天福利| 天天色天天舔天天爱天天爽| 在线观看视频1区| 99综合| 五月婷婷色影院| 大香蕉久| 天天干天天操天天上| 天天综合色99| 久久作爱| 色必久悠悠影院| 亚洲狠狠终合停停终合| 日日噜狠狠色综合久| 玖玖爱综合网| 能看的av| 婷婷五月天啪啪| 激情综合五| 亚洲精品又粗又大又爽A片| wwwwww.色| 色99热| 成人综合网站| 色婷婷丁香五月综合| 操逼视频一区| 99无码| 六月合五月婷| 婷婷五月综合在线| 成人无码精品1区2区3区免费看| 综合色激情| 婷婷久久大香蕉| AV片一区在线观看| 99啪99| 丁香五月天婷婷久久| 月色色综合婷婷网| XX色综合| 久久九九在线视频| 9久久婷婷国产综合精品性色| 另类小说五月天| 五月婷婷色五月| 中海油常州环保涂料有限公司| 久久9情免费| 久操福利| 能看的AV网站| 99久在线观看| 久久五月婷综合| 久久精典| 亚洲最大五月天成人网|