欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Pytorch實(shí)現(xiàn)ResNet網(wǎng)絡(luò)構(gòu)建及模型訓(xùn)練

 更新時(shí)間:2023年04月21日 15:04:20   作者:實(shí)力  
這篇文章主要為大家介紹了利用Pytorch實(shí)現(xiàn)ResNet網(wǎng)絡(luò)構(gòu)建及模型訓(xùn)練詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

構(gòu)建網(wǎng)絡(luò)

ResNet由一系列堆疊的殘差塊組成,其主要作用是通過(guò)無(wú)限制地增加網(wǎng)絡(luò)深度,從而使其更加強(qiáng)大。在建立ResNet模型之前,讓我們先定義4個(gè)層,每個(gè)層由多個(gè)殘差塊組成。這些層的目的是降低空間尺寸,同時(shí)增加通道數(shù)量。

以ResNet50為例,我們可以使用以下代碼來(lái)定義ResNet網(wǎng)絡(luò):

class ResNet(nn.Module):
    def __init__(self, num_classes=1000):
        super().__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
(續(xù))
即模型需要在輸入層加入一些 normalization 和激活層。
```python
import torch.nn.init as init
class Flatten(nn.Module):
    def __init__(self):
        super().__init__()
    def forward(self, x):
        return x.view(x.size(0), -1)
class ResNet(nn.Module):
    def __init__(self, num_classes=1000):
        super().__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.layer1 = nn.Sequential(
            ResidualBlock(64, 256, stride=1),
            *[ResidualBlock(256, 256) for _ in range(1, 3)]
        )
        self.layer2 = nn.Sequential(
            ResidualBlock(256, 512, stride=2),
            *[ResidualBlock(512, 512) for _ in range(1, 4)]
        )
        self.layer3 = nn.Sequential(
            ResidualBlock(512, 1024, stride=2),
            *[ResidualBlock(1024, 1024) for _ in range(1, 6)]
        )
        self.layer4 = nn.Sequential(
            ResidualBlock(1024, 2048, stride=2),
            *[ResidualBlock(2048, 2048) for _ in range(1, 3)]
        )
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.flatten = Flatten()
        self.fc = nn.Linear(2048, num_classes)
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
            elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):
                init.constant_(m.weight, 1)
                init.constant_(m.bias, 0)
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = self.avgpool(x)
        x = self.flatten(x)
        x = self.fc(x)
        return x

改進(jìn)點(diǎn)如下:

  • 我們使用nn.Sequential組件,將多個(gè)殘差塊組合成一個(gè)功能塊(layer)。這樣可以方便地修改網(wǎng)絡(luò)深度,并將其與其他層分離九更容易上手,例如遷移學(xué)習(xí)中重新訓(xùn)練頂部分類(lèi)器時(shí)。
  • 我們?cè)赗esNet的輸出層添加了標(biāo)準(zhǔn)化和激活函數(shù)。它們有助于提高模型的收斂速度并改善性能。
  • 對(duì)于nn.Conv2d和批標(biāo)準(zhǔn)化層等神經(jīng)網(wǎng)絡(luò)組件,我們使用了PyTorch中的內(nèi)置初始化函數(shù)。它們會(huì)自動(dòng)為我們?cè)O(shè)置好每層的參數(shù)。
  • 我們還添加了一個(gè)Flatten層,將4維輸出展平為2維張量,以便通過(guò)接下來(lái)的全連接層進(jìn)行分類(lèi)。

訓(xùn)練模型

我們現(xiàn)在已經(jīng)實(shí)現(xiàn)了ResNet50模型,接下來(lái)我們將解釋如何訓(xùn)練和測(cè)試該模型。

首先我們需要定義損失函數(shù)和優(yōu)化器。在這里,我們使用交叉熵?fù)p失函數(shù),以及Adam優(yōu)化器。

import torch.optim as optim
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = ResNet(num_classes=1000).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

在使用PyTorch進(jìn)行訓(xùn)練時(shí),我們通常會(huì)創(chuàng)建一個(gè)循環(huán),為每個(gè)批次的輸入數(shù)據(jù)計(jì)算損失并對(duì)模型參數(shù)進(jìn)行更新。以下是該循環(huán)的代碼:

def train(model, optimizer, criterion, train_loader, device):
    model.train()
    train_loss = 0
    correct = 0
    total = 0
    for batch_idx, (inputs, targets) in enumerate(train_loader):
        inputs, targets = inputs.to(device), targets.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()
        train_loss += loss.item()
        _, predicted = outputs.max(1)
        total += targets.size(0)
        correct += predicted.eq(targets).sum().item()
    acc = 100 * correct / total
    avg_loss = train_loss / len(train_loader)
    return acc, avg_loss

在上面的訓(xùn)練循環(huán)中,我們首先通過(guò)model.train()代表進(jìn)入訓(xùn)練模式。然后使用optimizer.zero_grad()清除

以上就是利用Pytorch實(shí)現(xiàn)ResNet網(wǎng)絡(luò)構(gòu)建及模型訓(xùn)練的詳細(xì)內(nèi)容,更多關(guān)于Pytorch ResNet構(gòu)建網(wǎng)絡(luò)模型訓(xùn)練的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談flask截獲所有訪問(wèn)及before/after_request修飾器

    淺談flask截獲所有訪問(wèn)及before/after_request修飾器

    這篇文章主要介紹了淺談flask截獲所有訪問(wèn)及before/after_request修飾器,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 詳解Python是如何實(shí)現(xiàn)issubclass的

    詳解Python是如何實(shí)現(xiàn)issubclass的

    這篇文章主要介紹了詳解Python是如何實(shí)現(xiàn)issubclass的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python第三方異步日志庫(kù)loguru簡(jiǎn)介

    python第三方異步日志庫(kù)loguru簡(jiǎn)介

    在編寫(xiě)調(diào)試Python代碼過(guò)程中,我們經(jīng)常需要記錄日志,通常我們會(huì)采用python自帶的內(nèi)置標(biāo)準(zhǔn)庫(kù)logging,但是使用該庫(kù),配置較為繁瑣。為了提升編程效率,本文重點(diǎn)介紹最近發(fā)現(xiàn)的一個(gè)寶藏第三方日志庫(kù)Loguru,感興趣的朋友一起看看吧
    2022-12-12
  • Jupyter notebook之如何快速打開(kāi)ipynb文件

    Jupyter notebook之如何快速打開(kāi)ipynb文件

    這篇文章主要介紹了Jupyter notebook之如何快速打開(kāi)ipynb文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python中的閉包詳細(xì)介紹和實(shí)例

    Python中的閉包詳細(xì)介紹和實(shí)例

    這篇文章主要介紹了Python中的閉包詳細(xì)介紹和實(shí)例,本文先是詳細(xì)講解了閉包的相關(guān)知識(shí),然后給出了python中閉包例子、lamada例子,需要的朋友可以參考下
    2014-11-11
  • Python基礎(chǔ)教程,Python入門(mén)教程(超詳細(xì))

    Python基礎(chǔ)教程,Python入門(mén)教程(超詳細(xì))

    Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì) 于1990 年代初設(shè)計(jì),作為一門(mén)叫做ABC語(yǔ)言的替代品。Python語(yǔ)法和動(dòng)態(tài)類(lèi)型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速開(kāi)發(fā)應(yīng)用的編程語(yǔ)言
    2021-06-06
  • 深度理解Python中Class類(lèi)、Object類(lèi)、Type元類(lèi)

    深度理解Python中Class類(lèi)、Object類(lèi)、Type元類(lèi)

    本文主要介紹了深度理解Python中Class類(lèi)、Object類(lèi)、Type元類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Python中單下劃線和雙下劃線的使用詳解

    Python中單下劃線和雙下劃線的使用詳解

    在Python編程中,我們經(jīng)常會(huì)遇到單下劃線(_)和雙下劃線(__)的使用,本文就來(lái)和大家詳細(xì)講講單下劃線和雙下劃線的含義和用法,希望對(duì)大家有所幫助
    2023-06-06
  • 一篇文章搞懂Python的文件路徑操作

    一篇文章搞懂Python的文件路徑操作

    這篇文章主要給大家介紹了關(guān)于Python文件路徑操作的相關(guān)資料,在python中我們會(huì)經(jīng)常的對(duì)文件使用路徑,文件路徑通常有兩種,分別為絕對(duì)路徑、相對(duì)路徑,需要的朋友可以參考下
    2023-07-07
  • python?turtle繪制多邊形和跳躍和改變速度特效

    python?turtle繪制多邊形和跳躍和改變速度特效

    這篇文章主要介紹了python?turtle繪制多邊形和跳躍和改變速度特效,文章實(shí)現(xiàn)過(guò)程詳細(xì),需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-03-03

最新評(píng)論