📌  相关文章
📜  Inception V2 和 V3 – Inception 网络版本(1)

📅  最后修改于: 2023-12-03 15:15:49.279000             🧑  作者: Mango

Inception V2 和 V3 – Inception 网络版本

Inception V2 和 V3 是 Inception 网络的后续版本,是谷歌为解决深度学习中的计算成本和过拟合问题而提出的改进版本。它们的改进主要集中在模块内部和网络结构上。

Inception 模块

Inception 模块是 Inception 网络的重要组成部分,旨在在给定的空间上执行不同尺寸的卷积操作,并且在每层提供不同的滤波器大小,以便在程序员使用时进行选择。

Inception V2 中的 Inception 模块使用 1x1 卷积层来减少计算成本和网络参数数量,并使用 BN 层来加速收敛。除此之外,Inception V2 引入了分支结构,使得网络的特征提取变得更加多样化。

Inception V3 中的 Inception 模块进一步改进了 Inception V2 中的设计。特别地,采用了全新的分解卷积技术,用于对大尺寸的卷积操作进行拆解,从而降低计算成本和网络参数数量。

Inception V3 还针对 BN 层的计算和精度问题做了一些设计上的改变,以加速训练过程。此外,Inception V3 还加入了残差连接和辅助分类器等结构,以进一步提高网络性能。

Inception 网络结构

Inception 网络的网络结构是由多个 Inception 模块连接而成的,它们之间往往采用加入了 BN 层的池化层进行连接。

在 Inception V2 中,网络结构比较简单,由 9 个 Inception 模块和一个平均池化层组成。在通过全连接和 Softmax 函数后即可输出结果。

Inception V3 则对网络结构进行了进一步优化,采用了模块化设计和标签平滑等技术。其网络结构分为两部分,分别是特征提取模块和 Softmax 分类模块。其中,特征提取模块是由多个 Inception 模块和 3x3 卷积层组成的,其中每个 Inception 模块可含若干个 Inception 子模块。分类模块则采用了同 Inception V2 的结构。

结语

总体来说,Inception V2 和 V3 在设计方面都充分考虑了深度网络的计算成本和过拟合问题,并在实践中取得了不错的效果。如果需要实现图像分类、目标检测等深度学习任务,使用 Inception V2 或 V3 网络结构是很不错的选择。

代码片段:

# Import the necessary packages
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.keras.layers import BatchNormalization, AveragePooling2D
from tensorflow.keras.regularizers import l2

def inception_module(layer_in, f1, f2_in, f2_out, f3_in, f3_out, f4_out):
    # 1x1 conv
    conv1 = Conv2D(f1, (1,1), padding='same', activation='relu', kernel_regularizer=l2(0.0001))(layer_in)
    # 3x3 conv
    conv3_1 = Conv2D(f2_in, (1,1), padding='same', activation='relu', kernel_regularizer=l2(0.0001))(layer_in)
    conv3_2 = Conv2D(f2_out, (3,3), padding='same', activation='relu', kernel_regularizer=l2(0.0001))(conv3_1)
    # 5x5 conv
    conv5_1 = Conv2D(f3_in, (1,1), padding='same', activation='relu', kernel_regularizer=l2(0.0001))(layer_in)
    conv5_2 = Conv2D(f3_out, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.0001))(conv5_1)
    # 3x3 max pooling
    pool = MaxPooling2D((3,3), strides=(1,1), padding='same')(layer_in)
    pool_proj = Conv2D(f4_out, (1,1), padding='same', activation='relu', kernel_regularizer=l2(0.0001))(pool)
    # Concatenate
    layer_out = tf.keras.layers.concatenate([conv1, conv3_2, conv5_2, pool_proj], axis=-1)
    return layer_out

def GoogLeNet_build():
    model = Sequential()
    
    # Stem
    model.add(Conv2D(64, (3,3), padding='same', activation='relu', kernel_regularizer=l2(0.0001), input_shape=(224,224,3)))
    model.add(BatchNormalization())
    model.add(Conv2D(64, (3,3), padding='same', activation='relu', kernel_regularizer=l2(0.0001)))
    model.add(BatchNormalization())

    # GoogLeNet Modules
    model.add(inception_module(model.layers[-1].output, 64, 96, 128, 16, 32, 32))
    model.add(inception_module(model.layers[-1].output, 128, 128, 192, 32, 96, 64))
    model.add(MaxPooling2D((3,3), strides=(2,2), padding='same'))
    model.add(Dropout(0.2))

    model.add(inception_module(model.layers[-1].output, 192, 96, 208, 16, 48, 64))
    model.add(inception_module(model.layers[-1].output, 160, 112, 224, 24, 64, 64))
    model.add(inception_module(model.layers[-1].output, 128, 128, 256, 24, 64, 64))
    model.add(inception_module(model.layers[-1].output, 112, 144, 288, 32, 64, 64))
    model.add(inception_module(model.layers[-1].output, 256, 160, 320, 32, 128, 128))
    model.add(MaxPooling2D((3,3), strides=(2,2), padding='same'))
    model.add(Dropout(0.3))

    model.add(inception_module(model.layers[-1].output, 256, 160, 320, 32, 128, 128))
    model.add(inception_module(model.layers[-1].output, 384, 192, 384, 48, 128, 128))
    model.add(AveragePooling2D((7,7), strides=(1,1), padding='valid'))

    # Output
    model.add(Flatten())
    model.add(Dropout(0.4))
    model.add(Dense(1000, activation='softmax'))

    return model

model = GoogLeNet_build()
model.summary()