教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線:400-618-4000

VGG的網(wǎng)絡(luò)架構(gòu)有哪些特點(diǎn)?

更新時(shí)間:2023年10月13日18時(shí)15分 來(lái)源:傳智教育 瀏覽次數(shù):

VGG可以看成是加深版的AlexNet,整個(gè)網(wǎng)絡(luò)由卷積層和全連接層疊加而成,和AlexNet不同的是,VGG中使用的都是小尺寸的卷積核(3×3),其網(wǎng)絡(luò)架構(gòu)如下圖所示:

VGG

VGGNet使用的全部都是3x3的小卷積核和2x2的池化核,通過(guò)不斷加深網(wǎng)絡(luò)來(lái)提升性能。VGG可以通過(guò)重復(fù)使用簡(jiǎn)單的基礎(chǔ)塊來(lái)構(gòu)建深度模型。

VGGNET

在tf.keras中實(shí)現(xiàn)VGG模型,首先來(lái)實(shí)現(xiàn)VGG塊,它的組成規(guī)律是:連續(xù)使用多個(gè)相同的填充為1、卷積核大小為[Math Processing Error]3×3的卷積層后接上一個(gè)步幅為2、窗口形狀為[Math Processing Error]2×2的最大池化層。卷積層保持輸入的高和寬不變,而池化層則對(duì)其減半。我們使用vgg_block函數(shù)來(lái)實(shí)現(xiàn)這個(gè)基礎(chǔ)的VGG塊,它可以指定卷積層的數(shù)量num_convs和每層的卷積核個(gè)數(shù)num_filters:

# 定義VGG網(wǎng)絡(luò)中的卷積塊:卷積層的個(gè)數(shù),卷積層中卷積核的個(gè)數(shù)
def vgg_block(num_convs, num_filters):
    # 構(gòu)建序列模型
    blk = tf.keras.models.Sequential()
    # 遍歷所有的卷積層
    for _ in range(num_convs):
        # 每個(gè)卷積層:num_filter個(gè)卷積核,卷積核大小為3*3,padding是same,激活函數(shù)是relu
        blk.add(tf.keras.layers.Conv2D(num_filters,kernel_size=3,
                                    padding='same',activation='relu'))
    # 卷積塊最后是一個(gè)最大池化,窗口大小為2*2,步長(zhǎng)為2
    blk.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
    return blk

VGG16網(wǎng)絡(luò)有5個(gè)卷積塊,前2塊使用兩個(gè)卷積層,而后3塊使用三個(gè)卷積層。第一塊的輸出通道是64,之后每次對(duì)輸出通道數(shù)翻倍,直到變?yōu)?12。

# 定義5個(gè)卷積塊,指明每個(gè)卷積塊中的卷積層個(gè)數(shù)及相應(yīng)的卷積核個(gè)數(shù)
conv_arch = ((2, 64), (2, 128), (3, 256), (3, 512), (3, 512))

因?yàn)檫@個(gè)網(wǎng)絡(luò)使用了13個(gè)卷積層和3個(gè)全連接層,所以經(jīng)常被稱(chēng)為VGG-16,通過(guò)制定conv_arch得到模型架構(gòu)后構(gòu)建VGG16:

# 定義VGG網(wǎng)絡(luò)def vgg(conv_arch):
    # 構(gòu)建序列模型
    net = tf.keras.models.Sequential()
    # 根據(jù)conv_arch生成卷積部分
    for (num_convs, num_filters) in conv_arch:
        net.add(vgg_block(num_convs, num_filters))
    # 卷積塊序列后添加全連接層
    net.add(tf.keras.models.Sequential([
        # 將特征圖展成一維向量
        tf.keras.layers.Flatten(),
        # 全連接層:4096個(gè)神經(jīng)元,激活函數(shù)是relu
        tf.keras.layers.Dense(4096, activation='relu'),
        # 隨機(jī)失活
        tf.keras.layers.Dropout(0.5),
        # 全連接層:4096個(gè)神經(jīng)元,激活函數(shù)是relu
        tf.keras.layers.Dense(4096, activation='relu'),
        # 隨機(jī)失活
        tf.keras.layers.Dropout(0.5),
        # 全連接層:10個(gè)神經(jīng)元,激活函數(shù)是softmax
        tf.keras.layers.Dense(10, activation='softmax')]))
    return net# 網(wǎng)絡(luò)實(shí)例化net = vgg(conv_arch)

我們構(gòu)造一個(gè)高和寬均為224的單通道數(shù)據(jù)樣本來(lái)看一下模型的架構(gòu):

# 構(gòu)造輸入X,并將其送入到net網(wǎng)絡(luò)中
X = tf.random.uniform((1,224,224,1))
y = net(X)
# 通過(guò)net.summay()查看網(wǎng)絡(luò)的形狀
net.summay()

網(wǎng)絡(luò)架構(gòu)如下:

Model: "sequential_15"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
sequential_16 (Sequential)   (1, 112, 112, 64)         37568     
_________________________________________________________________
sequential_17 (Sequential)   (1, 56, 56, 128)          221440    
_________________________________________________________________
sequential_18 (Sequential)   (1, 28, 28, 256)          1475328   
_________________________________________________________________
sequential_19 (Sequential)   (1, 14, 14, 512)          5899776   
_________________________________________________________________
sequential_20 (Sequential)   (1, 7, 7, 512)            7079424   
_________________________________________________________________
sequential_21 (Sequential)   (1, 10)                   119586826 
=================================================================
Total params: 134,300,362
Trainable params: 134,300,362
Non-trainable params: 0
__________________________________________________________________
0 分享到:
和我們?cè)诰€交談!