<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)踐教程 | 面向小白的ResNet50復(fù)現(xiàn)筆記!

          共 5060字,需瀏覽 11分鐘

           ·

          2021-09-03 06:52

          ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺(tái)

          作者 | 小馬
          來源 | FightingCV
          編輯 | 極市平臺(tái)

          極市導(dǎo)讀

           

          本文從 Residual net(殘差網(wǎng)絡(luò))的結(jié)構(gòu)、ResNet50模型基本構(gòu)成、總體的網(wǎng)絡(luò)結(jié)構(gòu)和代碼復(fù)現(xiàn)四部分展開。 >>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿

          一、殘差結(jié)構(gòu)

          Residual net(殘差網(wǎng)絡(luò))

          將靠前若干層的某一層數(shù)據(jù)輸出直接跳過多層引入到后面數(shù)據(jù)層的輸入部分。

          意味著后面的特征層的內(nèi)容會(huì)有一部分由其前面的某一層線性貢獻(xiàn)。

          深度殘差網(wǎng)絡(luò)的設(shè)計(jì)是為了克服由于網(wǎng)絡(luò)深度加深而產(chǎn)生的學(xué)習(xí)效率變低與準(zhǔn)確率無法有效提升的問題。

          二、ResNet50模型基本構(gòu)成

          ResNet50有兩個(gè)基本的塊,分別名為Conv BlockIdentity Block

          Conv Block輸入和輸出的維度(通道數(shù)和size)是不一樣的,所以不能連續(xù)串聯(lián),它的作用是改變網(wǎng)絡(luò)的維度;

          Identity Block輸入維度和輸出維度(通道數(shù)和size)相同,可以串聯(lián),用于加深網(wǎng)絡(luò)的。

          Conv Block結(jié)構(gòu)
          Identity Block的結(jié)構(gòu)

          三、總體的網(wǎng)絡(luò)結(jié)構(gòu)

          四、代碼復(fù)現(xiàn)

          1.導(dǎo)庫

          import torch
          from torch import nn

          2.寫B(tài)lock類

          '''
          Block的各個(gè)plane值:
          inplane:輸出block的之前的通道數(shù)
          midplane:在block中間處理的時(shí)候的通道數(shù)(這個(gè)值是輸出維度的1/4)
          midplane*self.extention:輸出的維度
          '''

          class Bottleneck(nn.Module):

          #每個(gè)stage中維度拓展的倍數(shù)
          extention=4

          #定義初始化的網(wǎng)絡(luò)和參數(shù)
          def __init__(self,inplane,midplane,stride,downsample=None):
          super(Bottleneck,self).__init__()

          self.conv1=nn.Conv2d(inplane,midplane,kernel_size=1,stride=stride,bias=False)
          self.bn1=nn.BatchNorm2d(midplane)
          self.conv2=nn.Conv2d(midplane,midplane,kernel_size=3,stride=1,padding=1,bias=False)
          self.bn2=nn.BatchNorm2d(midplane)
          self.conv3=nn.Conv2d(midplane,midplane*self.extention,kernel_size=1,stride=1,bias=False)
          self.bn3=nn.BatchNorm2d(midplane*self.extention)
          self.relu=nn.ReLU(inplace=False)

          self.downsample=downsample
          self.stride=stride


          def forward(self,x):
          #參差數(shù)據(jù)
          residual=x

          #卷積操作
          out=self.relu(self.bn1(self.conv1(x)))
          out=self.relu(self.bn2(self.conv2(out)))
          out=self.relu(self.bn3(self.conv3(out)))

          #是否直連(如果時(shí)Identity block就是直連;如果是Conv Block就需要對參差邊進(jìn)行卷積,改變通道數(shù)和size)
          if(self.downsample!=None):
          residual=self.downsample(x)

          #將參差部分和卷積部分相加
          out+=residual
          out=self.relu(out)

          return out

          3.寫Resnet結(jié)構(gòu)

          class ResNet(nn.Module):

          #初始化網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)
          def __init__(self,block,layers,num_classes=1000):
          #self.inplane為當(dāng)前的fm的通道數(shù)
          self.inplane=64

          super(ResNet,self).__init__()

          #參數(shù)
          self.block=block
          self.layers=layers

          #stem的網(wǎng)絡(luò)層
          self.conv1=nn.Conv2d(3,self.inplane,kernel_size=7,stride=2,padding=3,bias=False)
          self.bn1=nn.BatchNorm2d(self.inplane)
          self.relu=nn.ReLU()
          self.maxpool=nn.MaxPool2d(kernel_size=3,padding=1,stride=2)

          #64,128,256,512是指擴(kuò)大4倍之前的維度,即Identity Block的中間維度
          self.stage1=self.make_layer(self.block,64,self.layers[0],stride=1)
          self.stage2=self.make_layer(self.block,128,self.layers[1],stride=2)
          self.stage3=self.make_layer(self.block,256,self.layers[2],stride=2)
          self.stage4=self.make_layer(self.block,512,self.layers[3],stride=2)

          #后續(xù)的網(wǎng)絡(luò)
          self.avgpool=nn.AvgPool2d(7)
          self.fc = nn.Linear(512 * block.extention, num_classes)





          def forward(self,x):

          #stem部分:conv+bn+relu+maxpool
          out=self.conv1(x)
          out=self.bn1(out)
          out=self.relu(out)
          out=self.maxpool(out)

          #block
          out=self.stage1(out)
          out=self.stage2(out)
          out=self.stage3(out)
          out=self.stage4(out)

          #分類
          out=self.avgpool(out)
          out = torch.flatten(out, 1)
          out=self.fc(out)


          return out

          def make_layer(self,block,midplane,block_num,stride=1):
          '''
          block:block模塊
          midplane:每個(gè)模塊中間運(yùn)算的維度,一般等于輸出維度/4
          block_num:重復(fù)次數(shù)
          stride:Conv Block的步長
          '''


          block_list=[]

          #先計(jì)算要不要加downsample模塊
          downsample=None
          if(stride!=1 or self.inplane!=midplane*block.extention):
          downsample=nn.Sequential(
          nn.Conv2d(self.inplane,midplane*block.extention,stride=stride,kernel_size=1,bias=False),
          nn.BatchNorm2d(midplane*block.extention)
          )


          #Conv Block
          conv_block=block(self.inplane,midplane,stride=stride,downsample=downsample)
          block_list.append(conv_block)
          self.inplane=midplane*block.extention

          #Identity Block
          for i in range(1,block_num):
          block_list.append(block(self.inplane,midplane,stride=1))

          return nn.Sequential(*block_list)

          4.調(diào)用

          resnet = ResNet(Bottleneck, [3, 4, 6, 3])
          x=torch.randn(1,3,224,224)
          x=resnet(x)
          print(x.shape)

          復(fù)現(xiàn)之后resnet的圖

          鏈接: https://pan.baidu.com/s/1pazTBDtVMb68tECRR1sM4Q 密碼: ps9c

          復(fù)現(xiàn)之后resnet的代碼

          鏈接: https://pan.baidu.com/s/1SKfgCnx_excnc-AzvfK8IQ 密碼: fi1w

          零、復(fù)現(xiàn)參考圖:

          參考

          https://blog.csdn.net/weixin_44791964/article/details/102790260

          如果覺得有用,就請分享到朋友圈吧!

          △點(diǎn)擊卡片關(guān)注極市平臺(tái),獲取最新CV干貨

          公眾號后臺(tái)回復(fù)“CVPR21檢測”獲取CVPR2021目標(biāo)檢測論文下載~


          極市干貨
          深度學(xué)習(xí)環(huán)境搭建:如何配置一臺(tái)深度學(xué)習(xí)工作站?
          實(shí)操教程:OpenVINO2021.4+YOLOX目標(biāo)檢測模型測試部署為什么你的顯卡利用率總是0%?
          算法技巧(trick):圖像分類算法優(yōu)化技巧21個(gè)深度學(xué)習(xí)調(diào)參的實(shí)用技巧


          CV技術(shù)社群邀請函 #

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart4)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動(dòng)交流~



          覺得有用麻煩給個(gè)在看啦~  


          瀏覽 161
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩一级黄视频 | 亚洲欧美操逼 | 黄色在线小视频 | 91亚洲精品久久久久久久久久久久 | 大香蕉性视频 |