resnet keras 结构_Day146:第二讲 ResNet
出處
論文:Deep Residual Learning for Image Recognition
作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
ImageNet Top5錯(cuò)誤率: 3.57%
主要思想
主要體現(xiàn)在 Residual(殘差),從名字就可以看出,不學(xué)絕對(duì)值,而學(xué)差值。不去學(xué)絕對(duì)的完全重構(gòu)映射,只學(xué)映射后相對(duì)于原來的偏差,即和identity的差值,絕對(duì)變相對(duì),容易多了。前向,容易學(xué)習(xí),后向,有了梯度高速通道,更好訓(xùn)練,能避免梯度消失。
殘差塊(以BasicBlock為例)
一般的網(wǎng)絡(luò)結(jié)構(gòu)下,輸入Xl 直接經(jīng)過兩個(gè)卷積層,就可以得到輸出Xl+1,而殘差塊則是將(通過兩個(gè)卷積層所得到的輸出)加上(網(wǎng)絡(luò)的輸入Xl),有的將這個(gè)過程成為skip connection。
skip connection 不只是可以直接將輸入Xl與卷積結(jié)果相加,某些情況下,輸入Xl與Xl+1維度不同,因此還可以加入1*1卷積對(duì)輸入進(jìn)行降維,從而使Xl與Xl+1維度相同,兩者才可以相加。
網(wǎng)絡(luò)結(jié)構(gòu)
- 左邊是BasicBlock,ResNet18和ResNet34就由其堆疊。
- 右邊是BottleNeck,多了一層,用1x1的卷積先降通道再升通道(首先做一個(gè)降維,然后做卷積,然后升維,這樣做的好處是可以大大減少計(jì)算量,專門用于網(wǎng)絡(luò)層數(shù)較深的的網(wǎng)絡(luò),ResNet-50以上的網(wǎng)絡(luò)都有這種基礎(chǔ)結(jié)構(gòu)構(gòu)成,如ResNet50、ResNet101、ResNet152就由其堆疊)。當(dāng)要降尺度的時(shí)候,3x3卷積使用stride 2(同時(shí)旁邊的shortcut也需要一個(gè)1x1的stride 2卷積,而非直接用輸入的identity,這樣可以使得后面相加的時(shí)候尺寸一致,因?yàn)椴煌瑢蛹?jí)的輸入輸出維度可能會(huì)不一樣,但是結(jié)構(gòu)類似)。平時(shí)的卷積都是stride 1。
- 使用1x1卷積,對(duì)稀疏信息進(jìn)行壓縮,有效利用計(jì)算力,所以效率更高。
代碼實(shí)現(xiàn)
- BasicBlock的代碼
- BottleNeck結(jié)構(gòu)的代碼
Pytorch 中的代碼,注意到上圖中為了減少計(jì)算量,作者將 256 維的輸入縮小了 4 倍變?yōu)?64 進(jìn)入卷積,在升維時(shí)需要升到 256 維,對(duì)應(yīng)代碼中的 expansion 參數(shù):
class Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, base_width=64, dilation=1, norm_layer=None): super(Bottleneck, self).__init__() if norm_layer is None: norm_layer = nn.BatchNorm2d width = int(planes * (base_width / 64.)) * groups # Both self.conv2 and self.downsample layers downsample the input when stride != 1 self.conv1 = conv1x1(inplanes, width) self.bn1 = norm_layer(width) self.conv2 = conv3x3(width, width, stride, groups, dilation) self.bn2 = norm_layer(width) self.conv3 = conv1x1(width, planes * self.expansion) self.bn3 = norm_layer(planes * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) # 要降尺度的話在這里,這里是stride 2的卷積 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) # 實(shí)際上是一個(gè)stride 2卷積加bn out += identity# 相加 out = self.relu(out) return outPytorch中的使用
在 Pytorch 中使用 ResNet 只需要 4 行代碼:
from torch import nn# torchvision 專用于視覺方面import torchvision # pretrained :使用在 ImageNet 數(shù)據(jù)集上預(yù)訓(xùn)練的模型model = torchvision.models.resnet18(pretrained=True)# 修改模型的全連接層使其輸出為你需要類型數(shù),這里是10# 由于使用了預(yù)訓(xùn)練的模型 而預(yù)訓(xùn)練的模型輸出為1000類,所以要修改全連接層# 若不使用預(yù)訓(xùn)練的模型可以直接在創(chuàng)建模型時(shí)添加參數(shù) num_classes=10 而不需要修改全連接層model.fc = nn.Linear(model.fc.in_features, 10)參考1:https://zhuanlan.zhihu.com/p/104657484
參考2:https://zhuanlan.zhihu.com/p/74230238
參考3:https://zhuanlan.zhihu.com/p/32781577
總結(jié)
以上是生活随笔為你收集整理的resnet keras 结构_Day146:第二讲 ResNet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eureka集群只注册一个_Spring
- 下一篇: 酷冷至尊展示“Cooling X”机箱: