亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PyTorch模型容器與AlexNet構(gòu)建示例詳解

 更新時(shí)間:2023年07月13日 09:17:09   作者:YOLO  
這篇文章主要為大家介紹了PyTorch模型容器與AlexNet構(gòu)建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

 模型容器與AlexNet構(gòu)建

文章和代碼已經(jīng)歸檔至【Github倉(cāng)庫(kù):https://github.com/timerring/dive-into-AI 】

除了上述的模塊之外,還有一個(gè)重要的概念是模型容器 (Containers),常用的容器有 3 個(gè),這些容器都是繼承自nn.Module。

  • nn.Sequetial:按照順序包裝多個(gè)網(wǎng)絡(luò)層
  • nn.ModuleList:像 python 的 list 一樣包裝多個(gè)網(wǎng)絡(luò)層,可以迭代
  • nn.ModuleDict:像 python 的 dict 一樣包裝多個(gè)網(wǎng)絡(luò)層,通過(guò) (key, value) 的方式為每個(gè)網(wǎng)絡(luò)層指定名稱。

nn.Sequetial

深度學(xué)習(xí)中,特征提取和分類器這兩步被融合到了一個(gè)神經(jīng)網(wǎng)絡(luò)中。在卷積神經(jīng)網(wǎng)絡(luò)中,前面的卷積層以及池化層可以認(rèn)為是特征提取部分,而后面的全連接層可以認(rèn)為是分類器部分。比如 LeNet 就可以分為特征提取分類器兩部分,這 2 部分都可以分別使用 nn.Seuqtial 來(lái)包裝。

代碼如下:

class LeNetSequetial(nn.Module):
    def __init__(self, classes):
        super(LeNet2, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 6, 5),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(6, 16, 5),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        self.classifier = nn.Sequential(
            nn.Linear(16*5*5, 120),
            nn.ReLU(),
            nn.Linear(120, 84),
            nn.ReLU(),
            nn.Linear(84, classes)
        )
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size()[0], -1)
        x = self.classifier(x)
        return x

在初始化時(shí),nn.Sequetial會(huì)調(diào)用__init__()方法,將每一個(gè)子 module 添加到 自身的_modules屬性中。這里可以看到,我們傳入的參數(shù)可以是一個(gè) list,或者一個(gè) OrderDict。如果是一個(gè) OrderDict,那么則使用 OrderDict 里的 key,否則使用數(shù)字作為 key。

def __init__(self, *args):
        super(Sequential, self).__init__()
        if len(args) == 1 and isinstance(args[0], OrderedDict):
            for key, module in args[0].items():
                self.add_module(key, module)
        else:
            for idx, module in enumerate(args):
                self.add_module(str(idx), module)

網(wǎng)絡(luò)初始化完成后有兩個(gè)子 modulefeaturesclassifier。

features中的子 module 如下,每個(gè)網(wǎng)絡(luò)層以序號(hào)作為 key:

在進(jìn)行前向傳播時(shí),會(huì)進(jìn)入 LeNet 的forward()函數(shù),首先調(diào)用第一個(gè)Sequetial容器:self.features,由于self.features也是一個(gè) module,因此會(huì)調(diào)用__call__()函數(shù),里面調(diào)用

result = self.forward(*input, **kwargs),進(jìn)入nn.Seuqetialforward()函數(shù),在這里依次調(diào)用所有的 module。上一個(gè)module的輸出是下一個(gè)module的輸入。

def forward(self, input):
        for module in self:
            input = module(input)
        return input

在上面可以看到在nn.Sequetial中,里面的每個(gè)子網(wǎng)絡(luò)層 module 是使用序號(hào)來(lái)索引的,即使用數(shù)字來(lái)作為key。

一旦網(wǎng)絡(luò)層增多,難以查找特定的網(wǎng)絡(luò)層,這種情況可以使用 OrderDict (有序字典)??梢耘c上面的代碼對(duì)比一下

