成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > pytorch教程resnet.py的實現(xiàn)文件源碼分析

pytorch教程resnet.py的實現(xiàn)文件源碼分析

熱門標簽:獲客智能電銷機器人 不錯的400電話辦理 徐州天音防封電銷卡 佛山防封外呼系統(tǒng)收費 南昌辦理400電話怎么安裝 鄭州智能外呼系統(tǒng)運營商 湛江電銷防封卡 哈爾濱外呼系統(tǒng)代理商 電話機器人適用業(yè)務

調(diào)用pytorch內(nèi)置的模型的方法

import torchvision
model = torchvision.models.resnet50(pretrained=True)

這樣就導入了resnet50的預訓練模型了。如果只需要網(wǎng)絡結(jié)構(gòu),不需要用預訓練模型的參數(shù)來初始化

那么就是:

model = torchvision.models.resnet50(pretrained=False)

如果要導入densenet模型也是同樣的道理

比如導入densenet169,且不需要是預訓練的模型:

model = torchvision.models.densenet169(pretrained=False)

由于pretrained參數(shù)默認是False,所以等價于:

model = torchvision.models.densenet169()

不過為了代碼清晰,最好還是加上參數(shù)賦值。

解讀模型源碼Resnet.py

包含的庫文件

import torch.nn as nn
import math
import torch.utils.model_zoo as model_zoo

該庫定義了6種Resnet的網(wǎng)絡結(jié)構(gòu)

包括

__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50',  'resnet101',  'resnet152']

每種網(wǎng)絡都有訓練好的可以直接用的.pth參數(shù)文件

__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50',  'resnet101',  'resnet152']

Resnet中大多使用3*3的卷積定義如下

def conv3x3(in_planes, out_planes, stride=1):   
"""3x3 convolution with padding"""   
return nn.Conv2d(in_planes, out_planes, kernel_size=3, 
stride=stride, padding=1, bias=False)

該函數(shù)繼承自nn網(wǎng)絡中的2維卷積,這樣做主要是為了方便,少寫參數(shù)參數(shù)由原來的6個變成了3個

輸出圖與輸入圖長寬保持一致

如何定義不同大小的Resnet網(wǎng)絡

Resnet類是一個基類,
所謂的"Resnet18", ‘resnet34', ‘resnet50', ‘resnet101', 'resnet152'只是Resnet類初始化的時候使用了不同的參數(shù),理論上我們可以根據(jù)Resnet類定義任意大小的Resnet網(wǎng)絡
下面先看看這些不同大小的Resnet網(wǎng)絡是如何定義的

定義Resnet18

def resnet18(pretrained=False, **kwargs):  
"""
Constructs a ResNet-18 model.    
Args:    
pretrained (bool):If True, returns a model pre-trained on ImageNet   
"""    
model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)    
if pretrained:        
    model.load_state_dict(model_zoo.load_url(model_urls['resnet18']))   
 return model

定義Resnet34

def resnet34(pretrained=False, **kwargs):    
"""Constructs a ResNet-34 model.   
Args:        pretrained (bool): If True, returns a model pre-trained on ImageNet    """   
model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs)  
if pretrained:        
    model.load_state_dict(model_zoo.load_url(model_urls['resnet34']))    
 return model

我們發(fā)現(xiàn)Resnet18和Resnet34的定義幾乎是一樣的,下面我們把Resnet18,Resnet34,Resnet50,Resnet101,Resnet152,不一樣的部分寫在一塊進行對比

model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)    #Resnet18
model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs)    #Resnet34
model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)    #Eesnt50
model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs)  #Resnet101
model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs)  #Resnet152

代碼看起來非常的簡潔工整,

其他resnet18、resnet101等函數(shù)和resnet18基本類似,差別主要是在:

1、構(gòu)建網(wǎng)絡結(jié)構(gòu)的時候block的參數(shù)不一樣,比如resnet18中是[2, 2, 2, 2],resnet101中是[3, 4, 23, 3]。

2、調(diào)用的block類不一樣,比如在resnet50、resnet101、resnet152中調(diào)用的是Bottleneck類,而在resnet18和resnet34中調(diào)用的是BasicBlock類,這兩個類的區(qū)別主要是在residual結(jié)果中卷積層的數(shù)量不同,這個是和網(wǎng)絡結(jié)構(gòu)相關的,后面會詳細介紹。

3、如果下載預訓練模型的話,model_urls字典的鍵不一樣,對應不同的預訓練模型。因此接下來分別看看如何構(gòu)建網(wǎng)絡結(jié)構(gòu)和如何導入預訓練模型。

