主頁 >  其他 > Split to Be Slim: 論文復現

Split to Be Slim: 論文復現

2023-04-25 08:16:24 其他

摘要:在本論文中揭示了這樣一種現象:一層內的許多特征圖共享相似但不相同的模式,

本文分享自華為云社區《Split to Be Slim: 論文復現》,作者: 李長安 ,

Split to Be Slim: An Overlooked Redundancy in Vanilla Convolution 論文復現

1、問題切入

已經提出了許多有效的解決方案來減少推理加速模型的冗余,然而,常見的方法主要集中在消除不太重要的過濾器或構建有效的操作,同時忽略特征圖中的模式冗余,

在本論文中揭示了這樣一種現象:一層內的許多特征圖共享相似但不相同的模式,但是,很難確定具有相似模式的特征是否是冗余的或包含基本細節,因此,論文作者不是直接去除不確定的冗余特征,而是提出了一種基于分割的卷積操作,即 SPConv,以容忍具有相似模式但需要較少計算的特征,

具體來說,論文將輸入特征圖分為Representative部分和不Uncertain冗余部分,其中通過相對繁重的計算從代表性部分中提取內在資訊,而對不確定冗余部分中的微小隱藏細節進行一些輕量級處理手術,為了重新校準和融合這兩組處理過的特征,我們提出了一個無引數特征融合模塊,此外,我們的 SPConv 被制定為以即插即用的方式替換 vanilla 卷積,在沒有任何花里胡哨的情況下,基準測驗結果表明,配備 SPConv 的網路在 GPU 上的準確性和推理時間上始終優于最先進的基線,FLOPs 和引數急劇下降,

2、特征冗余問題

然而,如上圖所示,同一層的特征中存在相似模式,也就是說存在特征冗余問題,但同時,并未存在完全相同的兩個通道特征,進而導致無法直接剔除冗余通道特征, 因此,可以選擇一些有代表性的特征圖來補充內在資訊,而剩余的冗余只需要補充微小的不同細節,

3、SPConv詳解

在現有的濾波器中,比如常規卷積、GhostConv、OctConv、HetConv均在所有輸入通道上執行k*k卷積,然而,如上圖所示,同一層的特征中存在相似模式,也就是說存在特征冗余問題,但同時,并未存在完全相同的兩個通道特征,進而導致無法直接剔除冗余通道特征,

受此現象啟發,作者提出將所有輸入特征按比例拆分為兩部分:

  1. Representative部分執行k*k卷積提取重要資訊;
  2. Uncertain部分執行1*1卷積補充隱含細節資訊,

因此該程序可以描述為(見SPConv的左側部分),公式如下圖所示:

3.1 Further Reduction for Reprentative

在將所有輸入通道分成兩個主要部分后,代表部分之間可能存在冗余,換句話說,代表通道可以分為幾個部分,每個部分代表一個主要類別的特征,例如顏色和紋理,因此,我們在代表性通道上采用組卷積以進一步減少冗余,如圖 2 的中間部分所示,我們可以將組卷積視為具有稀疏塊對角卷積核的普通卷積,其中每個塊對應于通道,并且磁區之間沒有連接,這意味著,在組卷積之后,我們進一步減少了代表性部分之間的冗余,同時我們還切斷了可能不可避免地有用的跨通道連接,我們通過在所有代表性通道上添加逐點卷積來彌補這種資訊丟失,與常用的組卷積后點卷積不同,我們在相同的代表性通道上進行 GWC 和 PWC,然后我們通過直接求和來融合這兩個結果特征,因為它們具有相同的通道來源,從而獲得了額外的分數(這里我們將組大小設定為 2),所以方程2的代表部分可以表述為方程3:

3.2 Parameter Free Feature Fusion Module

到目前為止,我們已經將 vanilla 3×3 卷積拆分為兩個操作:對于代表部分,我們進行 3×3 組卷積和 1×1 逐點卷積的直接求和融合,以抵消分組資訊丟失;對于冗余部分,我們應用 1 × 1 內核來補充一些微小的有用細節,結果,我們得到了兩類特征,因為這兩個特征來自不同的輸入通道,所以需要一種融合方法來控制資訊流,與等式 2 的直接求和融合不同,我們為我們的 SP-Conv 設計了一個新穎的特征融合模塊,無需匯入額外的引數,有助于實作更好的性能,如圖 2 右側所示,

3.3 代碼復現

import paddle
import paddle.nn as nn
def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1):
 """3x3 convolution with padding"""
 return nn.Conv2D(in_planes, out_planes, kernel_size=3, stride=stride,
                     padding=dilation, groups=groups, dilation=dilation)
class SPConv_3x3(nn.Layer):
 def __init__(self, inplanes=32, outplanes=32, stride=1, ratio=0.5):
 super(SPConv_3x3, self).__init__()
 self.inplanes_3x3 = int(inplanes*ratio)
 self.inplanes_1x1 = inplanes - self.inplanes_3x3
 self.outplanes_3x3 = int(outplanes*ratio)
 self.outplanes_1x1 = outplanes - self.outplanes_3x3
 self.outplanes = outplanes
 self.stride = stride
 self.gwc = nn.Conv2D(self.inplanes_3x3, self.outplanes, kernel_size=3, stride=self.stride,
                             padding=1, groups=2)
 self.pwc = nn.Conv2D(self.inplanes_3x3, self.outplanes, kernel_size=1)
 self.conv1x1 = nn.Conv2D(self.inplanes_1x1, self.outplanes,kernel_size=1)
 self.avgpool_s2_1 = nn.AvgPool2D(kernel_size=2,stride=2)
 self.avgpool_s2_3 = nn.AvgPool2D(kernel_size=2, stride=2)
 self.avgpool_add_1 = nn.AdaptiveAvgPool2D(1)
 self.avgpool_add_3 = nn.AdaptiveAvgPool2D(1)
        self.bn1 = nn.BatchNorm2D(self.outplanes)
        self.bn2 = nn.BatchNorm2D(self.outplanes)
 self.ratio = ratio
 self.groups = int(1/self.ratio)
 def forward(self, x):
 # print(x.shape)
        b, c, _, _ = x.shape
        x_3x3 = x[:,:int(c*self.ratio),:,:]
        x_1x1 = x[:,int(c*self.ratio):,:,:]
        out_3x3_gwc = self.gwc(x_3x3)
 if self.stride ==2:
            x_3x3 = self.avgpool_s2_3(x_3x3)
        out_3x3_pwc = self.pwc(x_3x3)
        out_3x3 = out_3x3_gwc + out_3x3_pwc
        out_3x3 = self.bn1(out_3x3)
        out_3x3_ratio = self.avgpool_add_3(out_3x3).squeeze(axis=3).squeeze(axis=2)
 # use avgpool first to reduce information lost
 if self.stride == 2:
            x_1x1 = self.avgpool_s2_1(x_1x1)
        out_1x1 = self.conv1x1(x_1x1)
        out_1x1 = self.bn2(out_1x1)
        out_1x1_ratio = self.avgpool_add_1(out_1x1).squeeze(axis=3).squeeze(axis=2)
        out_31_ratio = paddle.stack((out_3x3_ratio, out_1x1_ratio), 2)
        out_31_ratio = nn.Softmax(axis=2)(out_31_ratio)
        out = out_1x1 * (out_31_ratio[:,:,1].reshape([b, self.outplanes, 1, 1]).expand_as(out_1x1))\
 + out_3x3 * (out_31_ratio[:,:,0].reshape([b, self.outplanes, 1, 1]).expand_as(out_3x3))
 return out
# paddle.summary(SPConv_3x3(), (1,32,224,224))
spconv = SPConv_3x3()
tmp = paddle.randn([1, 32, 224, 224])
conv_out1 = spconv(tmp)
print(conv_out1.shape) 
W0724 22:30:03.841145 13041 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1
W0724 22:30:03.845882 13041 gpu_resources.cc:91] device: 0, cuDNN Version: 7.6.
[1, 32, 224, 224]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/nn/layer/norm.py:654: UserWarning: When training, we now always track global mean and variance.
 "When training, we now always track global mean and variance.")

4、消融實驗

為驗證所提方法的有效性,設定SPConv中的卷積核k=3,g=2,同時整個網路設定統一的全域超引數(不同階段設定不同的會更優,但會過于精細),

在小尺度資料集Cifar10、resnet18網路進行對比分析,為公平對比,所有實驗均在含1個NVIDIA Tesla V100GPU的服務器上從頭開始訓練,且采用默認的資料增廣與訓練策略,不包含其他額外Tricks,

import paddle
from paddle.metric import Accuracy
from paddle.vision.transforms import Compose, Normalize, Resize, Transpose, ToTensor
from sp_resnet import resnet18_sp
callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_res_sp')
normalize = Normalize(mean=[0.5, 0.5, 0.5],
                    std=[0.5, 0.5, 0.5],
 data_format='HWC')
