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