Resnet類

構(gòu)建ResNet網(wǎng)絡是通過ResNet這個類進行的。ResNet類是繼承PyTorch中網(wǎng)絡的基類:torch.nn.Module。

構(gòu)建Resnet類主要在于重寫 init() forward() 方法。

我們構(gòu)建的所有網(wǎng)絡比如:VGG,Alexnet等都需要重寫這兩個方法,這兩個方法很重要

看起來Resne類是整個文檔的核心

下面我們就要研究一下Resnet基類是如何實現(xiàn)的

Resnet類采用了pytorch定義網(wǎng)絡模型的標準結(jié)構(gòu),包含

iinit()方法: 定義了網(wǎng)絡的各個層
forward()方法: 定義了前向傳播過程

這兩個方法的用法,這個可以查看pytorch的官方文檔就可以明白

在Resnet類中,還包含一個自定義的方法make_layer()方法

是用來構(gòu)建ResNet網(wǎng)絡中的4個blocks。

_make_layer方法的第一個輸入block是BottleneckBasicBlock

第二個輸入是該blocks的輸出channel

第三個輸入是每個blocks中包含多少個residual子結(jié)構(gòu),因此layers這個列表就是前面resnet50的[3, 4, 6, 3]。

_make_layer方法中比較重要的兩行代碼是:

layers.append(block(self.inplanes, planes, stride, downsample))

該部分是將每個blocks的第一個residual結(jié)構(gòu)保存在layers列表中。

 for i in range(1, blocks): layers.append(block(self.inplanes, planes))

該部分是將每個blocks的剩下residual 結(jié)構(gòu)保存在layers列表中,這樣就完成了一個blocks的構(gòu)造。這兩行代碼中都是通過Bottleneck這個類來完成每個residual的構(gòu)建

接下來介紹Bottleneck類

