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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

新年美食鉴赏——基于注意力机制CBAM的美食101分类

發布時間:2023/12/14 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新年美食鉴赏——基于注意力机制CBAM的美食101分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

新年美食鑒賞——基于注意力機制CBAM的美食101分類

  • 一、數據預處理
    • 1.數據集介紹
    • 2.讀取標簽
    • 3.統一命名
    • 4.整理圖片路徑
    • 5.劃分訓練集與驗證集
    • 6.定義美食數據集
  • 二、注意力機制
    • 1.簡介
    • 2.卷積塊注意力網絡——CBAM
      • 通道注意力模塊CAM
      • 空間注意力模塊SAM
    • 3.將通道、空間注意力模塊合并
  • 三、基于卷積塊注意力模塊的ResNet-CBAM
    • 1.代碼實現
    • 2.模型測試
    • 3.查看網絡結構
    • 4.模型訓練
    • 5.模型預測
  • 四、總結與升華
  • 個人簡介

春節是一年當中最隆重、最盛大的節日,吃得最好的一餐可能就是年夜飯了,想想就很激動呢!隨著新節鐘聲的敲響,一年一度的美食斗圖大賽即將上演,快來看看都有啥好吃的!

一、數據預處理

本項目使用的數據集地址:101類美食數據集

# 解壓數據集 !unzip -oq /home/aistudio/data/data70204/images.zip -d food

1.數據集介紹

該數據集包含完整的101種食物。為圖像分析提供比CIFAR10或MNIST更令人興奮的簡單訓練集,因此,數據中包含大量縮小的圖像版本,以便進行快速測試。

101種類別如下所示(索引從0開始):

‘apple_pie’: 0, ‘baby_back_ribs’: 1, ‘baklava’: 2, ‘beef_carpaccio’: 3, ‘beef_tartare’: 4, ‘beet_salad’: 5, ‘beignets’: 6, ‘bibimbap’: 7, ‘bread_pudding’: 8, ‘breakfast_burrito’: 9, ‘bruschetta’: 10,

‘caesar_salad’: 11, ‘cannoli’: 12, ‘caprese_salad’: 13, ‘carrot_cake’: 14, ‘ceviche’: 15, ‘cheesecake’: 16, ‘cheese_plate’: 17, ‘chicken_curry’: 18, ‘chicken_quesadilla’: 19, ‘chicken_wings’: 20,

‘chocolate_cake’: 21, ‘chocolate_mousse’: 22, ‘churros’: 23, ‘clam_chowder’: 24, ‘club_sandwich’: 25, ‘crab_cakes’: 26, ‘creme_brulee’: 27, ‘croque_madame’: 28, ‘cup_cakes’: 29, ‘deviled_eggs’: 30,

‘donuts’: 31, ‘dumplings’: 32, ‘edamame’: 33, ‘eggs_benedict’: 34, ‘escargots’: 35, ‘falafel’: 36, ‘filet_mignon’: 37, ‘fish_and_chips’: 38, ‘foie_gras’: 39, ‘french_fries’: 40,

‘french_onion_soup’: 41, ‘french_toast’: 42, ‘fried_calamari’: 43, ‘fried_rice’: 44, ‘frozen_yogurt’: 45, ‘garlic_bread’: 46, ‘gnocchi’: 47, ‘greek_salad’: 48, ‘grilled_cheese_sandwich’: 49, ‘grilled_salmon’: 50,

‘guacamole’: 51, ‘gyoza’: 52, ‘hamburger’: 53, ‘hot_and_sour_soup’: 54, ‘hot_dog’: 55, ‘huevos_rancheros’: 56, ‘hummus’: 57, ‘ice_cream’: 58, ‘lasagna’: 59, ‘lobster_bisque’: 60,

‘lobster_roll_sandwich’: 61, ‘macaroni_and_cheese’: 62, ‘macarons’: 63, ‘miso_soup’: 64, ‘mussels’: 65, ‘nachos’: 66, ‘omelette’: 67, ‘onion_rings’: 68, ‘oysters’: 69, ‘pad_thai’: 70,

‘paella’: 71, ‘pancakes’: 72, ‘panna_cotta’: 73, ‘peking_duck’: 74, ‘pho’: 75, ‘pizza’: 76, ‘pork_chop’: 77, ‘poutine’: 78, ‘prime_rib’: 79, ‘pulled_pork_sandwich’: 80,

‘ramen’: 81, ‘ravioli’: 82, ‘red_velvet_cake’: 83, ‘risotto’: 84, ‘samosa’: 85, ‘sashimi’: 86, ‘scallops’: 87, ‘seaweed_salad’: 88, ‘shrimp_and_grits’: 89, ‘spaghetti_bolognese’: 90,

‘spaghetti_carbonara’: 91, ‘spring_rolls’: 92, ‘steak’: 93, ‘strawberry_shortcake’: 94, ‘sushi’: 95, ‘tacos’: 96, ‘takoyaki’: 97, ‘tiramisu’: 98, ‘tuna_tartare’: 99, ‘waffles’: 100}



從左至右分別是蜜糖果仁千層酥(2)、披薩(76)、總會三明治(25)

2.讀取標簽

在做分類任務之前,要明確有幾類,因為機器只認識二進制,因此要把每一類(字符串)映射到唯一的一個數字上

txtpath = r"classes.txt" fp = open(txtpath) arr = [] for lines in fp.readlines():# print(lines)lines = lines.replace("\n","")arr.append(lines) # print(arr) fp.close()number = [] for item in range(len(arr)):number.append(item)categorys = dict(zip(arr, number)) print(categorys) {'apple_pie': 0, 'baby_back_ribs': 1, 'baklava': 2, 'beef_carpaccio': 3, 'beef_tartare': 4, 'beet_salad': 5, 'beignets': 6, 'bibimbap': 7, 'bread_pudding': 8, 'breakfast_burrito': 9, 'bruschetta': 10, 'caesar_salad': 11, 'cannoli': 12, 'caprese_salad': 13, 'carrot_cake': 14, 'ceviche': 15, 'cheesecake': 16, 'cheese_plate': 17, 'chicken_curry': 18, 'chicken_quesadilla': 19, 'chicken_wings': 20, 'chocolate_cake': 21, 'chocolate_mousse': 22, 'churros': 23, 'clam_chowder': 24, 'club_sandwich': 25, 'crab_cakes': 26, 'creme_brulee': 27, 'croque_madame': 28, 'cup_cakes': 29, 'deviled_eggs': 30, 'donuts': 31, 'dumplings': 32, 'edamame': 33, 'eggs_benedict': 34, 'escargots': 35, 'falafel': 36, 'filet_mignon': 37, 'fish_and_chips': 38, 'foie_gras': 39, 'french_fries': 40, 'french_onion_soup': 41, 'french_toast': 42, 'fried_calamari': 43, 'fried_rice': 44, 'frozen_yogurt': 45, 'garlic_bread': 46, 'gnocchi': 47, 'greek_salad': 48, 'grilled_cheese_sandwich': 49, 'grilled_salmon': 50, 'guacamole': 51, 'gyoza': 52, 'hamburger': 53, 'hot_and_sour_soup': 54, 'hot_dog': 55, 'huevos_rancheros': 56, 'hummus': 57, 'ice_cream': 58, 'lasagna': 59, 'lobster_bisque': 60, 'lobster_roll_sandwich': 61, 'macaroni_and_cheese': 62, 'macarons': 63, 'miso_soup': 64, 'mussels': 65, 'nachos': 66, 'omelette': 67, 'onion_rings': 68, 'oysters': 69, 'pad_thai': 70, 'paella': 71, 'pancakes': 72, 'panna_cotta': 73, 'peking_duck': 74, 'pho': 75, 'pizza': 76, 'pork_chop': 77, 'poutine': 78, 'prime_rib': 79, 'pulled_pork_sandwich': 80, 'ramen': 81, 'ravioli': 82, 'red_velvet_cake': 83, 'risotto': 84, 'samosa': 85, 'sashimi': 86, 'scallops': 87, 'seaweed_salad': 88, 'shrimp_and_grits': 89, 'spaghetti_bolognese': 90, 'spaghetti_carbonara': 91, 'spring_rolls': 92, 'steak': 93, 'strawberry_shortcake': 94, 'sushi': 95, 'tacos': 96, 'takoyaki': 97, 'tiramisu': 98, 'tuna_tartare': 99, 'waffles': 100}

3.統一命名

統一命名,方便檢查數據集

# 將圖片整理到一個文件夾,并統一命名 import os from PIL import Imagecategorys = arr if not os.path.exists("temporary"):os.mkdir("temporary")for category in categorys:# 圖片文件夾路徑path = r"food/{}/".format(category)count = 0for filename in os.listdir(path):img = Image.open(path + filename)img = img.resize((512, 512),Image.ANTIALIAS) # 轉換圖片,圖像尺寸變為1280*720img = img.convert('RGB') # 保存為.jpg格式才需要img.save(r"temporary/{}{}.jpg".format(category, str(count)))count += 1

4.整理圖片路徑

整理圖片路徑,便于將圖片送入神經網絡

# 獲取圖片路徑與圖片標簽 import os import stringtrain_list = open('train_list.txt',mode='w') paths = r'temporary/' # 返回指定路徑的文件夾名稱 dirs = os.listdir(paths) # 循環遍歷該目錄下的照片 for path in dirs:# 拼接字符串imgPath = paths + pathtrain_list.write(imgPath + '\t')for category in categorys:if category == path.replace(".jpg","").rstrip(string.digits):train_list.write(str(categorys[category]) + '\n') train_list.close()

5.劃分訓練集與驗證集

驗證集用于檢驗模型是否過擬合,這里的劃分標準是5:1,即每5張圖片取1張做驗證數據