transform = Compose([ToTensor(), Normalize(), Resize(size=(224,224))])
cifar10_train = paddle.vision.datasets.Cifar10(mode='train',
                                               transform=transform)
cifar10_test = paddle.vision.datasets.Cifar10(mode='test',
                                              transform=transform)
# 構建訓練集資料加載器
train_loader = paddle.io.DataLoader(cifar10_train, batch_size=128, shuffle=True, drop_last=True)
# 構建測驗集資料加載器
test_loader = paddle.io.DataLoader(cifar10_test, batch_size=128, shuffle=True, drop_last=True)
res_sp = paddle.Model(resnet18_sp(num_classes=10))
optim = paddle.optimizer.Adam(learning_rate=3e-4, parameters=res_sp.parameters())
res_sp.prepare(
 optim,
 paddle.nn.CrossEntropyLoss(),
 Accuracy()
 )
res_sp.fit(train_data=train_loader,
 eval_data=test_loader,
        epochs=10,
        callbacks=callback,
        verbose=1
 )
import paddle
from paddle.metric import Accuracy
from paddle.vision.transforms import Compose, Normalize, Resize, Transpose, ToTensor
from paddle.vision.models import resnet18
callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_res_18')
normalize = Normalize(mean=[0.5, 0.5, 0.5],
                    std=[0.5, 0.5, 0.5],
 data_format='HWC')
transform = Compose([ToTensor(), Normalize(), Resize(size=(224,224))])
cifar10_train = paddle.vision.datasets.Cifar10(mode='train',
                                               transform=transform)
cifar10_test = paddle.vision.datasets.Cifar10(mode='test',
                                              transform=transform)
# 構建訓練集資料加載器
train_loader = paddle.io.DataLoader(cifar10_train, batch_size=128, shuffle=True, drop_last=True)
# 構建測驗集資料加載器
test_loader = paddle.io.DataLoader(cifar10_test, batch_size=128, shuffle=True, drop_last=True)
res_18 = paddle.Model(resnet18(num_classes=10))
optim = paddle.optimizer.Adam(learning_rate=3e-4, parameters=res_18.parameters())
res_18.prepare(
 optim,
 paddle.nn.CrossEntropyLoss(),
 Accuracy()
 )
res_18.fit(train_data=train_loader,
 eval_data=test_loader,
        epochs=10,
        callbacks=callback,
        verbose=1
 )

5、實驗結果分析

最后,我們再來看一下消融實驗結果,見下圖,可以看到:

  • 添加了SPConV模塊的ResNet18效果反而不如原始的ResNet18

在原作中,作者給出了ResNet20、VGG16在資料集Cifar10上的對比結果,原因也可能在于本實驗中模型迭代次數不夠,但是相比來看,特征圖在進行了去冗余操作之后(類似于剪枝),精度下降似乎是正確的,

6、總結

在該文中,作者重新對常規卷積中的資訊冗余問題進行了重思考,為緩解該問題,作者提出了一種新穎的SPConv,它將輸入特征拆分為兩組不同特征并進行不同的處理,最后采用簡化版SK進行融合,最后作者通過充分的實驗分析說明了所提方法的有效性,在具有更高精度的時候具有更快的推理速度、更少的FLOPs與引數量,

所提SPConv是一種“即插即用”型單元,它可以輕易與其他網路架構相結合,同時與當前主流模型壓縮方法互補,如能精心組合設計,有可能得到更輕量型的模型,

7、參考資料

即插即用!北郵&南開大學開源SPConv:精度更高、速度更快的卷積

Split to Be Slim: An Overlooked Redundancy in Vanilla Convolution

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551085.html

標籤:其他

上一篇:chatgpt~插件介紹

下一篇:返回列表

標籤雲
其他(158019) Python(38099) JavaScript(25390) Java(17999) C(15217) 區塊鏈(8260) C#(7972) AI(7469) 爪哇(7425) MySQL(7140) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5328) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4559) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2430) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1960) Web開發(1951) HtmlCss(1923) python-3.x(1918) 弹簧靴(1913) C++(1911) xml(1889) PostgreSQL(1873) .NETCore(1855) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • Split to Be Slim: 論文復現

    摘要:在本論文中揭示了這樣一種現象:一層內的許多特征圖共享相似但不相同的模式。 本文分享自華為云社區《Split to Be Slim: 論文復現》,作者: 李長安 。 Split to Be Slim: An Overlooked Redundancy in Vanilla Convolution ......

    uj5u.com 2023-04-25 08:16:24 more
  • chatgpt~插件介紹

    我們開發人員不要對人工智能,gpt有敵意,極快擁抱它,就像20年前擁抱互聯網、10年前擁抱移動互聯網是一樣的,本次作為開篇,介紹幾個IDE里常用的插件。 github copilot copilot labs tablnine github copilot智能編輯助手 GitHub Copilot是 ......

    uj5u.com 2023-04-25 08:15:54 more
  • 掌握動態規劃,從“什么問題適合用”及“解題思路”入手

    摘要:一般是用動態規劃來解決最優問題。 本文分享自華為云社區《深入淺出動態規劃演算法(中)》,作者:嵌入式視覺 。 一,“一個模型三個特征”理論講解 一個模型指的是適合用動態規劃演算法解決的問題的模型,這個模型也被定義為“多階段決策最優解模型”。具體解釋如下: 一般是用動態規劃來解決最優問題。而解決問題 ......

    uj5u.com 2023-04-25 08:15:41 more
  • AI降臨,前端啟用面壁計劃

    作者:京東零售 鄭炳懿 開篇: “在我們有生之年,你覺得會看到AI兵臨城下的那一天嗎?就像電影黑客帝國里面演的一樣”,Barry從紅色的煙盒里取出一根煙發問道。 “不可能!我覺得AI再強,那也是人類發明的,電影過分魔幻化了,”Woody深吸了一口煙,吐著煙圈道。 “有生之年是夠嗆了,我們這一代估計是 ......

    uj5u.com 2023-04-25 08:15:07 more
  • 云原生周刊:2023 年 Java 開發人員可以學習的 25 大技術技能

    文章推薦 2023 年 Java 開發人員可以學習的 25 大技術技能 這篇文章為 Java 開發人員提供了 2023 年需要學習的一些重要技能,這些技能涵蓋了現代 Java 開發、大資料和人工智能、安全性、分布式系統和區塊鏈、以及其他領域。Java 開發人員應該根據自己的需求和職業規劃,選擇適合自 ......

    uj5u.com 2023-04-25 08:14:39 more
  • ES的索引結構與演算法決議

    作為搜索引擎的一部分,ES自然具有速度快、結果準確、結果豐富等特點,那么ES是如何達到“搜索引擎”級別的查詢效率呢?首先是索引,其次是壓縮演算法,接下來我們就一起了解下ES的索引結構和壓縮演算法 ......

    uj5u.com 2023-04-25 08:14:34 more
  • S3 物件重命名

    本文所述操作適用于兼容 S3 協議的所有存盤框架,包括 AWS S3、Aliyun OSS、MinIO、Ceph 等。 不知為何,截止目前,S3 協議并不包含物件重命名的介面。如果有重命名物件的需求,一般能想到的就是重新上傳改名之后的物件,然后從存盤桶中將原名物件洗掉。很明顯,這種方式好比大炮打蚊子 ......

    uj5u.com 2023-04-25 08:14:29 more
  • 【Lua】VSCode 搭建 Lua 開發環境

    前言 最近在找作業,基本所有的崗位都會問到 Lua(甚至拼 UI 的都要求會 Lua),咱能怎么辦呢,咱也只能學啊…… 工欲善其事,必先利其器。第一步,先來把環境配置好吧! 當前適用版本: LuaBinaries 版本:5.4.2 VSCode 版本:1.77.3 文章最近更新日期:2023.04. ......

    uj5u.com 2023-04-25 08:13:58 more
  • UNITY_Z_0_FAR_FROM_CLIPSPACE的作用

    在一個開了深度霧,平面和天空盒由頭攝像機渲染,而材質球由正交相機渲染的場景下,調節正交相機的近裁剪面為負時,會出現材質球突變成霧的顏色的bug。 需要把URP原始碼中的 #define _FOG_FRAGMENT 1 注釋掉 一般來說,連續調節某個數值,變化也應當是連續的,而霧出現這種情況必然有哪個地 ......

    uj5u.com 2023-04-25 08:08:32 more
  • 第14屆藍橋杯C++B組省賽題解(A-J)(更新完畢)

    A. 日期統計 題目內容 小藍現在有一個長度為 $100$ 的陣列,陣列中的每個元素的值都在 $0$ 到 $9$ 的范圍之內。 陣列中的元素從左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 ......

    uj5u.com 2023-04-25 08:08:16 more