在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyTorch教程-8.2. 使用塊的網絡 (VGG)

jf_pJlTbmA9 ? 來源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:44 ? 次閱讀

雖然 AlexNet 提供了深度 CNN 可以取得良好結果的經驗證據,但它沒有提供通用模板來指導后續研究人員設計新網絡。在接下來的部分中,我們將介紹幾個常用于設計深度網絡的啟發式概念。

該領域的進展反映了芯片設計中 VLSI(超大規模集成)的進展,工程師從將晶體管放置到邏輯元件再到邏輯塊(Mead,1980 年)。同樣,神經網絡架構的設計也變得越來越抽象,研究人員從單個神經元的角度思考到整個層,現在轉向塊,重復層的模式。十年后,這已經發展到研究人員使用整個訓練模型將它們重新用于不同但相關的任務。此類大型預訓練模型通常稱為 基礎模型 (Bommasani等人,2021 年)。

回到網絡設計。使用塊的想法首先出現于牛津大學的視覺幾何組 (VGG),在他們同名的VGG網絡中(Simonyan 和 Zisserman,2014 年)。通過使用循環和子例程,可以使用任何現代深度學習框架輕松地在代碼中實現這些重復結構。

import torch
from torch import nn
from d2l import torch as d2l

from mxnet import init, np, npx
from mxnet.gluon import nn
from d2l import mxnet as d2l

npx.set_np()

import jax
from flax import linen as nn
from d2l import jax as d2l

import tensorflow as tf
from d2l import tensorflow as d2l

8.2.1. VGG 塊

CNN 的基本構建塊是以下序列:(i) 帶有填充的卷積層以保持分辨率,(ii) 非線性,例如 ReLU,(iii) 池化層,例如最大池化以減少解決。這種方法的問題之一是空間分辨率下降得非???。特別是,這強加了一個硬限制log2?d網絡上所有維度之前的卷積層(d) 用完了。例如,在 ImageNet 的情況下,以這種方式不可能有超過 8 個卷積層。

Simonyan 和 Zisserman ( 2014 )的關鍵思想是以 塊的形式通過最大池化在下采樣之間使用多個卷積。他們主要感興趣的是深度網絡還是寬網??絡表現更好。例如,連續應用兩個 3×3卷積接觸與單個相同的像素 5×5卷積確實如此。同時,后者使用了大約同樣多的參數(25?c2) 三個 3×3卷積做(3?9?c2). 在相當詳細的分析中,他們表明深度和狹窄的網絡明顯優于淺層網絡。這將深度學習置于對具有超過 100 層的典型應用的更深網絡的追求上。堆疊3×3卷積已成為后來的深度網絡的黃金標準(最近Liu等人( 2022 )才重新考慮的設計決策)。因此,小卷積的快速實現已成為 GPU 的主要內容 (Lavin 和 Gray,2016 年)。

回到 VGG:一個 VGG 塊由一系列卷積組成 3×3填充為 1 的內核(保持高度和寬度)后跟一??個2×2步長為 2 的最大池化層(每個塊后將高度和寬度減半)。在下面的代碼中,我們定義了一個函數vgg_block來實現一個 VGG 塊。

下面的函數有兩個參數,對應于卷積層數num_convs和輸出通道數 num_channels。

def vgg_block(num_convs, out_channels):
  layers = []
  for _ in range(num_convs):
    layers.append(nn.LazyConv2d(out_channels, kernel_size=3, padding=1))
    layers.append(nn.ReLU())
  layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
  return nn.Sequential(*layers)

def vgg_block(num_convs, num_channels):
  blk = nn.Sequential()
  for _ in range(num_convs):
    blk.add(nn.Conv2D(num_channels, kernel_size=3,
             padding=1, activation='relu'))
  blk.add(nn.MaxPool2D(pool_size=2, strides=2))
  return blk

def vgg_block(num_convs, out_channels):
  layers = []
  for _ in range(num_convs):
    layers.append(nn.Conv(out_channels, kernel_size=(3, 3), padding=(1, 1)))
    layers.append(nn.relu)
  layers.append(lambda x: nn.max_pool(x, window_shape=(2, 2), strides=(2, 2)))
  return nn.Sequential(layers)

def vgg_block(num_convs, num_channels):
  blk = tf.keras.models.Sequential()
  for _ in range(num_convs):
    blk.add(
      tf.keras.layers.Conv2D(num_channels, kernel_size=3,
                  padding='same', activation='relu'))
  blk.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
  return blk

8.2.2. VGG網絡

與 AlexNet 和 LeNet 一樣,VGG 網絡可以分為兩部分:第一部分主要由卷積層和池化層組成,第二部分由與 AlexNet 相同的全連接層組成。關鍵區別在于卷積層在保持維數不變的非線性變換中分組,然后是分辨率降低步驟,如圖 8.2.1所示。

poYBAGR9NYmAAu3EAATuF75_NS8172.svg

圖 8.2.1從 AlexNet 到 VGG。關鍵區別在于 VGG 由層塊組成,而 AlexNet 的層都是單獨設計的。

網絡的卷積部分連續連接 圖 8.2.1中的幾個 VGG 塊(也在vgg_block函數中定義)。這種卷積分組是一種在過去十年中幾乎保持不變的模式,盡管操作的具體選擇已經發生了相當大的修改。該變量 conv_arch由一個元組列表(每個塊一個)組成,其中每個元組包含兩個值:卷積層數和輸出通道數,它們正是調用函數所需的參數vgg_block。因此,VGG 定義了一個網絡家族,而不僅僅是一個特定的表現形式。要構建一個特定的網絡,我們只需迭代arch以組成塊。

class VGG(d2l.Classifier):
  def __init__(self, arch, lr=0.1, num_classes=10):
    super().__init__()
    self.save_hyperparameters()
    conv_blks = []
    for (num_convs, out_channels) in arch:
      conv_blks.append(vgg_block(num_convs, out_channels))
    self.net = nn.Sequential(
      *conv_blks, nn.Flatten(),
      nn.LazyLinear(4096), nn.ReLU(), nn.Dropout(0.5),
      nn.LazyLinear(4096), nn.ReLU(), nn.Dropout(0.5),
      nn.LazyLinear(num_classes))
    self.net.apply(d2l.init_cnn)

class VGG(d2l.Classifier):
  def __init__(self, arch, lr=0.1, num_classes=10):
    super().__init__()
    self.save_hyperparameters()
    self.net = nn.Sequential()
    for (num_convs, num_channels) in arch:
      self.net.add(vgg_block(num_convs, num_channels))
    self.net.add(nn.Dense(4096, activation='relu'), nn.Dropout(0.5),
           nn.Dense(4096, activation='relu'), nn.Dropout(0.5),
           nn.Dense(num_classes))
    self.net.initialize(init.Xavier())

class VGG(d2l.Classifier):
  arch: list
  lr: float = 0.1
  num_classes: int = 10
  training: bool = True

  def setup(self):
    conv_blks = []
    for (num_convs, out_channels) in self.arch:
      conv_blks.append(vgg_block(num_convs, out_channels))

    self.net = nn.Sequential([
      *conv_blks,
      lambda x: x.reshape((x.shape[0], -1)), # flatten
      nn.Dense(4096), nn.relu,
      nn.Dropout(0.5, deterministic=not self.training),
      nn.Dense(4096), nn.relu,
      nn.Dropout(0.5, deterministic=not self.training),
      nn.Dense(self.num_classes)])

class VGG(d2l.Classifier):
  def __init__(self, arch, lr=0.1, num_classes=10):
    super().__init__()
    self.save_hyperparameters()
    self.net = tf.keras.models.Sequential()
    for (num_convs, num_channels) in arch:
      self.net.add(vgg_block(num_convs, num_channels))
    self.net.add(
      tf.keras.models.Sequential([
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(4096, activation='relu'),
      tf.keras.layers.Dropout(0.5),
      tf.keras.layers.Dense(4096, activation='relu'),
      tf.keras.layers.Dropout(0.5),
      tf.keras.layers.Dense(num_classes)]))

原始VGG網絡有5個卷積塊,其中前兩個各有一個卷積層,后三個各有兩個卷積層。第一個塊有 64 個輸出通道,隨后的每個塊將輸出通道的數量加倍,直到該數量達到 512。由于該網絡使用 8 個卷積層和 3 個全連接層,因此通常稱為 VGG-11。

VGG(arch=((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))).layer_summary(
  (1, 1, 224, 224))

Sequential output shape:   torch.Size([1, 64, 112, 112])
Sequential output shape:   torch.Size([1, 128, 56, 56])
Sequential output shape:   torch.Size([1, 256, 28, 28])
Sequential output shape:   torch.Size([1, 512, 14, 14])
Sequential output shape:   torch.Size([1, 512, 7, 7])
Flatten output shape:    torch.Size([1, 25088])
Linear output shape:     torch.Size([1, 4096])
ReLU output shape:  torch.Size([1, 4096])
Dropout output shape:    torch.Size([1, 4096])
Linear output shape:     torch.Size([1, 4096])
ReLU output shape:  torch.Size([1, 4096])
Dropout output shape:    torch.Size([1, 4096])
Linear output shape:     torch.Size([1, 10])

VGG(arch=((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))).layer_summary(
  (1, 1, 224, 224))

Sequential output shape:   (1, 64, 112, 112)
Sequential output shape:   (1, 128, 56, 56)
Sequential output shape:   (1, 256, 28, 28)
Sequential output shape:   (1, 512, 14, 14)
Sequential output shape:   (1, 512, 7, 7)
Dense output shape: (1, 4096)
Dropout output shape:    (1, 4096)
Dense output shape: (1, 4096)
Dropout output shape:    (1, 4096)
Dense output shape: (1, 10)

VGG(arch=((1, 64), (1, 128), (2, 256), (2, 512), (2, 512)),
  training=False).layer_summary((1, 224, 224, 1))

Sequential output shape:   (1, 112, 112, 64)
Sequential output shape:   (1, 56, 56, 128)
Sequential output shape:   (1, 28, 28, 256)
Sequential output shape:   (1, 14, 14, 512)
Sequential output shape:   (1, 7, 7, 512)
function output shape:    (1, 25088)
Dense output shape: (1, 4096)
custom_jvp output shape:   (1, 4096)
Dropout output shape:    (1, 4096)
Dense output shape: (1, 4096)
custom_jvp output shape:   (1, 4096)
Dropout output shape:    (1, 4096)
Dense output shape: (1, 10)

VGG(arch=((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))).layer_summary(
  (1, 224, 224, 1))

Sequential output shape:   (1, 112, 112, 64)
Sequential output shape:   (1, 56, 56, 128)
Sequential output shape:   (1, 28, 28, 256)
Sequential output shape:   (1, 14, 14, 512)
Sequential output shape:   (1, 7, 7, 512)
Sequential output shape:   (1, 10)

如您所見,我們將每個塊的高度和寬度減半,最終達到 7 的高度和寬度,然后展平表示以供網絡的完全連接部分處理。 Simonyan 和 Zisserman ( 2014 )描述了 VGG 的其他幾種變體。事實上,在引入新架構時,提出具有不同速度-精度權衡的網絡系列已經成為常態。

8.2.3. 訓練

由于 VGG-11 在計算上比 AlexNet 要求更高,我們構建了一個通道數較少的網絡。這對于 Fashion-MNIST 的訓練來說綽綽有余。模型訓練過程與8.1節AlexNet類似。再次觀察驗證和訓練損失之間的密切匹配,表明只有少量過度擬合。

model = VGG(arch=((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr=0.01)
trainer = d2l.Trainer(max_epochs=10, num_gpus=1)
data = d2l.FashionMNIST(batch_size=128, resize=(224, 224))
model.apply_init([next(iter(data.get_dataloader(True)))[0]], d2l.init_cnn)
trainer.fit(model, data)

pYYBAGR9NY2ALRgLAAFz9nbZ9_c991.svg

model = VGG(arch=((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr=0.01)
trainer = d2l.Trainer(max_epochs=10, num_gpus=1)
data = d2l.FashionMNIST(batch_size=128, resize=(224, 224))
trainer.fit(model, data)

poYBAGR9NZCAQzgBAAFoKAqSRnE162.svg

model = VGG(arch=((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr=0.01)
trainer = d2l.Trainer(max_epochs=10, num_gpus=1)
data = d2l.FashionMNIST(batch_size=128, resize=(224, 224))
trainer.fit(model, data)

poYBAGR9NZKAf5RDAAGYR-srCos434.svg

trainer = d2l.Trainer(max_epochs=10)
data = d2l.FashionMNIST(batch_size=128, resize=(224, 224))
with d2l.try_gpu():
  model = VGG(arch=((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr=0.01)
  trainer.fit(model, data)

pYYBAGR9NZSAWCLTAAF1ABY3Nyk178.svg

8.2.4. 概括

有人可能會爭辯說 VGG 是第一個真正現代的卷積神經網絡。雖然 AlexNet 引入了許多使深度學習大規模有效的組件,但可以說是 VGG 引入了關鍵屬性,例如多個卷積塊以及對深度和窄網絡的偏好。它也是第一個實際上是整個類似參數化模型系列的網絡,為從業者提供了復雜性和速度之間的充分權衡。這也是現代深度學習框架大放異彩的地方。不再需要生成 XML 配置文件來指定網絡,而是通過簡單的 Python 代碼組裝所述網絡。

最近 ParNet (Goyal等人,2021 年) 證明,可以通過大量并行計算使用更淺的架構來實現有競爭力的性能。這是一個令人興奮的發展,希望它能影響未來的建筑設計。不過,在本章的剩余部分,我們將追溯過去十年的科學進步之路。

8.2.5. 練習

與 AlexNet 相比,VGG 在計算方面要慢得多,而且需要更多的 GPU 內存。

比較 AlexNet 和 VGG 所需的參數數量。

比較卷積層和全連接層中使用的浮點運算數量。

您如何減少全連接層產生的計算成本?

當顯示與網絡各層相關的維度時,我們只能看到與 8 個塊(加上一些輔助變換)相關的信息,即使網絡有 11 層。剩下的 3 層去了哪里?

使用 VGG 論文(Simonyan 和 Zisserman,2014 年)中的表 1構建其他常見模型,例如 VGG-16 或 VGG-19。

對 Fashion-MNIST 中的分辨率進行上采樣8 從28×28到224×224尺寸非常浪費。嘗試修改網絡架構和分辨率轉換,例如,將其輸入改為 56 或 84 維。你能在不降低網絡準確性的情況下這樣做嗎?考慮 VGG 論文(Simonyan 和 Zisserman,2014 年),了解在下采樣之前添加更多非線性的想法。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 網絡
    +關注

    關注

    14

    文章

    7780

    瀏覽量

    90479
  • pytorch
    +關注

    關注

    2

    文章

    809

    瀏覽量

    13791
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    VGG介紹卷積神經網絡的模型結構

    VGG在加深網絡層數同時為了避免參數過多,在所有層都采用3x3的小卷積核,卷積層步長被設置為1。
    發表于 01-05 09:29 ?8840次閱讀
    <b class='flag-5'>VGG</b>介紹卷積神經<b class='flag-5'>網絡</b>的模型結構

    基于PyTorch的深度學習入門教程之使用PyTorch構建一個神經網絡

    PyTorch的自動梯度計算 Part3:使用PyTorch構建一個神經網絡 Part4:訓練一個神經網絡分類器 Part5:數據并行化 本文是關于Part3的內容。 Part3:使
    的頭像 發表于 02-15 09:40 ?2294次閱讀

    【周易AIPU 仿真】在R329上部署VGG_16網絡模型

    經過一周多時間的探索,參考了n篇歷程,跑通了倆個網絡模型,這里記錄一下VGG\_16網絡模型的部署。全部操作都是在虛擬機的Ubuntu14.04操...
    發表于 01-25 17:29 ?1次下載
    【周易AIPU 仿真】在R329上部署<b class='flag-5'>VGG</b>_16<b class='flag-5'>網絡</b>模型

    如何搭建VGG網絡實現Mnist數據集的圖像分類

    如何搭建VGG網絡,實現Mnist數據集的圖像分類? 2 方法 步驟:
    的頭像 發表于 02-14 15:00 ?922次閱讀

    如何使用VGG網絡進行MNIST圖像分類

    VGG網絡,可以應用在人臉識別、圖像分類等方面。VGG有兩種結構,分別為16層和19層。具體結構在其文獻做了詳細表述
    的頭像 發表于 02-17 15:06 ?1111次閱讀
    如何使用<b class='flag-5'>VGG</b><b class='flag-5'>網絡</b>進行MNIST圖像分類

    PyTorch教程8.2之使用網絡(VGG)

    電子發燒友網站提供《PyTorch教程8.2之使用網絡(VGG).pdf》資料免費下載
    發表于 06-05 10:11 ?0次下載
    <b class='flag-5'>PyTorch</b>教程8.2之使用<b class='flag-5'>塊</b>的<b class='flag-5'>網絡</b>(<b class='flag-5'>VGG</b>)

    PyTorch教程8.4之多分支網絡(GoogLeNet)

    電子發燒友網站提供《PyTorch教程8.4之多分支網絡(GoogLeNet).pdf》資料免費下載
    發表于 06-05 10:03 ?0次下載
    <b class='flag-5'>PyTorch</b>教程8.4之多分支<b class='flag-5'>網絡</b>(GoogLeNet)

    PyTorch教程8.7之密集連接網絡(DenseNet)

    電子發燒友網站提供《PyTorch教程8.7之密集連接網絡(DenseNet).pdf》資料免費下載
    發表于 06-05 10:01 ?0次下載
    <b class='flag-5'>PyTorch</b>教程8.7之密集連接<b class='flag-5'>網絡</b>(DenseNet)

    PyTorch教程8.8之設計卷積網絡架構

    電子發燒友網站提供《PyTorch教程8.8之設計卷積網絡架構.pdf》資料免費下載
    發表于 06-05 10:02 ?0次下載
    <b class='flag-5'>PyTorch</b>教程8.8之設計卷積<b class='flag-5'>網絡</b>架構

    PyTorch教程之循環神經網絡

    電子發燒友網站提供《PyTorch教程之循環神經網絡.pdf》資料免費下載
    發表于 06-05 09:52 ?0次下載
    <b class='flag-5'>PyTorch</b>教程之循環神經<b class='flag-5'>網絡</b>

    PyTorch教程14.11之全卷積網絡

    電子發燒友網站提供《PyTorch教程14.11之全卷積網絡.pdf》資料免費下載
    發表于 06-05 11:19 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.11之全卷積<b class='flag-5'>網絡</b>

    使用PyTorch構建神經網絡

    PyTorch是一個流行的深度學習框架,它以其簡潔的API和強大的靈活性在學術界和工業界得到了廣泛應用。在本文中,我們將深入探討如何使用PyTorch構建神經網絡,包括從基礎概念到高級特性的全面解析。本文旨在為讀者提供一個完整的
    的頭像 發表于 07-02 11:31 ?1013次閱讀

    如何使用PyTorch建立網絡模型

    PyTorch是一個基于Python的開源機器學習庫,因其易用性、靈活性和強大的動態圖特性,在深度學習領域得到了廣泛應用。本文將從PyTorch的基本概念、網絡模型構建、優化方法、實際應用等多個方面,深入探討使用
    的頭像 發表于 07-02 14:08 ?797次閱讀

    PyTorch神經網絡模型構建過程

    PyTorch,作為一個廣泛使用的開源深度學習庫,提供了豐富的工具和模塊,幫助開發者構建、訓練和部署神經網絡模型。在神經網絡模型中,輸出層是尤為關鍵的部分,它負責將模型的預測結果以合適的形式輸出。以下將詳細解析
    的頭像 發表于 07-10 14:57 ?845次閱讀

    pytorch中有神經網絡模型嗎

    當然,PyTorch是一個廣泛使用的深度學習框架,它提供了許多預訓練的神經網絡模型。 PyTorch中的神經網絡模型 1. 引言 深度學習是一種基于人工神經
    的頭像 發表于 07-11 09:59 ?1574次閱讀
    主站蜘蛛池模板: 国模私拍在线视频 | 一道精品一区二区三区 | 国产亚洲精品久久yy5099 | 日本特黄特色aaa大片免费欧 | 性欧美网站 | 在线看免费视频 | 羞羞视频靠逼视频大全 | 午夜爽爽性刺激一区二区视频 | 一级a性色生活片毛片 | 国产高清一级在线观看 | 欧美色亚洲图 | 四虎亚洲精品 | 国产在线精品美女观看 | 亚洲国产精品丝袜在线观看 | 亚洲国产第一区二区香蕉 | 国产欧美另类第一页 | 国产精品久线观看视频 | 毛色毛片 | 日日天天干 | 亚洲高清一区二区三区 | 久久久国产精品免费看 | 久久久久国产精品免费网站 | 日日碰狠狠添天天爽五月婷 | 欧美在线视频7777kkkk | aaaaaaa毛片 | 欧美成人一区二区三区在线视频 | 女人被两根一起进3p在线观看 | 国产日本特黄特色大片免费视频 | 爽好舒服快给老师 | 免费看大黄 | 狼人久草 | 额去鲁97在线观看视频 | 免费毛片网 | 午夜视频免费在线观看 | 亚洲 欧美 日韩 在线 中文字幕 | 亚洲国产婷婷香蕉久久久久久 | 猛操在线 | 欧美三级中文字幕hd | 伊人成伊人成综合网2222 | 午夜欧美精品 | 日本xxxxxxxxx69|