# 劃分訓練集和驗證集 import shutiltrain_dir = '/home/aistudio/work/trainImages' eval_dir = '/home/aistudio/work/evalImages' train_list_path = '/home/aistudio/train_list.txt' target_path = "/home/aistudio/"if not os.path.exists(train_dir):os.mkdir(train_dir) if not os.path.exists(eval_dir):os.mkdir(eval_dir) with open(train_list_path, 'r') as f:data = f.readlines()for i in range(len(data)):img_path = data[i].split('\t')[0]class_label = data[i].split('\t')[1][:-1]if i % 5 == 0: # 每5張圖片取一個做驗證數據eval_target_dir = os.path.join(eval_dir, str(class_label)) eval_img_path = os.path.join(target_path, img_path)if not os.path.exists(eval_target_dir):os.mkdir(eval_target_dir) shutil.copy(eval_img_path, eval_target_dir) else:train_target_dir = os.path.join(train_dir, str(class_label)) train_img_path = os.path.join(target_path, img_path) if not os.path.exists(train_target_dir):os.mkdir(train_target_dir)shutil.copy(train_img_path, train_target_dir) print ('劃分訓練集和驗證集完成!') 劃分訓練集和驗證集完成!

6.定義美食數據集

分類任務中有一個非常重要的點就是歸一化處理,通過歸一化處理,將圖片的取值范圍從0~255轉化為0~1之間,這個對于后續的神經網絡有很大的好處,如果不做歸一化,那么神經網絡有可能學不到任何東西,輸出結果全部一樣。

import os import numpy as np import paddle from paddle.io import Dataset from paddle.vision.datasets import DatasetFolder, ImageFolder from paddle.vision.transforms import Compose, Resize, BrightnessTransform, ColorJitter, Normalize, Transposeclass FoodsDataset(Dataset):"""步驟一:繼承paddle.io.Dataset類"""def __init__(self, mode='train'):"""步驟二:實現構造函數,定義數據讀取方式,劃分訓練和測試數據集"""super(FoodsDataset, self).__init__()train_image_dir = '/home/aistudio/work/trainImages'eval_image_dir = '/home/aistudio/work/evalImages'test_image_dir = '/home/aistudio/work/evalImages'transform_train = Compose([Normalize(mean=[127.5, 127.5, 127.5],std=[127.5, 127.5, 127.5],data_format='HWC'), Transpose()])transform_eval = Compose([Normalize(mean=[127.5, 127.5, 127.5],std=[127.5, 127.5, 127.5],data_format='HWC'), Transpose()])train_data_folder = DatasetFolder(train_image_dir, transform=transform_train)eval_data_folder = DatasetFolder(eval_image_dir, transform=transform_eval)test_data_folder = DatasetFolder(test_image_dir)self.mode = modeif self.mode == 'train':self.data = train_data_folderelif self.mode == 'eval':self.data = eval_data_folderelif self.mode == 'test':self.data = test_data_folderdef __getitem__(self, index):"""步驟三:實現__getitem__方法,定義指定index時如何獲取數據,并返回單條數據(訓練數據,對應的標簽)"""data = np.array(self.data[index][0]).astype('float32')if self.mode == 'test':return dataelse:label = np.array([self.data[index][1]]).astype('int64')return data, labeldef __len__(self):"""步驟四:實現__len__方法,返回數據集總數目"""return len(self.data)train_dataset = FoodsDataset(mode='train') val_dataset = FoodsDataset(mode='eval') test_dataset = FoodsDataset(mode='test') # 查看訓練數據,共80800條訓練數據 print(len(train_dataset)) 80800

二、注意力機制

注意力機制(Attention Mechanism)源于對人類視覺的研究。在認知科學中,由于信息處理的瓶頸,人類會選擇性地關注所有信息的一部分,同時忽略其他可見的信息。上述機制通常被稱為注意力機制。人類視網膜不同的部位具有不同程度的信息處理能力,即敏銳度(Acuity),只有視網膜中央凹部位具有最強的敏銳度。為了合理利用有限的視覺信息處理資源,人類需要選擇視覺區域中的特定部分,然后集中關注它。例如,人們在閱讀時,通常只有少量要被讀取的詞會被關注和處理。綜上,注意力機制主要有兩個方面:決定需要關注輸入的哪部分;分配有限的信息處理資源給重要的部分。

1.簡介

人類視覺通過快速掃描全局圖像,獲得需要重點關注的目標區域,也就是一般所說的注意力焦點,而后對這一區域投入更多注意力資源,以獲取更多所需要關注目標的細節信息,而抑制其他無用信息。

這是人類利用有限的注意力資源從大量信息中快速篩選出高價值信息的手段,是人類在長期進化中形成的一種生存機制,人類視覺注意力機制極大地提高了視覺信息處理的效率與準確性。

上面這張圖形象化地展示了人類在看到一副圖像時是如何高效分配有限的注意力資源的,其中紅色區域表明視覺系統更關注的目標,很明顯對于上圖所示的場景,人們會把注意力更多投入到人的臉部,文本的標題以及文章首句等位置。

深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,核心目標也是從眾多信息中選擇出對當前任務目標更關鍵的信息。

2.卷積塊注意力網絡——CBAM

CBAM是Convolutional Block Attention Module的縮寫,即卷積塊注意力網絡。論文地址:https://arxiv.org/abs/1807.06521

卷積塊注意力網絡CBAM 包含2個子模塊:

  • Channel Attention Module(CAM) ——通道注意力模塊
  • Spartial Attention Module(SAM) ——空間注意力模塊

卷積塊注意力模塊CBAM是一種用于前饋卷積神經網絡的簡單而有效的注意力模塊。給定一個中間特征圖,CBAM會沿著兩個獨立的維度(通道和空間)依次推斷注意力圖,然后將注意力圖與輸入特征圖相乘以進行自適應特征細化。由于CBAM是輕量級的通用模塊,因此可以將其無縫集成到任何CNN架構中,而開銷卻可以忽略不計,并且可以與基礎CNN一起進行端到端訓練。

作者通過對ImageNet-1K,MS?COCO檢測和VOC?2007檢測數據集進行了廣泛的實驗來驗證CBAM。實驗表明,使用各種模型在分類和檢測性能方面都有提升,證明了CBAM的廣泛適用性。

通道注意力模塊CAM

通道注意力機制(Channel Attention Module)是將特征圖在空間維度上進行壓縮,得到一個一維矢量后再進行操作。在空間維度上進行壓縮時,不僅考慮到了平均值池化(Average Pooling)還考慮了最大值池化(Max Pooling)。

平均池化和最大池化可用來聚合特征映射的空間信息,送到一個共享網絡,壓縮輸入特征圖的空間維數,逐元素求和合并,以產生通道注意力圖。

單就一張圖來說,通道注意力,關注的是這張圖上哪些內容是有重要作用的。平均值池化對特征圖上的每一個像素點都有反饋,而最大值池化在進行梯度反向傳播計算時,只有特征圖中響應最大的地方有梯度的反饋。

代碼實現CAM:

import paddle import math import paddle.fluid as fluid from paddle import nnclass CAM_Module(nn.Layer): def __init__(self, channels, reduction=16): super(CBAM_Module, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2D(output_size=1) self.max_pool = nn.AdaptiveMaxPool2D(output_size=1) self.fc1 = nn.Conv2D(in_channels=channels, out_channels=channels // reduction, kernel_size=1, padding=0) self.relu = nn.ReLU() self.fc2 = nn.Conv2D(in_channels=channels // reduction, out_channels=channels, kernel_size=1, padding=0) self.sigmoid_channel = nn.Sigmoid() def forward(self, x): # Channel Attention Module module_input = x avg = self.relu(self.fc1(self.avg_pool(x))) avg = self.fc2(avg) mx = self.relu(self.fc1(self.max_pool(x))) mx = self.fc2(mx) x = avg + mx x = self.sigmoid_channel(x) return x

空間注意力模塊SAM

空間注意力機制(Spatial Attention Module)是對通道進行壓縮,在通道維度分別進行了平均值池化和最大值池化。

  • MaxPool的操作就是在通道上提取最大值,提取的次數是高乘以寬;
  • AvgPool的操作就是在通道上提取平均值,提取的次數也是是高乘以寬。

接著將前面所提取到的特征圖(通道數都為1)合并得到一個2通道的特征圖。

代碼實現:

import paddle import math import paddle.fluid as fluid from paddle import nnclass SAM_Module(nn.Layer): def __init__(self, channels, reduction=16): super(CBAM_Module, self).__init__() self.conv_after_concat = nn.Conv2D(in_channels=2, out_channels=1, kernel_size=7, stride=1, padding=3) self.sigmoid_spatial = nn.Sigmoid() def forward(self, x): # Spatial Attention Module x = module_input * x module_input = x avg = paddle.mean(x, axis=1, keepdim=True) mx = paddle.argmax(x, axis=1, keepdim=True)mx = paddle.cast(mx, 'float32')x = paddle.concat([avg, mx], axis=1)x = self.conv_after_concat(x) x = self.sigmoid_spatial(x) x = module_input * x return x

3.將通道、空間注意力模塊合并

將通道、空間注意力模塊合并就可以得到卷積塊注意力模塊CBAM,下面是基于PaddlePaddle的CBAM代碼實現:

import paddle import math import paddle.fluid as fluid from paddle import nnclass CBAM_Module(nn.Layer): def __init__(self, channels, reduction=16): super(CBAM_Module, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2D(output_size=1) self.max_pool = nn.AdaptiveMaxPool2D(output_size=1) self.fc1 = nn.Conv2D(in_channels=channels, out_channels=channels // reduction, kernel_size=1, padding=0) self.relu = nn.ReLU() self.fc2 = nn.Conv2D(in_channels=channels // reduction, out_channels=channels, kernel_size=1, padding=0) self.sigmoid_channel = nn.Sigmoid() self.conv_after_concat = nn.Conv2D(in_channels=2, out_channels=1, kernel_size=7, stride=1, padding=3) self.sigmoid_spatial = nn.Sigmoid() def forward(self, x): # Channel Attention Module module_input = x avg = self.relu(self.fc1(self.avg_pool(x))) avg = self.fc2(avg) mx = self.relu(self.fc1(self.max_pool(x))) mx = self.fc2(mx) x = avg + mx x = self.sigmoid_channel(x) # Spatial Attention Module x = module_input * x module_input = x avg = paddle.mean(x, axis=1, keepdim=True) mx = paddle.argmax(x, axis=1, keepdim=True)mx = paddle.cast(mx, 'float32')x = paddle.concat([avg, mx], axis=1)x = self.conv_after_concat(x) x = self.sigmoid_spatial(x) x = module_input * x return x

三、基于卷積塊注意力模塊的ResNet-CBAM

ResNet論文地址:https://arxiv.org/pdf/1512.03385.pdf

在ResNet中添加通道注意力機制和空間注意力機制,構成ResNet-CBAM。因為不能改變ResNet的網絡結構,所以CBAM不能加在block里面(加進去網絡結構發生了變化,導致不能用預訓練參數)。故將CBAM加在第一層卷積和最后一層卷積不會改變網絡,且可以用預訓練參數。

  • Channel Attention:

  • Spatial Attention

1.代碼實現

import paddle import paddle.nn as nn from paddle.utils.download import get_weights_path_from_url__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152' ]model_urls = {'resnet18': ('https://paddle-hapi.bj.bcebos.com/models/resnet18.pdparams','cf548f46534aa3560945be4b95cd11c4'),'resnet34': ('https://paddle-hapi.bj.bcebos.com/models/resnet34.pdparams','8d2275cf8706028345f78ac0e1d31969'),'resnet50': ('https://paddle-hapi.bj.bcebos.com/models/resnet50.pdparams','ca6f485ee1ab0492d38f323885b0ad80'),'resnet101': ('https://paddle-hapi.bj.bcebos.com/models/resnet101.pdparams','02f35f034ca3858e1e54d4036443c92d'),'resnet152': ('https://paddle-hapi.bj.bcebos.com/models/resnet152.pdparams','7ad16a2f1e7333859ff986138630fd7a'), }class BasicBlock(nn.Layer):expansion = 1def __init__(self,inplanes,planes,stride=1,downsample=None,groups=1,base_width=64,dilation=1,norm_layer=None):super(BasicBlock, self).__init__()if norm_layer is None:norm_layer = nn.BatchNorm2Dif dilation > 1:raise NotImplementedError("Dilation > 1 not supported in BasicBlock")self.conv1 = nn.Conv2D(inplanes, planes, 3, padding=1, stride=stride, bias_attr=False)self.bn1 = norm_layer(planes)self.relu = nn.ReLU()self.conv2 = nn.Conv2D(planes, planes, 3, padding=1, bias_attr=False)self.bn2 = norm_layer(planes)self.downsample = downsampleself.stride = stridedef forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)if self.downsample is not None:identity = self.downsample(x)out += identityout = self.relu(out)return outclass BottleneckBlock(nn.Layer):expansion = 4def __init__(self,inplanes,planes,stride=1,downsample=None,groups=1,base_width=64,dilation=1,norm_layer=None):super(BottleneckBlock, self).__init__()if norm_layer is None:norm_layer = nn.BatchNorm2Dwidth = int(planes * (base_width / 64.)) * groupsself.conv1 = nn.Conv2D(inplanes, width, 1, bias_attr=False)self.bn1 = norm_layer(width)self.conv2 = nn.Conv2D(width,width,3,padding=dilation,stride=stride,groups=groups,dilation=dilation,bias_attr=False)self.bn2 = norm_layer(width)self.conv3 = nn.Conv2D(width, planes * self.expansion, 1, bias_attr=False)self.bn3 = norm_layer(planes * self.expansion)self.relu = nn.ReLU()self.downsample = downsampleself.stride = stridedef forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:identity = self.downsample(x)out += identityout = self.relu(out)return outclass ResNet(nn.Layer):def __init__(self, block, depth, num_classes=1000, with_pool=True):super(ResNet, self).__init__()layer_cfg = {18: [2, 2, 2, 2],34: [3, 4, 6, 3],50: [3, 4, 6, 3],101: [3, 4, 23, 3],152: [3, 8, 36, 3]}layers = layer_cfg[depth]self.num_classes = num_classesself.with_pool = with_poolself._norm_layer = nn.BatchNorm2Dself.inplanes = 64self.dilation = 1self.conv1 = nn.Conv2D(3,self.inplanes,kernel_size=7,stride=2,padding=3,bias_attr=False)self.bn1 = self._norm_layer(self.inplanes)self.relu = nn.ReLU()self.CBAM_Module1 = CBAM_Module(channels=self.inplanes)self.maxpool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1)self.layer1 = self._make_layer(block, 64, layers[0])self.layer2 = self._make_layer(block, 128, layers[1], stride=2)self.layer3 = self._make_layer(block, 256, layers[2], stride=2)self.layer4 = self._make_layer(block, 512, layers[3], stride=2)self.CBAM_Module2 = CBAM_Module(channels=2048)if with_pool:self.avgpool = nn.AdaptiveAvgPool2D((1, 1))if num_classes > 0:self.fc = nn.Linear(512 * block.expansion, num_classes)def _make_layer(self, block, planes, blocks, stride=1, dilate=False):norm_layer = self._norm_layerdownsample = Noneprevious_dilation = self.dilationif dilate:self.dilation *= stridestride = 1if stride != 1 or self.inplanes != planes * block.expansion:downsample = nn.Sequential(nn.Conv2D(self.inplanes,planes * block.expansion,1,stride=stride,bias_attr=False),norm_layer(planes * block.expansion), )layers = []layers.append(block(self.inplanes, planes, stride, downsample, 1, 64,previous_dilation, norm_layer))self.inplanes = planes * block.expansionfor _ in range(1, blocks):layers.append(block(self.inplanes, planes, norm_layer=norm_layer))return nn.Sequential(*layers)def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.CBAM_Module1(x)x = self.maxpool(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.CBAM_Module2(x)if self.with_pool:x = self.avgpool(x)if self.num_classes > 0:x = paddle.flatten(x, 1)x = self.fc(x)return xdef _resnet(arch, Block, depth, pretrained, **kwargs):model = ResNet(Block, depth, **kwargs)if pretrained:assert arch in model_urls, "{} model do not have a pretrained model now, you should set pretrained=False".format(arch)weight_path = get_weights_path_from_url(model_urls[arch][0],model_urls[arch][1])param = paddle.load(weight_path)model.set_dict(param)return modeldef resnet18(pretrained=False, **kwargs):return _resnet('resnet18', BasicBlock, 18, pretrained, **kwargs)def resnet34(pretrained=False, **kwargs):return _resnet('resnet34', BasicBlock, 34, pretrained, **kwargs)def resnet50(pretrained=False, **kwargs):return _resnet('resnet50', BottleneckBlock, 50, pretrained, **kwargs)def resnet101(pretrained=False, **kwargs):return _resnet('resnet101', BottleneckBlock, 101, pretrained, **kwargs)def resnet152(pretrained=False, **kwargs):return _resnet('resnet152', BottleneckBlock, 152, pretrained, **kwargs) model = resnet50(pretrained=True, num_classes=101)

2.模型測試

測試模型是否可以跑通,給定輸入,查看輸出(本項目是101種美食分類,因此輸出維度為 [1, 101] )

x = paddle.rand([1, 3, 512, 512]) out = model(x)print(out) Tensor(shape=[1, 101], dtype=float32, place=CUDAPlace(0), stop_gradient=False,[[ 0.23755740, 0.15992080, -0.16790576, -0.02421574, 0.23948371, 0.01540074, -0.05914545, -0.06471819, -0.15462203, 0.07059185, -0.09104817, -0.08824400, 0.16376866, 0.01088102, -0.01639843, 0.07510512, -0.25128710, 0.05310057, -0.05061390, -0.24302137, 0.24108808, 0.26871991, 0.11471137, -0.10154713, 0.16017962, 0.38808146, 0.39115551, -0.06520218, -0.06546519, -0.04215863, -0.39803913, -0.02926474, -0.21277788, -0.05047140, 0.20483626, -0.00560332, 0.00816562, 0.11082268, -0.02240067, -0.31493288, -0.34661019, -0.15874574, -0.04415106, 0.08496793, -0.14479199, 0.07015306, 0.03542121, -0.06248808, -0.36255446, 0.23171450, 0.01219252, 0.06549657, 0.05162504, 0.02651403, 0.28627244, -0.02422512, 0.09902165, 0.01188086, -0.05695777, -0.01429159, 0.10739808, 0.15823485, 0.08081408, 0.16685896, -0.03923680, -0.25720799, 0.18960142, -0.37058586, -0.15431085, 0.16415425, -0.13622791, -0.04410422, 0.08821643, 0.32092187, -0.00823142, -0.14378656, 0.17974210, 0.18032075, 0.16180043, -0.03393000, 0.01341872, 0.34255776, 0.29252559, -0.11773793, -0.12506239, 0.13361360, -0.41730911, -0.03966195, 0.03181494, 0.16027087, 0.11529364, -0.24660280, -0.11513865, -0.09760797, -0.00116460, 0.17974031, -0.00829839, 0.24515726, -0.09149191, -0.35889381, 0.19253115]])/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/nn/layer/norm.py:636: UserWarning: When training, we now always track global mean and variance."When training, we now always track global mean and variance.")

3.查看網絡結構

import paddlemodel = paddle.Model(model) model.summary((16, 3, 512, 512)) --------------------------------------------------------------------------------Layer (type) Input Shape Output Shape Param # ================================================================================Conv2D-1 [[16, 3, 512, 512]] [16, 64, 256, 256] 9,408 BatchNorm2D-1 [[16, 64, 256, 256]] [16, 64, 256, 256] 256 ReLU-1 [[16, 64, 256, 256]] [16, 64, 256, 256] 0 AdaptiveAvgPool2D-1 [[16, 64, 256, 256]] [16, 64, 1, 1] 0 Conv2D-2 [[16, 64, 1, 1]] [16, 4, 1, 1] 260 ReLU-2 [[16, 4, 1, 1]] [16, 4, 1, 1] 0 Conv2D-3 [[16, 4, 1, 1]] [16, 64, 1, 1] 320 AdaptiveMaxPool2D-1 [[16, 64, 256, 256]] [16, 64, 1, 1] 0 Sigmoid-1 [[16, 64, 1, 1]] [16, 64, 1, 1] 0 Conv2D-4 [[16, 2, 256, 256]] [16, 1, 256, 256] 99 Sigmoid-2 [[16, 1, 256, 256]] [16, 1, 256, 256] 0 CBAM_Module-1 [[16, 64, 256, 256]] [16, 64, 256, 256] 0 MaxPool2D-1 [[16, 64, 256, 256]] [16, 64, 128, 128] 0 Conv2D-6 [[16, 64, 128, 128]] [16, 64, 128, 128] 4,096 BatchNorm2D-3 [[16, 64, 128, 128]] [16, 64, 128, 128] 256 ReLU-3 [[16, 256, 128, 128]] [16, 256, 128, 128] 0 Conv2D-7 [[16, 64, 128, 128]] [16, 64, 128, 128] 36,864 BatchNorm2D-4 [[16, 64, 128, 128]] [16, 64, 128, 128] 256 Conv2D-8 [[16, 64, 128, 128]] [16, 256, 128, 128] 16,384 BatchNorm2D-5 [[16, 256, 128, 128]] [16, 256, 128, 128] 1,024 Conv2D-5 [[16, 64, 128, 128]] [16, 256, 128, 128] 16,384 BatchNorm2D-2 [[16, 256, 128, 128]] [16, 256, 128, 128] 1,024 BottleneckBlock-1 [[16, 64, 128, 128]] [16, 256, 128, 128] 0 Conv2D-9 [[16, 256, 128, 128]] [16, 64, 128, 128] 16,384 BatchNorm2D-6 [[16, 64, 128, 128]] [16, 64, 128, 128] 256 ReLU-4 [[16, 256, 128, 128]] [16, 256, 128, 128] 0 Conv2D-10 [[16, 64, 128, 128]] [16, 64, 128, 128] 36,864 BatchNorm2D-7 [[16, 64, 128, 128]] [16, 64, 128, 128] 256 Conv2D-11 [[16, 64, 128, 128]] [16, 256, 128, 128] 16,384 BatchNorm2D-8 [[16, 256, 128, 128]] [16, 256, 128, 128] 1,024 BottleneckBlock-2 [[16, 256, 128, 128]] [16, 256, 128, 128] 0 Conv2D-12 [[16, 256, 128, 128]] [16, 64, 128, 128] 16,384 BatchNorm2D-9 [[16, 64, 128, 128]] [16, 64, 128, 128] 256 ReLU-5 [[16, 256, 128, 128]] [16, 256, 128, 128] 0 Conv2D-13 [[16, 64, 128, 128]] [16, 64, 128, 128] 36,864 BatchNorm2D-10 [[16, 64, 128, 128]] [16, 64, 128, 128] 256 Conv2D-14 [[16, 64, 128, 128]] [16, 256, 128, 128] 16,384 BatchNorm2D-11 [[16, 256, 128, 128]] [16, 256, 128, 128] 1,024 BottleneckBlock-3 [[16, 256, 128, 128]] [16, 256, 128, 128] 0 Conv2D-16 [[16, 256, 128, 128]] [16, 128, 128, 128] 32,768 BatchNorm2D-13 [[16, 128, 128, 128]] [16, 128, 128, 128] 512 ReLU-6 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-17 [[16, 128, 128, 128]] [16, 128, 64, 64] 147,456 BatchNorm2D-14 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 Conv2D-18 [[16, 128, 64, 64]] [16, 512, 64, 64] 65,536 BatchNorm2D-15 [[16, 512, 64, 64]] [16, 512, 64, 64] 2,048 Conv2D-15 [[16, 256, 128, 128]] [16, 512, 64, 64] 131,072 BatchNorm2D-12 [[16, 512, 64, 64]] [16, 512, 64, 64] 2,048 BottleneckBlock-4 [[16, 256, 128, 128]] [16, 512, 64, 64] 0 Conv2D-19 [[16, 512, 64, 64]] [16, 128, 64, 64] 65,536 BatchNorm2D-16 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 ReLU-7 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-20 [[16, 128, 64, 64]] [16, 128, 64, 64] 147,456 BatchNorm2D-17 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 Conv2D-21 [[16, 128, 64, 64]] [16, 512, 64, 64] 65,536 BatchNorm2D-18 [[16, 512, 64, 64]] [16, 512, 64, 64] 2,048 BottleneckBlock-5 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-22 [[16, 512, 64, 64]] [16, 128, 64, 64] 65,536 BatchNorm2D-19 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 ReLU-8 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-23 [[16, 128, 64, 64]] [16, 128, 64, 64] 147,456 BatchNorm2D-20 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 Conv2D-24 [[16, 128, 64, 64]] [16, 512, 64, 64] 65,536 BatchNorm2D-21 [[16, 512, 64, 64]] [16, 512, 64, 64] 2,048 BottleneckBlock-6 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-25 [[16, 512, 64, 64]] [16, 128, 64, 64] 65,536 BatchNorm2D-22 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 ReLU-9 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-26 [[16, 128, 64, 64]] [16, 128, 64, 64] 147,456 BatchNorm2D-23 [[16, 128, 64, 64]] [16, 128, 64, 64] 512 Conv2D-27 [[16, 128, 64, 64]] [16, 512, 64, 64] 65,536 BatchNorm2D-24 [[16, 512, 64, 64]] [16, 512, 64, 64] 2,048 BottleneckBlock-7 [[16, 512, 64, 64]] [16, 512, 64, 64] 0 Conv2D-29 [[16, 512, 64, 64]] [16, 256, 64, 64] 131,072 BatchNorm2D-26 [[16, 256, 64, 64]] [16, 256, 64, 64] 1,024 ReLU-10 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-30 [[16, 256, 64, 64]] [16, 256, 32, 32] 589,824 BatchNorm2D-27 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 Conv2D-31 [[16, 256, 32, 32]] [16, 1024, 32, 32] 262,144 BatchNorm2D-28 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 Conv2D-28 [[16, 512, 64, 64]] [16, 1024, 32, 32] 524,288 BatchNorm2D-25 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 BottleneckBlock-8 [[16, 512, 64, 64]] [16, 1024, 32, 32] 0 Conv2D-32 [[16, 1024, 32, 32]] [16, 256, 32, 32] 262,144 BatchNorm2D-29 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 ReLU-11 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-33 [[16, 256, 32, 32]] [16, 256, 32, 32] 589,824 BatchNorm2D-30 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 Conv2D-34 [[16, 256, 32, 32]] [16, 1024, 32, 32] 262,144 BatchNorm2D-31 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 BottleneckBlock-9 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-35 [[16, 1024, 32, 32]] [16, 256, 32, 32] 262,144 BatchNorm2D-32 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 ReLU-12 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-36 [[16, 256, 32, 32]] [16, 256, 32, 32] 589,824 BatchNorm2D-33 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 Conv2D-37 [[16, 256, 32, 32]] [16, 1024, 32, 32] 262,144 BatchNorm2D-34 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 BottleneckBlock-10 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-38 [[16, 1024, 32, 32]] [16, 256, 32, 32] 262,144 BatchNorm2D-35 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 ReLU-13 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-39 [[16, 256, 32, 32]] [16, 256, 32, 32] 589,824 BatchNorm2D-36 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 Conv2D-40 [[16, 256, 32, 32]] [16, 1024, 32, 32] 262,144 BatchNorm2D-37 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 BottleneckBlock-11 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-41 [[16, 1024, 32, 32]] [16, 256, 32, 32] 262,144 BatchNorm2D-38 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 ReLU-14 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-42 [[16, 256, 32, 32]] [16, 256, 32, 32] 589,824 BatchNorm2D-39 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 Conv2D-43 [[16, 256, 32, 32]] [16, 1024, 32, 32] 262,144 BatchNorm2D-40 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 BottleneckBlock-12 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-44 [[16, 1024, 32, 32]] [16, 256, 32, 32] 262,144 BatchNorm2D-41 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 ReLU-15 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-45 [[16, 256, 32, 32]] [16, 256, 32, 32] 589,824 BatchNorm2D-42 [[16, 256, 32, 32]] [16, 256, 32, 32] 1,024 Conv2D-46 [[16, 256, 32, 32]] [16, 1024, 32, 32] 262,144 BatchNorm2D-43 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 4,096 BottleneckBlock-13 [[16, 1024, 32, 32]] [16, 1024, 32, 32] 0 Conv2D-48 [[16, 1024, 32, 32]] [16, 512, 32, 32] 524,288 BatchNorm2D-45 [[16, 512, 32, 32]] [16, 512, 32, 32] 2,048 ReLU-16 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 0 Conv2D-49 [[16, 512, 32, 32]] [16, 512, 16, 16] 2,359,296 BatchNorm2D-46 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,048 Conv2D-50 [[16, 512, 16, 16]] [16, 2048, 16, 16] 1,048,576 BatchNorm2D-47 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 8,192 Conv2D-47 [[16, 1024, 32, 32]] [16, 2048, 16, 16] 2,097,152 BatchNorm2D-44 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 8,192 BottleneckBlock-14 [[16, 1024, 32, 32]] [16, 2048, 16, 16] 0 Conv2D-51 [[16, 2048, 16, 16]] [16, 512, 16, 16] 1,048,576 BatchNorm2D-48 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,048 ReLU-17 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 0 Conv2D-52 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,359,296 BatchNorm2D-49 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,048 Conv2D-53 [[16, 512, 16, 16]] [16, 2048, 16, 16] 1,048,576 BatchNorm2D-50 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 8,192 BottleneckBlock-15 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 0 Conv2D-54 [[16, 2048, 16, 16]] [16, 512, 16, 16] 1,048,576 BatchNorm2D-51 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,048 ReLU-18 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 0 Conv2D-55 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,359,296 BatchNorm2D-52 [[16, 512, 16, 16]] [16, 512, 16, 16] 2,048 Conv2D-56 [[16, 512, 16, 16]] [16, 2048, 16, 16] 1,048,576 BatchNorm2D-53 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 8,192 BottleneckBlock-16 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 0 AdaptiveAvgPool2D-2 [[16, 2048, 16, 16]] [16, 2048, 1, 1] 0 Conv2D-57 [[16, 2048, 1, 1]] [16, 128, 1, 1] 262,272 ReLU-19 [[16, 128, 1, 1]] [16, 128, 1, 1] 0 Conv2D-58 [[16, 128, 1, 1]] [16, 2048, 1, 1] 264,192 AdaptiveMaxPool2D-2 [[16, 2048, 16, 16]] [16, 2048, 1, 1] 0 Sigmoid-3 [[16, 2048, 1, 1]] [16, 2048, 1, 1] 0 Conv2D-59 [[16, 2, 16, 16]] [16, 1, 16, 16] 99 Sigmoid-4 [[16, 1, 16, 16]] [16, 1, 16, 16] 0 CBAM_Module-2 [[16, 2048, 16, 16]] [16, 2048, 16, 16] 0 AdaptiveAvgPool2D-3 [[16, 2048, 16, 16]] [16, 2048, 1, 1] 0 Linear-1 [[16, 2048]] [16, 101] 206,949 ================================================================================ Total params: 24,295,343 Trainable params: 24,189,103 Non-trainable params: 106,240 -------------------------------------------------------------------------------- Input size (MB): 48.00 Forward/backward pass size (MB): 22449.39 Params size (MB): 92.68 Estimated Total Size (MB): 22590.07 --------------------------------------------------------------------------------{'total_params': 24295343, 'trainable_params': 24189103}

4.模型訓練

# 調用飛槳框架的VisualDL模塊,保存信息到目錄中。 callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_dir')def create_optim(parameters):step_each_epoch = len(train_dataset) // 32lr = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=0.01,T_max=step_each_epoch * 10)return paddle.optimizer.Momentum(learning_rate=lr,parameters=parameters,weight_decay=paddle.regularizer.L2Decay(0.002))# 模型訓練配置 model.prepare(create_optim(model.parameters()), # 優化器paddle.nn.CrossEntropyLoss(), # 損失函數paddle.metric.Accuracy(topk=(1, 5))) # 評估指標model.fit(train_dataset,val_dataset,epochs=10,shuffle=True, save_dir='./chk_points/',batch_size=32,callbacks=callback,verbose=1) The loss value printed in the log is the current step, and the metric is the average value of previous step. Epoch 1/10/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingreturn (isinstance(seq, collections.Sequence) andstep 2525/2525 [==============================] - loss: 1.6131 - acc_top1: 0.4604 - acc_top5: 0.7048 - 1s/step save checkpoint at /home/aistudio/chk_points/0 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 2.3558 - acc_top1: 0.4844 - acc_top5: 0.7572 - 983ms/step Eval samples: 20200 Epoch 2/10 step 2525/2525 [==============================] - loss: 1.4524 - acc_top1: 0.6161 - acc_top5: 0.8601 - 1s/step save checkpoint at /home/aistudio/chk_points/1 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 2.2584 - acc_top1: 0.5791 - acc_top5: 0.8365 - 1s/step Eval samples: 20200 Epoch 3/10 step 2525/2525 [==============================] - loss: 1.3926 - acc_top1: 0.6323 - acc_top5: 0.8714 - 1s/step save checkpoint at /home/aistudio/chk_points/2 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 2.0664 - acc_top1: 0.4394 - acc_top5: 0.7272 - 966ms/step Eval samples: 20200 Epoch 4/10 step 2525/2525 [==============================] - loss: 0.9868 - acc_top1: 0.6557 - acc_top5: 0.8828 - 1s/step save checkpoint at /home/aistudio/chk_points/3 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 3.4569 - acc_top1: 0.5897 - acc_top5: 0.8445 - 955ms/step Eval samples: 20200 Epoch 5/10 step 2525/2525 [==============================] - loss: 1.4642 - acc_top1: 0.6878 - acc_top5: 0.9018 - 1s/step save checkpoint at /home/aistudio/chk_points/4 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 1.6742 - acc_top1: 0.6254 - acc_top5: 0.8488 - 969ms/step Eval samples: 20200 Epoch 6/10 step 2525/2525 [==============================] - loss: 0.8651 - acc_top1: 0.7369 - acc_top5: 0.9241 - 1s/step save checkpoint at /home/aistudio/chk_points/5 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 1.4554 - acc_top1: 0.6617 - acc_top5: 0.8814 - 965ms/step Eval samples: 20200 Epoch 7/10 step 2525/2525 [==============================] - loss: 0.8263 - acc_top1: 0.7954 - acc_top5: 0.9487 - 1s/step save checkpoint at /home/aistudio/chk_points/6 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 632/632 [==============================] - loss: 1.9954 - acc_top1: 0.7577 - acc_top5: 0.9257 - 951ms/step Eval samples: 20200 Epoch 8/10 step 1730/2525 [===================>..........] - loss: 0.5766 - acc_top1: 0.8649 - acc_top5: 0.9735 - ETA: 17:04 - 1s/ste model.save('infer/foods', training=False) /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/hapi/model.py:1738: UserWarning: 'inputs' was not specified when Model initialization, so the input shape to be saved will be the shape derived from the user's actual inputs. The input shape to be saved is [[32, 3, 512, 512]]. For saving correct input shapes, please provide 'inputs' for Model initialization.% self._input_info[0])

5.模型預測

# 進行預測操作 result = model.predict(val_dataset) Predict begin... step 20200/20200 [==============================] - 42ms/step Predict samples: 20200 from PIL import Image import numpy as np import matplotlib.pyplot as plt# 隨機抽樣展示 indexs = [11, 15, 201, 999, 1000, 5778, 6656, 9199, 10384, 20030]def get_label(predict):label = list(categorys.keys())[list(categorys.values()).index(predict)]return label# 定義畫圖方法 def show_img(img, predict):plt.figure()plt.title('predict: {}'.format(get_label(predict)))img = np.transpose(img, (2,0,1))img = np.transpose(img, (2,0,1))plt.imshow(img, cmap='gray')plt.show()for idx in indexs: t Image import numpy as np import matplotlib.pyplot as plt# 隨機抽樣展示 indexs = [11, 15, 201, 999, 1000, 5778, 6656, 9199, 10384, 20030]def get_label(predict):label = list(categorys.keys())[list(categorys.values()).index(predict)]return label# 定義畫圖方法 def show_img(img, predict):plt.figure()plt.title('predict: {}'.format(get_label(predict)))img = np.transpose(img, (2,0,1))img = np.transpose(img, (2,0,1))plt.imshow(img, cmap='gray')plt.show()for idx in indexs:show_img(val_dataset[idx][0], np.argmax(result[0][idx]))









四、總結與升華

一開始做這個項目的時候,我使用的模型是VGG,我嘗試了VGG-11和VGG-16,但VGG的模型參數太多,訓練較慢且效果不佳,于是我又嘗試了其他網絡,如MobileNetV1、MobileNetV2、ResNet等,但是在訓練過程中,Loss一直停留在4.5左右降不下去,因此我改變思路,決定原有網絡的基礎上進行改進,因此,基于卷積塊注意力模塊的殘差網絡(ResNet-CBAM)由此誕生。

經過多輪調試,我最終選擇了ResNet50-CBAM.在實踐中,我發現網絡并不是越深越好,網絡加深的同時會帶來計算量的增大,無論是訓練還是預測,都會帶來一些不好的影響,所以綜合考慮之后,我選擇在ResNet50的基礎上增加注意力機制,并取得了一定的效果。

個人簡介

北京聯合大學 機器人學院 自動化專業 2018級 本科生 鄭博培

百度飛槳開發者技術專家 PPDE

百度飛槳官方幫幫團、答疑團成員

深圳柴火創客空間 認證會員

百度大腦 智能對話訓練師

我在AI Studio上獲得至尊等級,點亮9個徽章,來互關呀!!!

https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

總結

以上是生活随笔為你收集整理的新年美食鉴赏——基于注意力机制CBAM的美食101分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美日韩国产二区三区 | 在线国产视频 | 九九热久久免费视频 | 国产一区欧美在线 | 日本少妇高清做爰视频 | 国产又粗又猛又爽又黄的视频先 | 久久久精品视频成人 | 免费观看xxxx9999片 | 91av亚洲 | 久久影院午夜论 | 日韩有码欧美 | 欧美福利网站 | 丁香婷婷在线观看 | 黄色大片日本免费大片 | 91在线观看视频网站 | 91福利视频一区 | 操操操人人| 狠狠干综合 | 色播五月激情综合网 | 国产精品自产拍在线观看网站 | 91粉色视频 | 超碰人人av | 亚洲无线视频 | 三级性生活视频 | 欧美日韩国产免费视频 | 在线小视频你懂得 | 99精品视频在线 | 久久免费视频精品 | 手机在线观看国产精品 | 久久综合一本 | 国产一卡久久电影永久 | 免费亚洲婷婷 | 在线免费日韩 | 国产精品手机在线播放 | 国产高清中文字幕 | 日本三级中文字幕在线观看 | 久久久国际精品 | 国产精品免费一区二区三区在线观看 | 国产精品久一 | 黄色中文字幕 | 国产在线观看二区 | 综合色在线 | 九九久久成人 | 久久深夜 | 国产福利一区二区三区在线观看 | 超级碰碰碰视频 | 中文字幕免费在线看 | 99视屏 | 国产精品免费一区二区 | 天天操天天干天天插 | 国产伦精品一区二区三区在线 | 日韩中文字幕电影 | 天天操天天操天天操天天 | 99久久这里只有精品 | 日韩三级av | 午夜在线免费视频 | 国产视频97 | 欧美一级黄色视屏 | 五月天久久久久 | 国产日产精品久久久久快鸭 | 在线日韩视频 | 国产丝袜美腿在线 | 麻豆你懂的 | 一级久久精品 | 狠狠色网 | 伊人狠狠干 | 成人蜜桃 | 最新av中文字幕 | 五月天婷亚洲天综合网精品偷 | 亚洲黄色网络 | 欧美激情h | 在线播放91 | 免费在线观看的av网站 | 亚洲永久精品在线观看 | 97网站| 色综合久| 久久理论影院 | 欧美日韩视频在线观看免费 | 精油按摩av | 成人a v视频| 国产精品私人影院 | 91精品视频观看 | www.色午夜.com | 一级一片免费视频 | 国产成人在线观看免费 | 成人av电影在线观看 | 中文字幕亚洲欧美 | 热精品 | 日本久久免费视频 | 天天撸夜夜操 | 国产精品视频内 | 99综合电影在线视频 | 在线看欧美 | 色婷婷亚洲 | 黄色大片入口 | 91久久国产自产拍夜夜嗨 | 色在线免费视频 | 国产日韩精品视频 | 午夜在线看 | 久久人人97超碰精品888 | 亚洲激情av | 亚洲人视频在线 | 99精品国产福利在线观看免费 | www.久久免费 | www.天天干.com | 高清不卡毛片 | 91麻豆免费版 | 高清精品视频 | 中文字幕永久 | 婷婷精品在线 | 久 久久影院 | 免费欧美| 九九九九九精品 | 久草免费手机视频 | 日韩午夜精品 | a v在线视频 | 免费观看久久 | 婷婷中文字幕 | 日韩专区在线观看 | 成人av在线亚洲 | 午夜91视频| 999热视频 | 久久精品欧美一区二区三区麻豆 | 91桃色在线免费观看 | 日韩电影一区二区在线 | 在线色资源 | 中文字幕中文字幕在线一区 | 久久久免费毛片 | 成人久久久久久久久久 | 亚洲精品乱码久久久久久蜜桃动漫 | 欧美精品在线观看免费 | 欧美日韩精品在线观看视频 | 天天色综合久久 | 亚洲第一中文字幕 | 成人在线视频网 | 99久久婷婷国产一区二区三区 | 欧美一区二区三区在线播放 | 丁香六月天婷婷 | 很黄很色很污的网站 | 欧美在线观看禁18 | 免费在线a| 特黄特色特刺激视频免费播放 | 麻豆传媒视频在线 | 人人狠狠综合久久亚洲 | 黄色成人91 | 久久久久久久99精品免费观看 | 亚洲一区视频在线播放 | 91大神一区二区三区 | 久久视了 | 国产成人在线免费观看 | 在线观看日韩中文字幕 | 国产精品美女久久久久久久久久久 | 97麻豆视频 | 激情视频久久 | 99色在线播放 | 草久在线视频 | av综合站 | 色噜噜在线观看 | 久久天堂影院 | 国产日韩精品在线 | 91成人在线观看高潮 | 在线视频18在线视频4k | 天天射综合网视频 | 成人91在线观看 | 午夜狠狠干| 国产理论一区二区三区 | 免费看成年人 | 久热只有精品 | 日韩黄在线观看 | 不卡av电影在线观看 | 一区二区电影在线观看 | 国产又粗又硬又爽的视频 | 日日夜夜天天久久 | 国产精品va在线观看入 | 国产人成在线视频 | 五月天高清欧美mv | 91久久丝袜国产露脸动漫 | 色com| 成人精品福利 | 精品黄色在线 | 91精品在线观看视频 | 在线播放国产一区二区三区 | 欧美精品三级在线观看 | 天天拍天天操 | 17婷婷久久www | 一区二区三区在线免费观看视频 | 精品免费在线视频 | 免费久久精品视频 | 国产精品久久久久毛片大屁完整版 | 久久久久国产精品视频 | 91成人精品 | 在线视频麻豆 | 国产麻豆精品久久一二三 | 91久久电影| 天天操天天干天天 | 日韩精品欧美专区 | 日韩电影精品 | 九九爱免费视频 | 在线观看视频你懂 | av成人资源| 麻豆视频免费在线 | 精品国产自在精品国产精野外直播 | 亚洲婷婷综合色高清在线 | 久热av| 亚洲成人av片在线观看 | 91资源在线播放 | 亚洲九九九| 91桃色在线免费观看 | av片在线观看免费 | 久久亚洲精品国产亚洲老地址 | 久久这里只精品 | 99免费看片| 色偷偷88888欧美精品久久久 | 搡bbbb搡bbb视频 | 国产在线理论片 | 国产精品自拍av | 在线电影av | 成人av免费播放 | 日韩大片免费在线观看 | 天天干天天干天天操 | 婷婷免费视频 | 久草免费福利在线观看 | 日韩高清国产精品 | 午夜精品久久久久久久99水蜜桃 | 99热九九这里只有精品10 | 2019中文 | 久久视频国产精品免费视频在线 | 日韩理论在线播放 | 亚洲热视频 | 在线成人免费电影 | 国产精品欧美日韩在线观看 | 制服丝袜亚洲 | 日韩网站在线观看 | 亚洲综合在线观看视频 | 亚洲精品网址在线观看 | 国产乱码精品一区二区三区介绍 | 免费看av片网站 | 久久久久久久免费 | 天天做天天爱天天爽综合网 | 欧美久久久久久久久久久 | 99久久精品午夜一区二区小说 | 日本韩国中文字幕 | 国产精品国产亚洲精品看不卡 | a级国产乱理论片在线观看 特级毛片在线观看 | 欧美电影黄色 | 四虎国产精 | 久久兔费看a级 | 992tv在线成人免费观看 | 天堂网av在线 | 亚洲国产高清视频 | 91人人干| 亚洲成人av电影在线 | 9ⅰ精品久久久久久久久中文字幕 | 一级免费黄色 | 久久激情小说 | 久久精品综合网 | 天天综合久久综合 | 国产一区免费观看 | 久久99久久99精品免费看小说 | 午夜国产影院 | 91在线中文字幕 | 91豆花在线 | 午夜在线看 | 国产破处在线播放 | 成人香蕉视频 | 丝袜+亚洲+另类+欧美+变态 | 97av影院 | 成人在线播放免费观看 | 久久免费高清 | 亚洲精品免费观看视频 | 日韩一级电影网站 | 国产色在线视频 | 午夜电影 电影 | av网在线观看 | 久久成人精品电影 | 玖玖爱在线观看 | 视频国产在线观看18 | 日韩一区二区三 | 99精品美女| 亚洲丝袜一区二区 | 91成人在线网站 | 欧美日韩在线精品 | 不卡的av| 国产成人综合图片 | 波多野结衣一区二区三区中文字幕 | 在线观看免费中文字幕 | 99在线热播 | 成人在线视 | 超碰在线最新网址 | 国产 中文 日韩 欧美 | 国产一区二区精品91 | 91在线视频播放 | 亚洲午夜大片 | 亚洲精品视频在线观看免费 | 午夜久久福利影院 | 操操日| 午夜精品三区 | 狠狠狠狠狠狠干 | 亚洲精品乱码久久久久久蜜桃欧美 | 欧美日韩国产精品久久 | 在线看v片成人 | www黄色com | 国产一级不卡毛片 | 成人av免费在线播放 | 免费无遮挡动漫网站 | 免费一级片观看 | 精品一区二区三区久久 | 国产成人av网 | 亚洲区精品视频 | av网站免费看 | 欧美精品久 | 伊人永久 | 精品一二三区 | 国产精品美女久久久久久久久 | 久久综合久久综合这里只有精品 | 香蕉在线视频播放网站 | ww亚洲ww亚在线观看 | 天天插综合 | 精品美女在线视频 | 欧美亚洲免费在线一区 | 天天草天天爽 | 人人射| 国产午夜视频在线观看 | 久草剧场| 国产精品福利无圣光在线一区 | 五月婷婷爱 | 日本精品久久久久影院 | 日韩成人免费在线观看 | 天天综合成人 | 最新成人av | 亚洲黄色免费在线 | 国产一级视频在线免费观看 | 国产午夜视频在线观看 | 国产精品v a免费视频 | 蜜桃av人人夜夜澡人人爽 | 精品国产观看 | 超碰在线cao | 成人在线视频一区 | 国产一级二级视频 | 午夜久久网站 | 国产精品一区二区吃奶在线观看 | 国产精品久久久久毛片大屁完整版 | 日韩免费一区二区在线观看 | 狠狠插天天干 | 日韩网站在线看片你懂的 | 99这里只有精品视频 | 99在线视频观看 | 六月丁香在线视频 | 日韩av电影中文字幕在线观看 | 日韩av一区二区在线播放 | 亚洲天堂精品 | 久草视频在线观 | 亚洲精品网站在线 | 一二三区高清 | 久久久性 | 在线观看成人一级片 | 国产一级在线 | 精品999久久久 | 99热在线免费观看 | 久久久久久久久久久久久久电影 | 日韩精选在线观看 | 狠狠色噜噜狠狠狠狠2021天天 | 日本性生活免费看 | 福利一区视频 | 91香蕉视频污在线 | 黄色av电影在线观看 | 91在线网站| 91传媒视频在线观看 | 国产成人精品一区在线 | 97成人免费视频 | 欧美日韩在线观看不卡 | 天天干天天干 | 天天操天天操一操 | 在线 你懂 | 97视频人人免费看 | 黄色在线网站噜噜噜 | av免费看网站 | 久久免费播放视频 | 婷婷丁香在线 | 日韩欧美视频一区二区三区 | 伊人久久精品久久亚洲一区 | 在线国产一区二区 | 久久99精品久久久久久久久久久久 | 亚洲精品视频大全 | 99热官网 | 成人在线网站观看 | 超碰99在线 | 国产精品自产拍在线观看网站 | 99精品国产99久久久久久福利 | 黄色特一级 | 亚洲涩涩涩 | 中文字幕精品一区二区三区电影 | 久久婷婷激情 | 日日夜夜狠狠干 | a视频免费看 | 国产午夜剧场 | 日本系列中文字幕 | 免费又黄又爽视频 | 91网站在线视频 | 国产精品一区免费观看 | 久久久这里有精品 | 国产精品麻豆免费版 | 日韩va亚洲va欧美va久久 | avav片| 天天爱天天射天天干天天 | av中文天堂| 夜夜操狠狠干 | 中文有码在线视频 | 91视频在线免费 | 一本一本久久a久久精品综合妖精 | 黄色高清视频在线观看 | 久久这里只有精品1 | 在线国产能看的 | 国产91成人 | 久久国语露脸国产精品电影 | 欧美一区二区精品在线 | 一级性视频 | 天天爽夜夜爽人人爽曰av | 国产一区二区不卡在线 | 久久免费视频2 | 国产精品自在线拍国产 | 久久久www成人免费精品张筱雨 | 国产一级电影免费观看 | 久久99久久99久久 | 成年人在线电影 | 国产视频一区二区三区在线 | 日韩欧美在线视频一区二区 | 999热视频 | 在线一区电影 | 日韩专区av| 在线а√天堂中文官网 | 久久深夜福利免费观看 | 久久综合99| 久久久久福利视频 | 亚洲日韩欧美视频 | 国产精品你懂的在线观看 | 亚洲国产精品999 | 狠狠色狠狠色合久久伊人 | 久久久精品久久日韩一区综合 | 插久久 | 免费看污黄网站 | 国产精品99精品 | 国产精久久久久久妇女av | 一区二区三区四区精品视频 | 亚洲成a人片77777潘金莲 | 国产精品福利在线播放 | 亚洲九九 | 黄色免费网站 | 久久久久国产一区二区三区 | 午夜久久精品 | 92中文资源在线 | 精品中文字幕在线 | 成人在线视频论坛 | 亚洲午夜久久久久 | 亚洲综合色婷婷 | 视频在线观看日韩 | 手机看片99| 六月激情久久 | 欧美巨大荫蒂茸毛毛人妖 | 亚洲经典在线 | 欧美视屏一区二区 | 91亚洲精品久久久蜜桃网站 | 9999精品视频 | 国精产品永久999 | 亚洲精品网站在线 | 91久久久国产精品 | 中文字幕av在线 | 麻豆影视在线免费观看 | 日韩精品欧美专区 | 波多野结衣在线视频一区 | 久久国产精品99国产 | 亚洲成av人片 | 午夜精品导航 | 91精品国产综合久久婷婷香蕉 | 91黄色小视频 | 国产精久久久久久久 | 四虎4hu永久免费 | 国产精品不卡在线观看 | 久久国内精品 | 一区二区三区动漫 | 国产亚洲亚洲 | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久久久国产精品免费免费搜索 | 美女性爽视频国产免费app | 国产精品一区二区三区四区在线观看 | 久久精品综合视频 | 99热都是精品 | 久久久免费观看视频 | 国产精品手机在线 | 黄色网址在线播放 | 中文字幕美女免费在线 | 久草视频免费观 | 久久高清精品 | 亚洲永久精品视频 | 亚洲色图激情文学 | 久久精品国产免费观看 | 97夜夜澡人人爽人人免费 | 亚洲日本va在线观看 | 黄色av观看 | 狠狠躁夜夜躁人人爽超碰91 | 欧美午夜视频在线 | av网址在线播放 | 91最新国产 | 天堂网中文在线 | 中文字幕一区在线观看视频 | 综合久久婷婷 | 久久一区二区三区日韩 | 亚洲国产成人在线观看 | 亚洲狠狠| 一区二区视频在线播放 | 91九色精品女同系列 | 日本在线中文在线 | 免费男女羞羞的视频网站中文字幕 | 久久免费电影网 | 一级性av| 国产精品一区二区麻豆 | 亚洲精品国产自产拍在线观看 | 性色在线视频 | 日韩免费不卡av | 亚洲午夜在线视频 | 男女激情免费网站 | 亚洲最大成人网4388xx | 伊人天天狠天天添日日拍 | 成人av一区二区在线观看 | 中国一级片在线 | 久久久久久久久久久久影院 | 日韩在线资源 | 91高清免费看 | 国产精彩视频一区二区 | 亚洲综合视频在线 | 日韩高清片 | 69绿帽绿奴3pvideos| 三级小视频在线观看 | 韩日三级在线 | 久久人人爽人人爽人人片 | 99成人精品 | 免费看成年人 | 日韩免费av在线 | 日韩特黄一级欧美毛片特黄 | 开心激情网五月天 | 欧美动漫一区二区三区 | 高清av免费一区中文字幕 | 免费看精品久久片 | 九九热av | 99c视频高清免费观看 | 亚洲精品中文字幕视频 | 久久久久福利视频 | 久草视频播放 | 狠狠躁日日躁狂躁夜夜躁 | 很黄很污的视频网站 | 久久精品久久精品久久 | 国产精品久久久久久久久久久久午 | 天天干天天射天天操 | 狠狠久久综合 | 91精品老司机久久一区啪 | 国产精品美女久久久久久久久久久 | 97人人人| 狠狠躁夜夜躁人人爽视频 | 91cn国产在线 | 久久久免费播放 | 日韩电影久久 | 中文字幕国产一区 | 久久精品国产免费看久久精品 | 日韩网站在线观看 | 人人爱爱 | 六月丁香激情综合色啪小说 | 91色综合 | 久久久久久久久久久精 | 亚州成人av在线 | 99久久精品国产一区二区三区 | 97视频亚洲 | 色婷婷www| 精品国产诱惑 | 国产 日韩 欧美 中文 在线播放 | 国产精品无 | 超碰国产在线观看 | 美女黄频在线观看 | 91网在线观看 | 成年人黄色免费视频 | 日韩在线首页 | 亚洲二级片 | 日韩理论电影网 | 男女视频久久久 | 日韩精品短视频 | 麻豆一区在线观看 | 国产综合激情 | 丁香婷婷综合激情五月色 | 91人人在线| 一区二区三区观看 | 天天干天天草 | av专区在线 | 国产麻豆剧传媒免费观看 | 成人黄色在线看 | 99re视频在线观看 | 国产一级片久久 | 天天操天天摸天天干 | 亚洲午夜精 | 国产精品久久久久三级 | 狠狠色婷婷丁香六月 | 欧美日高清视频 | 久久久久久久网 | 99色人| 蜜桃麻豆www久久囤产精品 | 制服丝袜天堂 | 在线成人av| 久久视频99 | 亚洲欧美日韩国产一区二区 | 18女毛片| 久久久综合 | 日韩一区二区三区免费电影 | 国产精品九九视频 | 亚洲精品中文在线资源 | 欧美精品一区在线发布 | 五月天综合网站 | 99久久婷婷国产综合亚洲 | 久久久久北条麻妃免费看 | 成人免费 在线播放 | 久久久一本精品99久久精品 | 久久特级毛片 | 狠狠干中文字幕 | 日韩电影在线观看一区二区三区 | 少妇视频在线播放 | 综合精品在线 | 日韩久久视频 | 成人免费在线播放视频 | av一区二区在线观看中文字幕 | 久草a在线| 激情久久综合网 | 亚洲综合五月 | 成人黄色国产 | 在线观看一级 | 超碰在线97免费 | 黄色大片av| 成人在线播放av | 久久激情视频免费观看 | 欧美日本高清视频 | 国产精品成人自产拍在线观看 | 丁香婷婷激情国产高清秒播 | 成人国产精品久久久久久亚洲 | 在线免费黄 | 日本大片免费观看在线 | 丁香av在线 | 九九视频免费观看视频精品 | 日本h视频在线观看 | 日日夜夜综合 | 免费在线观看视频a | 精品美女在线视频 | 日韩欧美在线影院 | 欧美嫩草影院 | 国产一区二区在线免费播放 | 91片黄在线观看 | 黄色三级在线看 | 欧美日韩国产伦理 | 久久久久久国产精品亚洲78 | 97国产小视频 | 一级黄色片在线观看 | 国产在线视频导航 | 色a资源在线 | 精品亚洲视频在线 | 午夜影院在线观看18 | 国产又粗又硬又爽的视频 | 久草在线免费电影 | 91黄色在线视频 | 依人成人综合网 | 青草视频在线播放 | 黄色片视频免费 | 国产精品久久久久久a | 亚洲欧美成人综合 | 美女免费视频一区 | 亚洲精品字幕 | 狠狠狠的干 | 一区二区三区高清在线观看 | 中文字幕免费成人 | 国产99久久久国产精品 | 天天天射 | 国产成人99av超碰超爽 | av解说在线观看 | 欧美激情综合五月 | 成人三级av| 精品国产理论 | 97人人模人人爽人人喊网 | 99久久er热在这里只有精品15 | 人人狠狠综合久久亚洲婷 | 开心婷婷色 | 久久99精品国产99久久 | 久久久久色 | 在线电影日韩 | 日韩电影一区二区在线观看 | 精品三级av | 国产免费黄视频在线观看 | 去干成人网 | 久久不射电影院 | av网站播放 | 久久精品—区二区三区 | 日日添夜夜添 | 国产高清永久免费 | 四虎影视精品成人 | 欧美在线观看视频一区二区三区 | 亚洲综合色播 | 91视频在线看 | 97在线观看免费高清完整版在线观看 | 国产精品久久久久久一区二区 | 国产女v资源在线观看 | 国产精品久久久久久久久久久久午夜片 | 五月婷香| 夜夜爽天天爽 | 中文字幕在线观看视频免费 | 久久久久国产a免费观看rela | 人交video另类hd | 久久国产精品久久w女人spa | 在线观看中文字幕一区二区 | 91大神在线观看视频 | 国产99爱| 波多野结衣一区二区三区中文字幕 | 国产xxxx| 麻豆影视在线免费观看 | 天天艹 | 国产精品久久久久久久久软件 | 免费观看成年人视频 | 黄色片视频免费 | 久久电影中文字幕视频 | 日韩有码中文字幕在线 | 久久综合九色综合97婷婷女人 | 91成人精品一区在线播放 | 天天干 天天摸 天天操 | 久久亚洲在线 | 欧美片一区二区三区 | 黄色免费av | 成人免费网站视频 | 美女精品久久久 | 精品视频资源站 | 亚洲成人av电影在线 | 黄色毛片在线 | 蜜桃av观看 | 国产特级毛片 | 国产在线中文字幕 | 欧美日韩免费一区二区三区 | 国产视频亚洲精品 | 国产一区二区影院 | 在线观看的a站 | 日日射av| 天天人人| 国产精品久久久久久妇 | 国产精品女同一区二区三区久久夜 | 91九色在线视频 | 国产精品乱码久久久久 | 亚州av网站 | 91九色蝌蚪在线 | 69热国产视频 | 五月香视频在线观看 | 91丨九色丨国产女 | 97国产在线观看 | a在线免费观看视频 | 国产理论片在线观看 | 精品国内自产拍在线观看视频 | 亚洲 欧美 精品 | 国产精品久久久久久久久久久不卡 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲资源在线观看 | 92av视频 | 亚洲精品在 | 主播av在线| 亚洲国产中文字幕在线观看 | 国产v亚洲v | 在线播放 日韩专区 | 97超碰资源 | 9999国产精品 | 欧美日韩视频一区二区 | 日本精品一区二区 | 一区二区三区免费在线播放 | 免费色视频 | 高潮久久久久久久久 | 国产伦精品一区二区三区… | 亚洲v欧美v国产v在线观看 | 国产精品理论在线观看 | 狠狠久久伊人 | 欧美精品小视频 | aaa亚洲精品一二三区 | 在线 高清 中文字幕 | 亚洲精品国产精品乱码不99热 | 亚洲精品国精品久久99热一 | 五月综合在线观看 | 欧美国产不卡 | 毛片网站在线观看 | 永久免费毛片在线观看 | 日本xxxxav| 久久久久免费精品国产小说色大师 | 久久天堂亚洲 | 中文资源在线官网 | 日韩成人免费在线观看 | 91热精品 | 日本久久免费视频 | 亚洲电影一区二区 | 久久九九久久 | 国语麻豆| www.伊人网.com| 在线观看视频一区二区 | 国产精品成人免费精品自在线观看 | 亚州人成在线播放 | 91av播放| 碰天天操天天 | 91.dizhi永久地址最新 | 久久精品亚洲精品国产欧美 | a亚洲视频 | 久久综合九色综合网站 | 亚洲激情六月 | 日一日干一干 | 久久av免费电影 | 97偷拍视频 | av电影中文字幕在线观看 | 开心激情综合网 | 91视频一8mav | 免费av电影网站 | 九色91av | 又黄又爽又湿又无遮挡的在线视频 | 久久在线精品视频 | 涩涩网站免费 | 亚洲伊人婷婷 | 久久午夜免费视频 | 中文免费观看 | 国产精品美女在线观看 | 久久99久久99精品免费看小说 | 99精品在线视频播放 | 黄色在线观看网站 | 人人澡人人添人人爽一区二区 | 日日干天天爽 | 99视频在线看 | 黄色免费电影网站 | 日韩精品最新在线观看 | 亚洲自拍av在线 | 91麻豆精品国产91久久久使用方法 | 成人免费一级 | 日韩国产精品一区 | 永久免费观看视频 | 久久97久久97精品免视看 | 一级黄色在线视频 | 久久久国产一区 | 欧美日韩国产精品爽爽 | 久久久久久综合网天天 | www.香蕉视频在线观看 | 99精品在线免费视频 | 亚洲精品网站在线 | 国内久久精品视频 | 国产精品96久久久久久吹潮 | 久久久高清一区二区三区 | 日韩在线电影一区 | 亚洲精品国产麻豆 | 国产精品男女视频 | av免费看在线 | 碰碰影院 | 亚洲一区网站 | 97视频总站 | 日日日操操| 日韩超碰在线 | 色开心| 日韩成人免费观看 | 综合久久久久 | 激情丁香5月 | 麻豆系列在线观看 | 91在线永久 | 久在线观看 | 亚洲a资源 | 国产精品一区二区三区在线播放 | 色5月婷婷 | 欧美日韩中字 | 中文字幕久久久精品 | av中文国产 | 看片网站黄 | 99久久久免费视频 | 久久精品一区八戒影视 | 天天爱天天操 | 欧美日韩国产在线观看 | 91手机在线看片 | 国产精品成人免费 | 在线播放国产一区二区三区 | 国产精品亚洲片夜色在线 | 国产一区二区三区免费观看视频 | 中文字幕日韩一区二区三区不卡 | www久久九| 亚洲国产精品电影在线观看 | 激情伊人| 伊人成人精品 | 日韩精品免费一区二区 | 久久激情日本aⅴ | 久久久电影网站 | 日一日操一操 | 中文字幕日韩伦理 | 久久视频精品在线 | 少妇av片| 99re热精品视频 | 欧美网址在线观看 | 亚洲黄色网络 | 亚洲美女久久 | 日韩网站在线 | 天天干com | 免费一级片在线观看 | 超碰人人草 | 91在线免费观看国产 | 超碰免费97| 国产免费一区二区三区网站免费 | 成年人免费av | 中文字幕免费久久 | 在线观看色网站 | 天天操天天色天天 | 人人爽爽人人 | 天天亚洲 | 国产精品私拍 | 97超碰精品 | 一区二区 不卡 | 久久综合网色—综合色88 | 久草在线视频看看 | 免费亚洲精品视频 | 欧洲精品久久久久毛片完整版 | 99久久久免费视频 | 日韩黄色在线观看 | 日韩无在线 | 精品成人久久 | 在线观看激情av | 国产又粗又猛又爽 | 亚洲视频www| 在线视频中文字幕一区 | 国产高清久久久久 | 国产中文字幕大全 | 最近中文字幕高清字幕在线视频 | 婷婷丁香激情五月 | av字幕在线 | 婷婷中文在线 | 欧美一区三区四区 | 中文字幕在线播放日韩 | 久久99久久99精品免视看婷婷 | 天天操天天舔天天爽 | 99视屏| 国产精品久久久久三级 | 久久激情日本aⅴ | 成人免费视频播放 | 天天干天天操av | 久久成人国产精品免费软件 | 91精品国产高清自在线观看 | 中文亚洲欧美日韩 | 中文字幕av一区二区三区四区 | 欧美激情亚洲综合 | 一本一本久久a久久精品综合 | 免费久久99精品国产 | 欧美另类xxx | 日韩视频精品在线 | 91视频在线看 | 国产一级视频免费看 | 久久人视频 | 黄网站a| 国产 日韩 欧美 中文 在线播放 | 午夜少妇av | 国产一区二区免费看 | 6699私人影院 | 亚洲国产天堂av | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久草www | 日韩欧美视频 | a视频在线播放 | 91看片淫黄大片一级在线观看 | 最新国产在线 | 国产日韩视频在线 | 亚洲资源网 | 国产自偷自拍 | 午夜影视av | 国产精品久久在线观看 | 一二区电影 | 亚洲成aⅴ人在线观看 | 国产999精品久久久影片官网 | 99草视频| 国产在线2020 | 超碰97在线看 | 97国产情侣爱久久免费观看 | 久久草在线精品 | 色综合天天天天做夜夜夜夜做 | 国产精品手机在线 | 国产一级电影免费观看 | 国产三级视频在线 | 亚洲精品资源在线观看 | 91九色视频在线 | 一区二区三区四区五区在线视频 | 国产高清第一页 | 亚洲在线高清 | 国产精品久久影院 | 日韩理论片 | 欧美一区二区精品在线 | 91香蕉国产在线观看软件 | 91亚洲国产成人 | 久久国内精品 | 黄色一及电影 | 成人小视频免费在线观看 | 久久午夜国产 | 精品免费一区 | 99免在线观看免费视频高清 | 日韩黄色免费看 | 手机在线观看国产精品 | 7777xxxx| 亚洲人成在线观看 | 久久99电影|