<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    關(guān)于跳躍連接你需要知道的一切

    共 8319字,需瀏覽 17分鐘

     ·

    2021-10-13 21:18

    點(diǎn)擊下方AI算法與圖像處理”,一起進(jìn)步!

    重磅干貨,第一時(shí)間送達(dá)

    介紹
    我們需要訓(xùn)練更深的網(wǎng)絡(luò)來執(zhí)行復(fù)雜的任務(wù)。訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)很復(fù)雜,不僅限于過度擬合、高計(jì)算成本,而且還有一些不一般的問題。我們將解決這些問題,以及深度學(xué)習(xí)社區(qū)的人們是如何解決這些問題的。讓我們進(jìn)入文章吧!

    目錄

    1. 為什么需要跳躍連接?
    2. 什么是跳躍連接?
    3. 跳躍連接的變體
    4. 跳躍連接的實(shí)現(xiàn)

    為什么要跳躍連接?

    深度神經(jīng)網(wǎng)絡(luò)的美妙之處在于它們可以比淺層神經(jīng)網(wǎng)絡(luò)更有效地學(xué)習(xí)復(fù)雜的功能。在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),模型的性能隨著架構(gòu)深度的增加而下降。這被稱為退化問題。
    但是,隨著網(wǎng)絡(luò)深度的增加,模型的性能下降的原因可能是什么?讓我們嘗試了解退化問題的原因。
    可能的原因之一是過度擬合。隨著深度的增加,模型往往會過度擬合,但這里的情況并非如此。從下圖可以看出,56 層的深層網(wǎng)絡(luò)比 20 層的淺層網(wǎng)絡(luò)具有更多的訓(xùn)練誤差。較深的模型表現(xiàn)不如淺模型好。 顯然,過擬合不是這里的問題。
    20 層和 56 層 NN 的訓(xùn)練和測試誤差
    另一個(gè)可能的原因可能是梯度消失和/或梯度爆炸問題。然而,ResNet(https://arxiv.org/abs/1512.03385)的作者(He 等人)認(rèn)為,使用批量歸一化和通過歸一化正確初始化權(quán)重可確保梯度具有合適的標(biāo)準(zhǔn)。但是,這里出了什么問題?讓我們通過構(gòu)造來理解這一點(diǎn)。
    考慮一個(gè)在數(shù)據(jù)集上訓(xùn)練的淺層神經(jīng)網(wǎng)絡(luò)。此外,考慮一個(gè)更深的網(wǎng)絡(luò),其中初始層與淺層網(wǎng)絡(luò)(下圖中的藍(lán)色層)具有相同的權(quán)重矩陣,并添加了一些額外的層(綠色層)。我們將添加層的權(quán)重矩陣設(shè)置為恒等矩陣(恒等映射)。
    從這個(gè)構(gòu)造來看,更深的網(wǎng)絡(luò)不應(yīng)產(chǎn)生比其淺的網(wǎng)絡(luò)更高的訓(xùn)練誤差,因?yàn)槲覀儗?shí)際上是在具有附加恒等層的更深網(wǎng)絡(luò)中使用淺模型的權(quán)重。
    但實(shí)驗(yàn)證明,與淺層網(wǎng)絡(luò)相比,深層網(wǎng)絡(luò)會產(chǎn)生較高的訓(xùn)練誤差。這表明更深層無法學(xué)習(xí)甚至恒等映射。
    訓(xùn)練精度的下降表明并非所有系統(tǒng)都同樣易于優(yōu)化。
    主要原因之一是權(quán)重的隨機(jī)初始化,均值在零、L1 和 L2 正則化附近。結(jié)果,模型中的權(quán)重總是在零左右,因此更深的層也無法學(xué)習(xí)恒等映射。
    這里出現(xiàn)了跳躍連接的概念,它使我們能夠訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)?,F(xiàn)在讓我們學(xué)習(xí)這個(gè)很棒的概念。

    什么是跳躍連接?

    顧名思義,Skip Connections(或 Shortcut Connections),跳躍連接,會跳躍神經(jīng)網(wǎng)絡(luò)中的某些層,并將一層的輸出作為下一層的輸入。
    引入跳躍連接是為了解決不同架構(gòu)中的不同問題。在 ResNets 的情況下,跳躍連接解決了我們之前解決的退化問題,而在 DenseNets 的情況下,它確保了特征的可重用性。我們將在以下部分詳細(xì)討論它們。
    甚至在殘差網(wǎng)絡(luò)之前,有的文獻(xiàn)中就引入了跳躍連接。例如,Highway Networks(https://arxiv.org/abs/1505.00387)(Srivastava 等人)跳躍了與控制和學(xué)習(xí)信息流到更深層的門的連接。這個(gè)概念類似于 LSTM 中的門控機(jī)制。盡管 ResNets 實(shí)際上是 Highway Networks的一個(gè)特例,但與 ResNets 相比,其性能并不達(dá)標(biāo)。這表明保持 Highway 梯度的暢通比gate機(jī)制更好!
    神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)任意復(fù)雜度的任何函數(shù),可以是高維和非凸函數(shù)。可視化有可能幫助我們回答幾個(gè)關(guān)于神經(jīng)網(wǎng)絡(luò)為何起作用的重要問題。
    實(shí)際上,Li 等人(https://arxiv.org/abs/1712.09913)做了一些不錯(cuò)的工作。這使我們能夠可視化復(fù)雜的損失表面。具有跳躍連接的網(wǎng)絡(luò)的結(jié)果更令人驚訝!
    有跳躍連接和沒有跳躍連接的 ResNet-56 的損失表面
    正如你在此處看到的,具有跳躍連接的神經(jīng)網(wǎng)絡(luò)的損失表面更平滑,因此比沒有任何跳躍連接的網(wǎng)絡(luò)收斂速度更快。讓我們在下一節(jié)中看到跳躍連接的變體。

    跳躍連接的變體

    在本節(jié)中,我們將看到不同架構(gòu)中跳躍連接的變體。跳躍連接可以在神經(jīng)網(wǎng)絡(luò)中以兩種基本方式使用:加法和串聯(lián)。
    殘差網(wǎng)絡(luò)(ResNets)
    殘差網(wǎng)絡(luò)是由 He 等人提出的。2015年解決圖像分類問題。在 ResNets 中,來自初始層的信息通過矩陣加法傳遞到更深層。此操作沒有任何附加參數(shù),因?yàn)榍耙粚拥妮敵霰惶砑拥角懊娴膶?。具有跳躍連接的單個(gè)殘差塊如下所示:
    殘差塊
    由于 ResNet 的更深層表示,因?yàn)閬碜栽摼W(wǎng)絡(luò)的預(yù)訓(xùn)練權(quán)重可用于解決多個(gè)任務(wù)。它不僅限于圖像分類,還可以解決圖像分割、關(guān)鍵點(diǎn)檢測和對象檢測方面的廣泛問題。因此,ResNet 是深度學(xué)習(xí)社區(qū)中最具影響力的架構(gòu)之一。
    接下來,我們將了解 DenseNets 中受 ResNets 啟發(fā)的另一種跳躍連接的變體。
    我建議你閱讀以下資源以詳細(xì)了解 ResNet
    • 了解 ResNet 并分析 CIFAR-10 數(shù)據(jù)集上的各種模型:https://www.analyticsvidhya.com/blog/2021/06/understanding-resnet-and-analyzing-various-models-on-the-cifar-10-dataset/
    卷積網(wǎng)絡(luò) (DenseNets)
    DenseNets(https://arxiv.org/abs/1608.06993)是由 Huang 等人提出的。
    ResNets 和 DenseNets 之間的主要區(qū)別在于 DenseNets 將層的輸出特征圖與下一層連接而不是求和。
    談到跳躍連接,DenseNets 使用串聯(lián),而 ResNets 使用求和
    串聯(lián)背后的想法是在更深的層中使用從早期層學(xué)習(xí)的特征。這個(gè)概念被稱為特征可重用性。因此,DenseNets 可以用比傳統(tǒng) CNN 更少的參數(shù)來學(xué)習(xí)映射,因?yàn)椴恍枰獙W(xué)習(xí)冗余映射。

    U-Net:用于生物醫(yī)學(xué)圖像分割的卷積網(wǎng)絡(luò)

    跳躍連接的使用也影響了生物醫(yī)學(xué)領(lǐng)域。U-Net(https://arxiv.org/abs/1505.04597)是由 Ronneberger 等人提出的。用于生物醫(yī)學(xué)圖像分割。它有一個(gè)編碼器-解碼器部分,包括 Skip Connections。
    整體架構(gòu)看起來像英文字母“U”,因此得名 U-Nets。
    編碼器部分中的層與解碼器部分中的層進(jìn)行跳躍連接和級聯(lián)(在上圖中以灰線形式提及)。這使得 U-Nets 使用在編碼器部分學(xué)習(xí)的細(xì)粒度細(xì)節(jié)在解碼器部分構(gòu)建圖像。
    這些類型的連接是長跳躍連接,而我們在 ResNets 中看到的是短跳躍連接。更多關(guān)于 U-Nets在這里:https://medium.com/analytics-vidhya/deep-learning-image-segmentation-and-localization-u-net-architecture-ea4cff5595d9。
    讓我們實(shí)現(xiàn)一個(gè)討論過的架構(gòu)塊以及如何在 PyTorch 中加載和使用它們!

    跳躍連接的實(shí)現(xiàn)

    在本節(jié)中,我們將從頭開始使用 Skip Connections 構(gòu)建 ResNets 和 DesNets。你興奮嗎?我們開始吧!

    ResNet – 殘差塊

    首先,我們將使用跳躍連接實(shí)現(xiàn)一個(gè)殘差塊。PyTorch 是首選,因?yàn)樗哂谐岬奶匦浴嫦驅(qū)ο蟮慕Y(jié)構(gòu)。
    #?import?required?libraries
    import?torch
    from?torch?import?nn
    import?torch.nn.functional?as?F
    import?torchvision


    #?basic?resdidual?block?of?ResNet
    #?This?is?generic?in?the?sense,?it?could?be?used?for?downsampling?of?features.
    class?ResidualBlock(nn.Module):
    ????def?__init__(self,?in_channels,?out_channels,?stride=[1,?1],?downsample=None):
    ????????"""
    ????????A?basic?residual?block?of?ResNet
    ????????Parameters
    ????????----------
    ????????????in_channels:?Number?of?channels?that?the?input?have
    ????????????out_channels:?Number?of?channels?that?the?output?have
    ????????????stride:?strides?in?convolutional?layers
    ????????????downsample:?A?callable?to?be?applied?before?addition?of?residual?mapping
    ????????"""

    ????????super(ResidualBlock,?self).__init__()


    ????????self.conv1?=?nn.Conv2d(
    ????????????in_channels,?out_channels,?kernel_size=3,?stride=stride[0],?
    ????????????padding=1,?bias=False
    ????????)


    ????????self.conv2?=?nn.Conv2d(
    ????????????out_channels,?out_channels,?kernel_size=3,?stride=stride[1],?
    ????????????padding=1,?bias=False
    ????????)


    ????????self.bn?=?nn.BatchNorm2d(out_channels)
    ????????self.downsample?=?downsample


    ????def?forward(self,?x):
    ????????residual?=?x
    ????????#?applying?a?downsample?function?before?adding?it?to?the?output
    ????????if(self.downsample?is?not?None):
    ????????????residual?=?downsample(residual)


    ????????out?=?F.relu(self.bn(self.conv1(x)))
    ????????
    ????????out?=?self.bn(self.conv2(out))
    ????????#?note?that?adding?residual?before?activation?
    ????????out?=?out?+?residual
    ????????out?=?F.relu(out)
    ????????return?out
    由于我們手上有一個(gè) Residual 塊,我們可以構(gòu)建任意深度的 ResNet 模型!讓我們快速構(gòu)建ResNet-34的前五層,以了解如何連接殘差塊。
    #?downsample?using?1?*?1?convolution
    downsample?=?nn.Sequential(
    ????nn.Conv2d(64,?128,?kernel_size=1,?stride=2,?bias=False),
    ????nn.BatchNorm2d(128)
    )
    #?First?five?layers?of?ResNet34
    resnet_blocks?=?nn.Sequential(
    ????nn.Conv2d(3,?64,?kernel_size=7,?stride=2,?padding=3,?bias=False),
    ????nn.MaxPool2d(kernel_size=2,?stride=2),
    ????ResidualBlock(64,?64),
    ????ResidualBlock(64,?64),
    ????ResidualBlock(64,?128,?stride=[2,?1],?downsample=downsample)
    )


    #?checking?the?shape
    inputs?=?torch.rand(1,?3,?100,?100)?#?single?100?*?100?color?image
    outputs?=?resnet_blocks(inputs)
    print(outputs.shape)????#?shape?would?be?(1,?128,?13,?13)
    PyTorch 為我們提供了一種簡單的方法來加載具有在 ImageNet 數(shù)據(jù)集上訓(xùn)練的預(yù)訓(xùn)練權(quán)重的 ResNet 模型。
    #?one?could?also?use?pretrained?weights?of?ResNet?trained?on?ImageNet
    resnet34?=?torchvision.models.resnet34(pretrained=True)

    DenseNet – 殘差塊

    實(shí)現(xiàn)完整的殘差網(wǎng)絡(luò)會有點(diǎn)復(fù)雜。讓我們一步一步實(shí)現(xiàn)。
    1. 實(shí)現(xiàn)一個(gè) DenseNet 層
    2. 建立一個(gè)殘差塊
    3. 連接多個(gè)殘差塊得到一個(gè)殘差網(wǎng)絡(luò)模型
    class?Dense_Layer(nn.Module):
    ????def?__init__(self,?in_channels,?growthrate,?bn_size):
    ????????super(Dense_Layer,?self).__init__()


    ????????self.bn1?=?nn.BatchNorm2d(in_channels)
    ????????self.conv1?=?nn.Conv2d(
    ????????????in_channels,?bn_size?*?growthrate,?kernel_size=1,?bias=False
    ????????)
    ????????self.bn2?=?nn.BatchNorm2d(bn_size?*?growthrate)
    ????????self.conv2?=?nn.Conv2d(
    ????????????bn_size?*?growthrate,?growthrate,?kernel_size=3,?padding=1,?bias=False
    ????????)


    ????def?forward(self,?prev_features):
    ????????out1?=?torch.cat(prev_features,?dim=1)
    ????????out1?=?self.conv1(F.relu(self.bn1(out1)))
    ????????out2?=?self.conv2(F.relu(self.bn2(out1)))
    ????????return?out2
    接下來,我們將實(shí)現(xiàn)一個(gè)由任意數(shù)量的殘差網(wǎng)絡(luò)層組成的殘差塊。
    class?Dense_Block(nn.ModuleDict):
    ????def?__init__(self,?n_layers,?in_channels,?growthrate,?bn_size):
    ????????"""
    ????????A?Dense?block?consists?of?`n_layers`?of?`Dense_Layer`
    ????????Parameters
    ????????----------
    ????????????n_layers:?Number?of?dense?layers?to?be?stacked?
    ????????????in_channels:?Number?of?input?channels?for?first?layer?in?the?block
    ????????????growthrate:?Growth?rate?(k)?as?mentioned?in?DenseNet?paper
    ????????????bn_size:?Multiplicative?factor?for?#?of?bottleneck?layers
    ????????"""

    ????????super(Dense_Block,?self).__init__()


    ????????layers?=?dict()
    ????????for?i?in?range(n_layers):
    ????????????layer?=?Dense_Layer(in_channels?+?i?*?growthrate,?growthrate,?bn_size)
    ????????????layers['dense{}'.format(i)]?=?layer
    ????????
    ????????self.block?=?nn.ModuleDict(layers)
    ????
    ????def?forward(self,?features):
    ????????if(isinstance(features,?torch.Tensor)):
    ????????????features?=?[features]
    ????????
    ????????for?_,?layer?in?self.block.items():
    ????????????new_features?=?layer(features)
    ????????????features.append(new_features)


    ????????return?torch.cat(features,?dim=1)
    從殘差塊中,讓我們構(gòu)建 DenseNet。在這里,為了簡單起見,我省略了 DenseNet 架構(gòu)(充當(dāng)下采樣)的過渡層。
    #?a?block?consists?of?initial?conv?layers?followed?by?6?dense?layers
    dense_block?=?nn.Sequential(
    ????nn.Conv2d(3,?64,?kernel_size=7,?padding=3,?stride=2,?bias=False),
    ????nn.BatchNorm2d(64),
    ????nn.MaxPool2d(3,?2),
    ????Dense_Block(6,?64,?growthrate=32,?bn_size=4),
    )


    inputs?=?torch.rand(1,?3,?100,?100)
    outputs?=?dense_block(inputs)
    print(outputs.shape)????#?shape?would?be?(1,?256,?24,?24)


    #?one?could?also?use?pretrained?weights?of?DenseNet?trained?on?ImageNet
    densenet121?=?torchvision.models.densenet121(pretrained=True)

    尾注

    在本文中,我們討論了跳躍連接對于訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的重要性,以及如何在 ResNet、DenseNet 和 U-Net 及其實(shí)現(xiàn)中使用跳躍連接。我知道,這篇文章涵蓋了很多不容易一口氣掌握的理論。因此,如果你有任何想法,請隨時(shí)發(fā)表評論。
    努力分享優(yōu)質(zhì)的計(jì)算機(jī)視覺相關(guān)內(nèi)容,歡迎關(guān)注:

    交流群


    歡迎加入公眾號讀者群一起和同行交流,目前有美顏、三維視覺、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群


    個(gè)人微信(如果沒有備注不拉群!
    請注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱



    下載1:何愷明頂會分享


    AI算法與圖像處理」公眾號后臺回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析


    下載2:終身受益的編程指南:Google編程風(fēng)格指南


    AI算法與圖像處理」公眾號后臺回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!



    下載3 CVPR2021

    AI算法與圖像處公眾號后臺回復(fù):CVPR,即可下載1467篇CVPR?2020論文 和 CVPR 2021 最新論文


    瀏覽 115
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    黄色视频久久 | 欧美日韩性爱电影网 | 日本天堂视频 | 黑人操逼网 | 日韩操逼网 |