<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
RepVgg通過結構重引數化讓VGG再次偉大。 所謂“VGG式”指的是:
RepVGG的更深版本達到了84.16%正確率!反超若干transformer!
RepVgg是如何到的呢?簡單地說就是:
我這篇文章主要講解如何使用RepVgg完成影象分類任務,接下來我們一起完成專案的實戰。
通過這篇文章能讓你學到:
使用pip就行,命令:
pip install timm
為了提高成績我在程式碼中加入Cutout和Mixup這兩種增強方式。實現這兩種增強需要安裝torchtoolbox。安裝命令:
pip install torchtoolbox
Cutout實現,在transforms中。
from torchtoolbox.transform import Cutout # 資料預處理 transform = transforms.Compose([ transforms.Resize((224, 224)), Cutout(), transforms.ToTensor(), transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) ])
需要匯入包:from timm.data.mixup import Mixup,
定義Mixup,和SoftTargetCrossEntropy
mixup_fn = Mixup( mixup_alpha=0.8, cutmix_alpha=1.0, cutmix_minmax=None, prob=0.1, switch_prob=0.5, mode='batch', label_smoothing=0.1, num_classes=12) criterion_train = SoftTargetCrossEntropy()
引數詳解:
mixup_alpha (float): mixup alpha 值,如果 > 0,則 mixup 處於活動狀態。
cutmix_alpha (float):cutmix alpha 值,如果 > 0,cutmix 處於活動狀態。
cutmix_minmax (List[float]):cutmix 最小/最大影象比率,cutmix 處於活動狀態,如果不是 None,則使用這個 vs alpha。
如果設定了 cutmix_minmax 則cutmix_alpha 預設為1.0
prob (float): 每批次或元素應用 mixup 或 cutmix 的概率。
switch_prob (float): 當兩者都處於活動狀態時切換cutmix 和mixup 的概率 。
mode (str): 如何應用 mixup/cutmix 引數(每個'batch','pair'(元素對),'elem'(元素)。
correct_lam (bool): 當 cutmix bbox 被影象邊框剪裁時應用。 lambda 校正
label_smoothing (float):將標籤平滑應用於混合目標張量。
num_classes (int): 目標的類數。
EMA(Exponential Moving Average)是指數移動平均值。在深度學習中的做法是儲存歷史的一份引數,在一定訓練階段後,拿歷史的引數給目前學習的引數做一次平滑。具體實現如下:
class EMA(): def __init__(self, model, decay): self.model = model self.decay = decay self.shadow = {} self.backup = {} def register(self): for name, param in self.model.named_parameters(): if param.requires_grad: self.shadow[name] = param.data.clone() def update(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow new_average = (1.0 - self.decay) * param.data + self.decay * self.shadow[name] self.shadow[name] = new_average.clone() def apply_shadow(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow self.backup[name] = param.data param.data = self.shadow[name] def restore(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.backup param.data = self.backup[name] self.backup = {}
加入到模型中。
# 初始化 ema = EMA(model, 0.999) ema.register() # 訓練過程中,更新完引數後,同步update shadow weights def train(): optimizer.step() ema.update() # eval前,apply shadow weights;eval之後,恢復原來模型的引數 def evaluate(): ema.apply_shadow() # evaluate ema.restore()
這個ema最好放在微調的時候使用,否則驗證集不上分,或者上分很慢。
RepVgg_demo ├─data1 │ ├─Black-grass │ ├─Charlock │ ├─Cleavers │ ├─Common Chickweed │ ├─Common wheat │ ├─Fat Hen │ ├─Loose Silky-bent │ ├─Maize │ ├─Scentless Mayweed │ ├─Shepherds Purse │ ├─Small-flowered Cranesbill │ └─Sugar beet ├─models │ ├─__init__.py │ ├─repvgg.py │ └─se_block.py ├─mean_std.py ├─makedata.py ├─ema.py ├─train.py └─test.py
mean_std.py:計算mean和std的值。 makedata.py:生成資料集。 ema.py:EMA指令碼 models資料夾下的repvgg.py和se_block.py:來自官方的pytorch版本的程式碼。 - repvgg.py:網路檔案。 - se_block.py:SE注意力機制。
為了能在DP方式中使用混合精度,還需要在模型的forward函數前增加@autocast()。
為了使模型更加快速的收斂,我們需要計算出mean和std的值,新建mean_std.py,插入程式碼:
from torchvision.datasets import ImageFolder import torch from torchvision import transforms def get_mean_and_std(train_data): train_loader = torch.utils.data.DataLoader( train_data, batch_size=1, shuffle=False, num_workers=0, pin_memory=True) mean = torch.zeros(3) std = torch.zeros(3) for X, _ in train_loader: for d in range(3): mean[d] += X[:, d, :, :].mean() std[d] += X[:, d, :, :].std() mean.div_(len(train_data)) std.div_(len(train_data)) return list(mean.numpy()), list(std.numpy()) if __name__ == '__main__': train_dataset = ImageFolder(root=r'data1', transform=transforms.ToTensor()) print(get_mean_and_std(train_dataset))
資料集結構:
執行結果:
([0.3281186, 0.28937867, 0.20702125], [0.09407319, 0.09732835, 0.106712654])
把這個結果記錄下來,後面要用!
我們整理還的影象分類的資料集結構是這樣的
data ├─Black-grass ├─Charlock ├─Cleavers ├─Common Chickweed ├─Common wheat ├─Fat Hen ├─Loose Silky-bent ├─Maize ├─Scentless Mayweed ├─Shepherds Purse ├─Small-flowered Cranesbill └─Sugar beet
pytorch和keras預設載入方式是ImageNet資料集格式,格式是
├─data │ ├─val │ │ ├─Black-grass │ │ ├─Charlock │ │ ├─Cleavers │ │ ├─Common Chickweed │ │ ├─Common wheat │ │ ├─Fat Hen │ │ ├─Loose Silky-bent │ │ ├─Maize │ │ ├─Scentless Mayweed │ │ ├─Shepherds Purse │ │ ├─Small-flowered Cranesbill │ │ └─Sugar beet │ └─train │ ├─Black-grass │ ├─Charlock │ ├─Cleavers │ ├─Common Chickweed │ ├─Common wheat │ ├─Fat Hen │ ├─Loose Silky-bent │ ├─Maize │ ├─Scentless Mayweed │ ├─Shepherds Purse │ ├─Small-flowered Cranesbill │ └─Sugar beet
新增格式轉化指令碼makedata.py,插入程式碼:
import glob import os import shutil image_list=glob.glob('data1/*/*.png') print(image_list) file_dir='data' if os.path.exists(file_dir): print('true') #os.rmdir(file_dir) shutil.rmtree(file_dir)#刪除再建立 os.makedirs(file_dir) else: os.makedirs(file_dir) from sklearn.model_selection import train_test_split trainval_files, val_files = train_test_split(image_list, test_size=0.3, random_state=42) train_dir='train' val_dir='val' train_root=os.path.join(file_dir,train_dir) val_root=os.path.join(file_dir,val_dir) for file in trainval_files: file_class=file.replace("\","/").split('/')[-2] file_name=file.replace("\","/").split('/')[-1] file_class=os.path.join(train_root,file_class) if not os.path.isdir(file_class): os.makedirs(file_class) shutil.copy(file, file_class + '/' + file_name) for file in val_files: file_class=file.replace("\","/").split('/')[-2] file_name=file.replace("\","/").split('/')[-1] file_class=os.path.join(val_root,file_class) if not os.path.isdir(file_class): os.makedirs(file_class) shutil.copy(file, file_class + '/' + file_name)
完成上面的內容就可以開啟訓練和測試了。
以上就是python人工智慧使用RepVgg實現影象分類範例詳解的詳細內容,更多關於python人工智慧RepVgg影象分類的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45