ResNet 顯著改變了如何在深度網(wǎng)絡(luò)中參數(shù)化函數(shù)的觀點(diǎn)。DenseNet(密集卷積網(wǎng)絡(luò))在某種程度上是對(duì)此的邏輯延伸 (Huang et al. , 2017)。DenseNet 的特點(diǎn)是每一層都連接到所有前面的層的連接模式和連接操作(而不是 ResNet 中的加法運(yùn)算符)以保留和重用早期層的特征。要了解如何得出它,讓我們稍微繞道數(shù)學(xué)。
import tensorflow as tf
from d2l import tensorflow as d2l
8.7.1. 從 ResNet 到 DenseNet
回憶一下函數(shù)的泰勒展開式。對(duì)于這一點(diǎn)x=0 它可以寫成
關(guān)鍵是它將函數(shù)分解為越來越高階的項(xiàng)。同樣,ResNet 將函數(shù)分解為
也就是說,ResNet分解f分為一個(gè)簡單的線性項(xiàng)和一個(gè)更復(fù)雜的非線性項(xiàng)。如果我們想捕獲(不一定要添加)兩個(gè)術(shù)語以外的信息怎么辦?一種這樣的解決方案是 DenseNet (Huang等人,2017 年)。
如圖 8.7.1所示,ResNet 和 DenseNet 的主要區(qū)別在于后者的輸出是 連接的(表示為[,]) 而不是添加。結(jié)果,我們從x在應(yīng)用越來越復(fù)雜的函數(shù)序列后,它的值:
最后,將所有這些功能組合在 MLP 中,再次減少特征數(shù)量。就實(shí)現(xiàn)而言,這非常簡單:我們不是添加術(shù)語,而是將它們連接起來。DenseNet 這個(gè)名字源于變量之間的依賴圖變得非常密集這一事實(shí)。這種鏈的最后一層與前面的所有層緊密相連。密集連接如圖 8.7.2所示 。
構(gòu)成 DenseNet 的主要組件是密集塊和 過渡層。前者定義輸入和輸出如何連接,而后者控制通道的數(shù)量,使其不會(huì)太大,因?yàn)閿U(kuò)展 x→[x,f1(x),f2([x,f1(x)]),…] 可以是相當(dāng)高維的。
8.7.2. 密集塊
DenseNet 使用改進(jìn)的 ResNet 的“批量歸一化、激活和卷積”結(jié)構(gòu)(參見第 8.6 節(jié)中的練習(xí) )。首先,我們實(shí)現(xiàn)這個(gè)卷積塊結(jié)構(gòu)。
def conv_block(num_channels):
return nn.Sequential(
nn.LazyBatchNorm2d(), nn.ReLU(),
nn.LazyConv2d(num_channels, kernel_size=3, padding=1))
class ConvBlock(nn.Module):
num_channels: int
training: bool = True
@nn.compact
def __call__(self, X):
Y = nn.relu(nn.BatchNorm(not self.training)(X))
Y = nn.Conv(self.num_channels, kernel_size=(3, 3), padding=(1, 1))(Y)
Y = jnp.
評(píng)論
查看更多