日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PyTorch 实现经典模型5:ResNet

發布時間:2025/4/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch 实现经典模型5:ResNet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ResNet

網絡結構


代碼

#------------------------------用50行代碼搭建ResNet------------------------------------------- from torch import nn import torch as t from torch.nn import functional as Fclass ResidualBlock(nn.Module):#實現子module: Residual Blockdef __init__(self,inchannel,outchannel,stride=1,shortcut=None):super(ResidualBlock,self).__init__()self.left=nn.Sequential(nn.Conv2d(inchannel,outchannel,3,stride,1,bias=False),nn.BatchNorm2d(outchannel),nn.ReLU(inplace=True),nn.Conv2d(outchannel,outchannel,3,1,1,bias=False),nn.BatchNorm2d(outchannel))self.right=shortcutdef forward(self,x):out=self.left(x)residual=x if self.right is None else self.right(x)out+=residualreturn F.relu(out)class ResNet(nn.Module):#實現主module:ResNet34#ResNet34包含多個layer,每個layer又包含多個residual block#用子module實現residual block , 用 _make_layer 函數實現layerdef __init__(self,num_classes=1000):super(ResNet,self).__init__()self.pre=nn.Sequential(nn.Conv2d(3,64,7,2,3,bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.MaxPool2d(3,2,1))#重復的layer,分別有3,4,6,3個residual blockself.layer1=self._make_layer(64,64,3)self.layer2=self._make_layer(64,128,4,stride=2)self.layer3=self._make_layer(128,256,6,stride=2)self.layer4=self._make_layer(256,512,3,stride=2)#分類用的全連接self.fc=nn.Linear(512,num_classes)def _make_layer(self,inchannel,outchannel,block_num,stride=1):#構建layer,包含多個residual blockshortcut=nn.Sequential(nn.Conv2d(inchannel,outchannel,1,stride,bias=False),nn.BatchNorm2d(outchannel))layers=[ ]layers.append(ResidualBlock(inchannel,outchannel,stride,shortcut))for i in range(1,block_num):layers.append(ResidualBlock(outchannel,outchannel))return nn.Sequential(*layers)def forward(self,x):x=self.pre(x)x=self.layer1(x)x=self.layer2(x)x=self.layer3(x)x=self.layer4(x)x=F.avg_pool2d(x,7)x=x.view(x.size(0),-1)return self.fc(x)resnet = ResNet() print(resnet)

輸出結果如下:

ResNet((pre): Sequential((0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False))(layer1): Sequential((0): ResidualBlock((left): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))(right): Sequential((0): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): ResidualBlock((left): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(2): ResidualBlock((left): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))))(layer2): Sequential((0): ResidualBlock((left): Sequential((0): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))(right): Sequential((0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): ResidualBlock((left): Sequential((0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(2): ResidualBlock((left): Sequential((0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(3): ResidualBlock((left): Sequential((0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))))(layer3): Sequential((0): ResidualBlock((left): Sequential((0): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))(right): Sequential((0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): ResidualBlock((left): Sequential((0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(2): ResidualBlock((left): Sequential((0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(3): ResidualBlock((left): Sequential((0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(4): ResidualBlock((left): Sequential((0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(5): ResidualBlock((left): Sequential((0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))))(layer4): Sequential((0): ResidualBlock((left): Sequential((0): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))(right): Sequential((0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): ResidualBlock((left): Sequential((0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(2): ResidualBlock((left): Sequential((0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(4): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))))(fc): Linear(in_features=512, out_features=1000, bias=True) )

論文一些注意點

擬合高維

深度神經網絡可以擬合高維非線性函數

  • 可以擬合 H(x)H(x)H(x),也可以擬合 H(x)?xH(x)-xH(x)?x
  • F(x)=H(x)?xF(x)=H(x)-xF(x)=H(x)?x,則 H(x)=F(x)+xH(x)=F(x)+xH(x)=F(x)+x
  • 網絡學習的難易程度不同。
  • 解決梯度消失問題,增加的網絡層學習成恒等映射,則不會提升訓練誤差。
跳層的恒等映射

殘差塊
y=F(x,{wi})+xy=F(x,\{w_i\})+xy=F(x,{wi?})+x
其中,FFF:需要學習的殘差映射,維度與 xxx 一致;F+xF+xF+x:跳躍連接,逐一加和,最后二者的輸出經過函數 ReLU;

沒有額外參數,不增加復雜度。
FFF 包含兩個或兩個以上網絡層,否則表現為線性層 y=w1x+xy=w_1x+xy=w1?x+x

殘差網絡

兩個簡單的設計原則:

  • 具有相同輸出特征圖大小的網絡卷積層卷積核數量相同;
  • 特征圖大小減半,則卷積數量增加一倍,保證時間復雜度。
  • 基于普通網絡,插入跳躍連接。
    維度增加時,增加零輸出,或 1x1 卷積改變維度。

    Ref

  • Pytorch學習(三)–用50行代碼搭建ResNet
  • Pytorch實戰2:ResNet-18實現Cifar-10圖像分類(測試集分類準確率95.170%)
  • 總結

    以上是生活随笔為你收集整理的PyTorch 实现经典模型5:ResNet的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 超碰在线网站 | 久久婷婷久久 | 国产91美女视频 | 国产尤物在线视频 | 国产欧美一区二区精品性色超碰 | 国产做爰全免费的视频软件 | 能免费看18视频网站 | 色狠狠一区 | 一级黄色片免费 | 日本人妻丰满熟妇久久久久久 | www狠狠操| 久久国产传媒 | 阿娇全套94张未删图久久 | 极品美妇后花庭翘臀娇吟小说 | 四虎永久在线精品 | 乱妇乱女熟妇熟女网站 | 亚洲黄色激情 | 中文字幕乱码人妻一区二区三区 | 成人免费毛片足控 | 欧美性生活一区二区三区 | 在线免费国产视频 | 在线观看免费人成视频 | 色在线网站 | 欧美性受xxxx黑人xyx | 叶山小百合av一区二区 | 国产精品4区| 欧美射射射 | 精品一区中文字幕 | 最新av| 国产清纯白嫩初高中在线观看性色 | 激情影音 | 成人久久精品 | 国产免费福利 | 欧美精品色婷婷五月综合 | 嫩草av在线 | 久久久蜜桃一区二区人 | 久操视频在线观看 | 久久精品一区二区三区四区 | www一区二区三区 | 亚洲一区你懂的 | av无码精品一区二区三区 | 日本黄色短片 | caoporen超碰| 好屌妞视频这里只有精品 | 国产一区二区三区久久久 | 欧美日韩中文 | 福利视频三区 | 欧美乱妇在线观看 | 99色在线视频 | 91亚洲一线产区二线产区 | 国产456| 精品亚洲国产成人av制服丝袜 | 在线免费不卡视频 | 亚洲精品国产精品国自产观看浪潮 | 欧美精品日韩少妇 | 美女裸片 | 夜夜激情| 欧美一区二区在线播放 | 国产一级二级三级视频 | 日韩免费av一区二区 | 午夜视频a| 夜夜天天拍拍 | 综合亚洲色图 | 538任你躁在线精品免费 | 波多野结衣视频在线看 | 高清日韩一区二区 | 久久99精品国产麻豆91樱花 | 亚洲50p| 日本黄页网址 | 成人精品区 | 成人午夜免费福利 | 一本一道久久a久久 | 国产美女喷水视频 | 亚洲字幕成人中文在线观看 | 欧美日韩aaa | 亚洲精选av | 欧美专区第二页 | a人片| 色九九视频 | 亚洲av无码一区二区三区dv | 国产欧美一区二区三区白浆喷水 | 免费国产精品视频 | 五月婷影院 | 少妇粉嫩小泬喷水视频www | 午夜爽爽爽 | 一级黄色片毛片 | 国产乱码一区二区三区 | 在线观看视频99 | 黄色在线免费观看网站 | 能在线观看的av | 韩日a级片 | 亚洲成人中文 | 色就是色欧美 | 成年人免费视频网站 | 日韩成人在线观看 | 久久久久久久久久99精品 | 非洲黑人毛片 | 亚洲天堂成人在线观看 | 日本成人免费 |