class ResNet(nn.Module):
    def __init__(self, block, layers, num_classes=1000):
        self.inplanes = 64
        super(ResNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,
                               bias=False)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.layer1 = self._make_layer(block, 64, layers[0])
        self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
        self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
        self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
        self.avgpool = nn.AvgPool2d(7, stride=1)
        self.fc = nn.Linear(512 * block.expansion, num_classes)
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, math.sqrt(2. / n))
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()
    def _make_layer(self, block, planes, blocks, stride=1):
        downsample = None
        if stride != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.Sequential(
                nn.Conv2d(self.inplanes, planes * block.expansion,
                          kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(planes * block.expansion),
            )
        layers = []
        layers.append(block(self.inplanes, planes, stride, downsample))
        self.inplanes = planes * block.expansion
        for i in range(1, blocks):
            layers.append(block(self.inplanes, planes))
        return nn.Sequential(*layers)
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

下面我們分別看看這兩個過程:

網(wǎng)絡的forward過程

 def forward(self, x):                                #x代表輸入
        x = self.conv1(x)                             #進過卷積層1
        x = self.bn1(x)                                #bn1層
        x = self.relu(x)                                #relu激活
        x = self.maxpool(x)                         #最大池化
        x = self.layer1(x)                            #卷積塊1
        x = self.layer2(x)                           #卷積塊2
        x = self.layer3(x)                          #卷積塊3
        x = self.layer4(x)                          #卷積塊4
        x = self.avgpool(x)                     #平均池化
        x = x.view(x.size(0), -1)               #二維變成變成一維向量
        x = self.fc(x)                             #全連接層
        return x

里面的大部分我們都可以理解,只有l(wèi)ayer1-layer4是Resnet網(wǎng)絡自己定義的,
它也是Resnet殘差連接的精髓所在,我們來分析一下layer層是怎么實現(xiàn)的

殘差Block連接是如何實現(xiàn)的

從前面的ResNet類可以看出,在構(gòu)造ResNet網(wǎng)絡的時候,最重要的是 BasicBlock這個類,因為ResNet是由residual結(jié)構(gòu)組成的,而 BasicBlock類就是完成residual結(jié)構(gòu)的構(gòu)建。同樣 BasicBlock還是繼承了torch.nn.Module類,且重寫了__init__()和forward()方法。從forward方法可以看出,bottleneck就是我們熟悉的3個主要的卷積層、BN層和激活層,最后的out += residual就是element-wise add的操作。

這部分在 BasicBlock類中實現(xiàn),我們看看這層是如何前向傳播的

def forward(self, x):
        residual = x
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
        out = self.conv2(out)
        out = self.bn2(out)
        if self.downsample is not None:
            residual = self.downsample(x)
        out += residual
        out = self.relu(out)
        return out

我畫個流程圖來表示一下

畫的比較丑,不過基本意思在里面了,

根據(jù)論文的描述,x是否需要下采樣由x與out是否大小一樣決定,

假如進過conv2和bn2后的結(jié)果我們稱之為 P

假設x的大小為wHchannel1

如果P的大小也是wHchannel1

則無需下采樣
out = relu(P + X)
out的大小為W * H *(channel1+channel2),

如果P的大小是W/2 * H/2 * channel

則X需要下采樣后才能與P相加,
out = relu(P+ X下采樣)
out的大小為W/2 * H/2 * (channel1+channel2)

BasicBlock類和Bottleneck類類似,前者主要是用來構(gòu)建ResNet18和ResNet34網(wǎng)絡,因為這兩個網(wǎng)絡的residual結(jié)構(gòu)只包含兩個卷積層,沒有Bottleneck類中的bottleneck概念。因此在該類中,第一個卷積層采用的是kernel_size=3的卷積,就是我們之前提到的conv3x3函數(shù)。

下面是BasicBlock類的完整代碼

class BasicBlock(nn.Module):
    expansion = 1
    def __init__(self, inplanes, planes, stride=1, downsample=None):
        super(BasicBlock, self).__init__()
        self.conv1 = conv3x3(inplanes, planes, stride)
        self.bn1 = nn.BatchNorm2d(planes)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = conv3x3(planes, planes)
        self.bn2 = nn.BatchNorm2d(planes)
        self.downsample = downsample
        self.stride = stride
    def forward(self, x):
        residual = x
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
        out = self.conv2(out)
        out = self.bn2(out)
        if self.downsample is not None:
            residual = self.downsample(x)
        out += residual
        out = self.relu(out)
        return out

以上就是pytorch教程resnet.py的實現(xiàn)文件源碼解讀的詳細內(nèi)容,更多關于pytorch源碼解讀的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PyTorch實現(xiàn)ResNet50、ResNet101和ResNet152示例
  • Keras實現(xiàn)DenseNet結(jié)構(gòu)操作
  • 關于Keras Dense層整理
  • Python機器學習從ResNet到DenseNet示例詳解

標簽:安康 蕪湖 呂梁 吉安 廣西 紹興 懷化 蘭州

巨人網(wǎng)絡通訊聲明:本文標題《pytorch教程resnet.py的實現(xiàn)文件源碼分析》,本文關鍵詞  pytorch,教程,resnet.py,的,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《pytorch教程resnet.py的實現(xiàn)文件源碼分析》相關的同類信息!
  • 本頁收集關于pytorch教程resnet.py的實現(xiàn)文件源碼分析的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲第一天堂av| 欧美无毛视频| 亚洲熟女乱色一区二区三区久久久| 亚洲精品乱码久久久久久蜜桃图片| 成人激情视频小说免费下载| 一区二区三区四区蜜桃| 九九免费精品视频在线观看| 亚洲熟妇无码一区二区三区| 伊人久久大香线蕉av不卡| 国产又粗又硬又长| 亚洲图片都市激情| 久久精品一二三| 精品99一区二区| 欧美日韩一区三区| 超碰国产精品久久国产精品99| 欧美在线你懂的| 全黄性性激高免费视频| 欧美日韩一区二区视频在线观看| 玖玖玖免费嫩草在线影院一区| se视频在线观看| 国产精品99| 亚洲精品成a人在线观看| 天天射天天干天天| 欧美美女一区| 美女网站久久| 国产69精品久久久久9999人| 欧美极品视频在线观看| 2024最新电影免费在线观看| 免费看污污网站| 国产精品免费无遮挡无码永久视频| 国产精品美女一区二区三区| 亚洲热线99精品视频| 天堂中文字幕在线观看| 亚洲伦理在线观看| 中文久久电影小说| 日韩精品一区二区三区三区免费| 久久久国产一区| 你懂的免费在线观看视频网站| 久久久久麻豆v国产精华液好用吗| 欧美a免费在线| 水蜜桃免费高清视频在线播放| 91精品高清| 成人免费一区二区三区在线观看| 久久精品美女视频网站| 日韩手机在线导航| 丰满人妻妇伦又伦精品国产| 四虎成人免费在线| 欧美精品少妇| 91精品国产乱码久久久久久久| 国产一区二区三区精品在线| 91精品91久久久中77777老牛| 啪啪av大全导航福利综合导航| 日韩欧美精品久久| 91久久精品www人人做人人爽| 夜夜嗨一区二区| 久久久久久久综合| 成人免费毛片嘿嘿连载视频| 特级西西www444人体聚色| 亚洲色图欧美| 成人有码在线视频| 日本理论中文字幕| 五月天网站亚洲| theporn国产精品| 人妻激情偷乱频一区二区三区| 成人羞羞网站入口| 精品在线观看一区二区| 日韩在线一二三区| 激情视频免费在线| 欧美一区二区三区免费视| 免费97视频在线精品国自产拍| 国产精品亚发布| 国产婷婷在线视频| 午夜精品久久久久久久第一页按摩| 国a精品视频大全| 亚洲国产精品久久久久久女王| 国产亚洲高清在线观看| 国产不卡av在线播放| 免费看一级大片| 国产精品1区| 国产精品com| 粉嫩在线一区二区三区视频| 国产精品片aa在线观看| 久久出品必属精品| 国产99久久精品一区二区 夜夜躁日日躁| 老司机性视频| 国产激情一区二区三区| 91成品人影院| 91久久奴性调教| 国产专区中文字幕| 日韩欧美美女在线观看| 97精品国产一区二区三区| 日韩精品卡一| 2021天堂中文幕一二区在线观| 在线观看黄网址| 精品免费二区三区三区高中清不卡| 无码aⅴ精品一区二区三区| 国产福利视频在线播放| 国产香蕉久久| 国产喷白浆一区二区三区| www.亚洲激情| 国产亚洲自拍一区| www.就去干.com| av男人一区| 亚洲欧美综合精品久久成人| 影音先锋欧美激情| 2018中文字幕一区二区三区| 国产成人精品一区二区在线| 久久精品一区二区三区不卡免费视频| 中文字幕一区二区三区乱码| 国产九一精品| 欧美福利视频网站| 欧美精品性视频| 亚洲乱码国产乱码精品精的特点| 久久亚洲私人国产精品va媚药| 一区二区三区亚洲视频| 91欧美日韩麻豆精品| 一区二区三区精品在线观看| 在线中文字幕网站| 日韩国产欧美一区二区| 久久精品国产一区二区三区不卡| 亚洲日本japanese丝袜| 精品国产亚洲AV| 久久九九有精品国产23| 国产精品免费视频xxxx| 亚州视频一区二区三区| 亚洲美女在线观看| 天天操人人爽| 黄漫在线观看| 成人午夜激情| 欧美色图首页| 久草免费新视频| 99精品视频在线播放免费| 香蕉久久久久久| 精品久久久久久久人人人人传媒| 欧美成人r级一区二区三区| 九九热在线视频观看这里只有精品| 国产午夜亚洲精品一级在线| jizzjizz日本少妇| 亚洲伊人久久综合| 国产精品密蕾丝视频下载| 污黄网站在线观看| 久久视频在线| 91免费看片| 国产精品久久久久久在线观看| 久久精品国产亚洲AV熟女| 中国一区二区视频| 超碰在线观看免费| 欧美亚洲一区二区三区四区| 夜夜嗨av色一区二区不卡| 成人伊人222| www.大网伊人| 男人的天堂最新网址| 成人高潮成人免费观看| 日韩和欧美的一区| 成人短视频app| 国产一区久久精品| 亚洲欧美日韩精品久久亚洲区| 精品国产18久久久久久二百| 99视频免费观看蜜桃视频| 黄网站免费在线| 亚洲高清免费一级二级三级| 天天看天天色| 国产成人av一区二区三区| 亚洲精品菠萝久久久久久久| 久久精品国产一区二区电影| 欧美大尺度做爰床戏| 天堂在线亚洲视频| 成人av在线播放网站| wwwxxx在线观看| 91精品国产综合久久精品麻豆| 一区二区三区在线观看免费视频| 麻豆传媒一区二区| 中文字幕一区二区三区免费视频| 精品爽片免费看久久| 欧美男人天堂网| 爆乳熟妇一区二区三区霸乳| 久草免费在线观看| av播放在线观看| 亚洲人高潮女人毛茸茸| 欧美日韩中文一区二区| 亚洲国产精品一区制服丝袜| 美女久久精品| 欧美国产大片| 中文字幕第20页| 国产婷婷97碰碰久久人人蜜臀| 国产精品一级黄| 伊人国产在线看一| 国产精品成人久久久| 91网站在线观看免费| 日本女优一区| 亚洲欧美激情另类校园| 亚洲一级在线观看| 中文字幕91| 国产午夜精品久久久| 欧美激情18p| 一本之道在线视频| 免费精品一区二区三区在线观看| 午夜国产精品影院在线观看| 貂蝉被到爽流白浆在线观看| h视频久久久| 在线视频日本亚洲性| 亚洲国产一区二区在线观看| 欧美h版在线| 媚黑女一区二区| 日本麻豆一区二区三区视频| 成人av在线播放网站| 国产传媒一区二区三区| 免费成人在线网站| 国产探花视频在线| 一本色道久久综合亚洲| 深夜福利一区二区三区| 找av导航入口| 国产精品午夜在线观看| 亚洲福利在线观看视频| 伊人一区二区三区| 69av成人| 国产亚洲综合性久久久影院| 亚洲日本欧美天堂| 超碰超碰97| 久久精品第九区免费观看| 国产美女视频免费看| 欧美一区二区播放| 四虎成人在线| 偷窥国产亚洲免费视频| 欧美色老女人| 成人免费av片| 日本高清视频免费看| 男人的天堂亚洲一区| 亚洲精品无码久久久久久| 国产91精品久久久久| 亚洲18在线看污www麻豆| 99国产欧美另类久久久精品| 欧美群妇大交群的观看方式| 欧美四级剧情无删版影片| 午夜伦欧美伦电影理论片| 欧美成人aaaaⅴ片在线看| 中文日韩在线视频| 色综合综合网| 欧美高清hd18日本| 国产精品v亚洲精品v日韩精品| 中日韩美女免费视频网站在线观看| 在线观看国产区| 美女日韩一区| 久久视频这里有精品| 黄色一区三区| 蜜臂av日日欢夜夜爽一区| 国产偷窥女洗浴在线观看亚洲| 成人免费网视频| 手机看片国产1024| 校园春色综合| 中文字幕日韩欧美一区二区三区| 久热精品免费视频| 国产在线不卡av| 久久久精品久久久久特色影视| 久久99久久久久| 91精品人妻一区二区| 日本乱子伦xxxx| 久久男人中文字幕资源站| 欧美成人午夜精品免费| 狠狠色狠狠色综合日日91app| 亚洲成人激情社区| 任你躁在线精品免费| 欧美午夜视频网站| 自拍偷拍福利视频| 一区二区三区视频免费| 日韩毛片在线播放| 国产美女喷水视频| 自拍亚洲图区| 久久久精品一区| 成人激情开心网| 男人日女人网站| 丝袜熟女一区二区三区| 日本精品人妻无码77777| 国产亚洲一区二区手机在线观看| 国产原创popny丨九色| 国产精品嫩草影院久久久| 日韩网址在线观看| 日本久久久久久久久久| 日本黄色片在线观看| 亚洲成人中文字幕| 天天插天天狠天天透| 日日夜夜天天操| 日韩欧美你懂的| 中文字幕不卡在线| 91高清免费观看| 婷婷视频一区二区三区| 久播影院第一理论片| 欧美亚洲另类制服自拍| 国产日产欧美一区二区三区| 精品视频一二区| 欧美日韩人人澡狠狠躁视频| 狠狠做深爱婷婷综合一区| 色视频一区二区三区| 国产成人精品123区免费视频| 成人毛片在线播放| 欧美日韩国产免费一区二区| 99久久久国产精品美女| 写真福利理论片在线播放| 熟妇人妻久久中文字幕| 波多野结衣黄色| 成人欧美在线| 国产精品一区二区在线观看不卡| 99精品国产99久久久久久白柏| 国产美女搞久久| 日韩在线免费高清视频| 日本中文字幕免费在线观看| 一本久久综合亚洲鲁鲁| 国产成人精品999| 成人毛片视频免费看| аⅴ成人天堂中文在线| 中文字幕不卡在线视频极品| 国产xxxxx在线观看| 久久久久久午夜| 精品一区欧美| 97一区二区国产好的精华液| 成人午夜精品一区二区三区| 一区二区三区在线免费观看视频| 亚洲精品天堂| 91chinesevideo永久地址| 免费在线播放电影| 日韩成人av在线播放| 中文在线资源在线| 久久资源免费视频| 亚洲国产一区二区三区在线播| 日本不卡不码高清免费观看| 奇米色一区二区| 久久这里只有精品视频网| 思思久久99热只有频精品66|