class LeNetSequentialOrderDict(nn.Module):
    def __init__(self, classes):
        super(LeNetSequentialOrderDict, self).__init__()
        self.features = nn.Sequential(OrderedDict({
            'conv1': nn.Conv2d(3, 6, 5),
            'relu1': nn.ReLU(inplace=True),
            'pool1': nn.MaxPool2d(kernel_size=2, stride=2),
            'conv2': nn.Conv2d(6, 16, 5),
            'relu2': nn.ReLU(inplace=True),
            'pool2': nn.MaxPool2d(kernel_size=2, stride=2),
        }))
        self.classifier = nn.Sequential(OrderedDict({
            'fc1': nn.Linear(16*5*5, 120),
            'relu3': nn.ReLU(),
            'fc2': nn.Linear(120, 84),
            'relu4': nn.ReLU(inplace=True),
            'fc3': nn.Linear(84, classes),
        }))
        ...
        ...
        ...

總結(jié)

nn.Sequetialnn.Module的容器,用于按順序包裝一組網(wǎng)絡(luò)層,有以下兩個(gè)特性。

  • 順序性:各網(wǎng)絡(luò)層之間嚴(yán)格按照順序構(gòu)建,我們?cè)跇?gòu)建網(wǎng)絡(luò)時(shí),一定要注意前后網(wǎng)絡(luò)層之間輸入和輸出數(shù)據(jù)之間的形狀是否匹配
  • 自帶forward()函數(shù):在nn.Sequetialforward()函數(shù)里通過(guò) for 循環(huán)依次讀取每個(gè)網(wǎng)絡(luò)層,執(zhí)行前向傳播運(yùn)算。這使得我們我們構(gòu)建的模型更加簡(jiǎn)潔

nn.ModuleList

nn.ModuleListnn.Module的容器,用于包裝一組網(wǎng)絡(luò)層,以迭代的方式調(diào)用網(wǎng)絡(luò)層,主要有以下 3 個(gè)方法:

  • append():在 ModuleList 后面添加網(wǎng)絡(luò)層
  • extend():拼接兩個(gè) ModuleList
  • insert():在 ModuleList 的指定位置中插入網(wǎng)絡(luò)層

下面的代碼通過(guò)列表生成式來(lái)循環(huán)迭代創(chuàng)建 20 個(gè)全連接層,非常方便,只是在 forward()函數(shù)中需要手動(dòng)調(diào)用每個(gè)網(wǎng)絡(luò)層。

class ModuleList(nn.Module):
    def __init__(self):
        super(ModuleList, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(20)])
    def forward(self, x):
        for i, linear in enumerate(self.linears):
            x = linear(x)
        return x
net = ModuleList()
print(net)
fake_data = torch.ones((10, 10))
output = net(fake_data)
print(output)

nn.ModuleDict

nn.ModuleDictnn.Module的容器,用于包裝一組網(wǎng)絡(luò)層,以索引的方式調(diào)用網(wǎng)絡(luò)層,主要有以下 5 個(gè)方法:

  • clear():清空 ModuleDict
  • items():返回可迭代的鍵值對(duì) (key, value)
  • keys():返回字典的所有 key
  • values():返回字典的所有 value
  • pop():返回一對(duì)鍵值,并從字典中刪除

下面的模型創(chuàng)建了兩個(gè)ModuleDictself.choicesself.activations,在前向傳播時(shí)通過(guò)傳入對(duì)應(yīng)的 key 來(lái)執(zhí)行對(duì)應(yīng)的網(wǎng)絡(luò)層。

class ModuleDict(nn.Module):
    def __init__(self):
        super(ModuleDict, self).__init__()
        self.choices = nn.ModuleDict({
            'conv': nn.Conv2d(10, 10, 3),
            'pool': nn.MaxPool2d(3)
        })
        self.activations = nn.ModuleDict({
            'relu': nn.ReLU(),
            'prelu': nn.PReLU()
        })
    def forward(self, x, choice, act):
        x = self.choices[choice](x)
        x = self.activations[act](x)
        return x
net = ModuleDict()
fake_img = torch.randn((4, 10, 32, 32))
output = net(fake_img, 'conv', 'relu')
# output = net(fake_img, 'conv', 'prelu')
print(output)

容器總結(jié)

  • nn.Sequetial:順序性,各網(wǎng)絡(luò)層之間嚴(yán)格按照順序執(zhí)行,常用于 block 構(gòu)建,在前向傳播時(shí)的代碼調(diào)用變得簡(jiǎn)潔
  • nn.ModuleList:迭代行,常用于大量重復(fù)網(wǎng)絡(luò)構(gòu)建,通過(guò) for 循環(huán)實(shí)現(xiàn)重復(fù)構(gòu)建
  • nn.ModuleDict:索引性,常用于可選擇的網(wǎng)絡(luò)層

AlexNet實(shí)現(xiàn)

AlexNet 特點(diǎn)如下:

  • 采用 ReLU 替換飽和激活函數(shù),減輕梯度消失
  • 采用 LRN (Local Response Normalization) 對(duì)數(shù)據(jù)進(jìn)行局部歸一化,減輕梯度消失
  • 采用 Dropout 提高網(wǎng)絡(luò)的魯棒性,增加泛化能力
  • 使用 Data Augmentation,包括 TenCrop 和一些色彩修改

AlexNet 的網(wǎng)絡(luò)結(jié)構(gòu)可以分為兩部分:features 和 classifier。

可以在計(jì)算機(jī)視覺庫(kù)torchvision.models中找到 AlexNet 的代碼,通過(guò)看可知使用了nn.Sequential來(lái)封裝網(wǎng)絡(luò)層。

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )
    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

以上就是PyTorch模型容器與AlexNet構(gòu)建示例詳解的詳細(xì)內(nèi)容,更多關(guān)于PyTorch AlexNet構(gòu)建的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用python構(gòu)建WebSocket客戶端的教程詳解

    使用python構(gòu)建WebSocket客戶端的教程詳解

    WebSocket是一種在客戶端和服務(wù)器之間實(shí)現(xiàn)雙向通信的協(xié)議,常用于實(shí)時(shí)聊天、實(shí)時(shí)數(shù)據(jù)更新等場(chǎng)景,Python提供了許多庫(kù)來(lái)實(shí)現(xiàn) WebSocket客戶端,本教程將介紹如何使用Python構(gòu)建WebSocket客戶端,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 在Django中管理Users和Permissions以及Groups的方法

    在Django中管理Users和Permissions以及Groups的方法

    這篇文章主要介紹了在Django中管理Users和Permissions以及Groups的方法,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • pip和pygal的安裝實(shí)例教程

    pip和pygal的安裝實(shí)例教程

    這篇文章主要介紹了pip和pygal的安裝實(shí)例教程,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼

    OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼

    這篇文章主要介紹了OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python中將字符串變成數(shù)字的5種方法示例

    Python中將字符串變成數(shù)字的5種方法示例

    Python提供了多種方式來(lái)轉(zhuǎn)換字符串為數(shù)字類型,但是每一種方式都有其優(yōu)缺點(diǎn),這篇文章主要介紹了Python中將字符串變成數(shù)字的5種方法,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Python使用shutil操作文件、subprocess運(yùn)行子程序

    Python使用shutil操作文件、subprocess運(yùn)行子程序

    這篇文章介紹了Python使用shutil操作文件、subprocess運(yùn)行子程序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Django 框架模型操作入門教程

    Django 框架模型操作入門教程

    這篇文章主要介紹了Django 框架模型操作,結(jié)合實(shí)例形式分析了Django框架相關(guān)的數(shù)據(jù)庫(kù)配置、數(shù)據(jù)增刪改查等操作技巧,需要的朋友可以參考下
    2019-11-11
  • pip search報(bào)錯(cuò)問(wèn)題及解決

    pip search報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了pip search報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • TensorFlow隱藏操作探索(張量操作和定制模型算法)

    TensorFlow隱藏操作探索(張量操作和定制模型算法)

    這篇文章主要為大家介紹了TensorFlow隱藏操作探索(張量操作和定制模型算法),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Python 使用多屬性來(lái)進(jìn)行排序

    Python 使用多屬性來(lái)進(jìn)行排序

    這篇文章主要介紹了Python 使用多屬性來(lái)進(jìn)行排序的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論