Inception Network详解和TensorFlow实现(附源码)

一、Inception Network简介

  Inception Network,亦称GoogleNet,由Christian Szegedy于2014年提出,该网络架构在当年的ILSVRC竞赛中脱颖而出,荣获冠军。与传统CNN模型依赖深度堆叠提升性能不同,Inception Network通过精心设计的Inception模块,在保持网络深度适度的同时,显著提升了训练效率(减少训练参数)与准确率,标志着CNN发展历程中的一个重要里程碑。

二、CNN的痛点

  在Inception Network问世前,诸如VGG等CNN模型在图像识别领域取得了显著成就,但仍面临以下共性问题:
  **1. 计算复杂度激增:**模型深度增加直接导致计算量急剧上升,对计算资源的需求近乎无限制增长。
  **2. 过拟合风险增加:**过深的网络结构易引发过拟合问题。
  **3. 卷积核选择难题:**图像信息的多样性使得选择最佳卷积核大小变得复杂,不同尺寸卷积核提取的特征各有侧重。
  为解决上述问题,Inception Network的设计者质疑了“固定尺寸卷积核”的常规做法,提出“宽度优先于深度”(wider rather than deeper)的理念,即采用多尺寸卷积核,为CNN设计开辟了新的路径。

三、Inception Network

1. 1x1卷积核

  1x1卷积核是CNN网络中常见的组成部分,它的主要作用有如下三点:

1.1 升维/降维:

  1x1的卷积核由于大小只有1x1,所以并不需要考虑像素跟周边像素的关系,它主要用于调节通道数,对不同的通道上的像素点进行线性组合,然后进行非线性化计算,可以完成升维和降维的功能,如下图所示,输入的WHD特征图矩阵与1个1x1大小的卷积核卷积后,输出的特征图的深度(通道数)将会从D变成1,从而实现了降维的作用。而升维只需要增加卷积核的数量即可,原理相同。
单个1*1卷积核的降维

1.2. 调节参数数量:

  前面所说的降维,其实也是减少了参数,因为特征图的通道数小了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图,二次提取特征,使得新特征图的特征表达更佳。
&esmp;&esmp;如下图,28x28x192的输入特征图,与32个5x5的卷积核做卷积计算,产生24x24x32的输出,此过程涉及的计算量为28x28x32x(5x5x192)=120.422 million ops。
在这里插入图片描述
  而经过1x1卷积核降维后,整个过程分成了两步,第一步的计算量是28x28x16x(1x1x192)=2.4 million ops。第二部的计算量是28x28x32x(5x5x16)=10 million ops。
合计12.4 million ops。可见经过1x1卷积核降维后,神经网络的计算量大大降低,即需要训练的参数量大幅度减少(同时一定程度上减少了过拟合)。
在这里插入图片描述

1.3. 增加非线性特性:

  使用1x1卷积核的网络更深,而每一层网络后都会用Relu激活函数做计算,这样就增加了一层非线性特征。

2. Inception原始模型

  为了验证“wider rather than deeper”的理论,Inception network的作者设计了如下Inception原始模型。
  我们都知道不同大小的卷积核具有不同的感受野,在输入特征图上用 3 个不同的卷积核(1x1,3x3,5x5)实施卷积操作,相当于同时提取了不同的尺度的特征,冗余信息更少,训练效率更高。最后执行了最大池化操作(max pooling),被连接(concatenated)后,送往下一层 inception 模块。
在这里插入图片描述

3. Inception Module

  然而在Inception原始模型中,由于3x3和5x5的卷积核涉及的参数量过大,计算代价过于昂贵,作者便充分利用了1x1卷积核的特性,在过大的卷积核之前增加1x1卷积核,大幅减少了参数数量,提高了训练效率,这就是Inception Module,如下图。
在这里插入图片描述

4. Inception Network

  利用上述Inception module,一个22层的神经网络被构建完成,如下图,这就是Inception Network V1。
在这里插入图片描述
  Inception Network线性堆叠了 9 个Inception Module,它有 22 层深(如果包括池化层,则为 27 层),在最后它使用了全局平均池化操作。
  注意这里除了Inception Module外,还多了几个分支。所以这些分支有什么用呢?在网络的最后几层,通常是全连接层然后softmax来做出预测。图中分支就是通过隐藏层来做出预测,所以其实是一个softmax输出,它确保了即便是隐藏单元和中间层也参与了特征计算和图片分类,起到一种调整的效果并且防止网络发生过拟合。

四、代码示例

  下面是基于Inception V3的transfer learning模型构建代码:

# 下载已训练好的模型weights
weights_url = "https://storage.googleapis.com/mledu-datasets/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5"
weights_file = "inception_v3.h5"
urllib.request.urlretrieve(weights_url, weights_file)

# 加载InceptionV3 from tensorflow.keras.applications.inception_v3 import InceptionV3
# 其中include_top表示顶部Flatten和Dense层,FALSE为不加载这部分
pre_trained_model = InceptionV3(input_shape=(150, 150, 3),
                                include_top=False,
                                weights=None)

# 加载weights
pre_trained_model.load_weights(weights_file)

# 冻结所有layers
for layer in pre_trained_model.layers:
    layer.trainable = False

# pre_trained_model.summary()

last_layer = pre_trained_model.get_layer('mixed7')
last_output = last_layer.output

# 将Inception的输出传入自定义的layer,用于处理自定义的分类
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation='relu')(x)
# 二分类
x = layers.Dense(1, activation='sigmoid')(x)

# 模型定义
model = Model(pre_trained_model.input, x)
# 编译
model.compile(optimizer=RMSprop(lr=0.0001),
              loss='binary_crossentropy',
              metrics=['acc'])

# 训练
history = model.fit(
            train_generator,
            validation_data=validation_generator,
            epochs=2,
            verbose=1)

  注:Keras的ImageDataGenerator提供了强大的图片处理能力,用法如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

TRAINING_DIR = "/tmp/cats-v-dogs/training/"
train_datagen = ImageDataGenerator(rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')
train_generator = train_datagen.flow_from_directory(TRAINING_DIR,
                                                    batch_size=100,
                                                    class_mode='binary',
                                                    target_size=(150, 150))

VALIDATION_DIR = "/tmp/cats-v-dogs/testing/"
validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_directory(VALIDATION_DIR,
                                                              batch_size=100,
                                                              class_mode='binary',
                                                              target_size=(150, 150))

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Inception-ResNet是一种深度卷积神经网络模型,它结合了Inception模块和ResNet模块的特点。关于Inception-ResNet的具体实现,提供的引用内容中有三个部分。 引用中给出了一些用到的包和构建二维卷积模块的代码。通过导入相关的包和定义一个函数`conv2d_bn`来实现二维卷积和批归一化等操作。 引用中给出了一个使用Inception-ResNet模块构建深度网络的前向传播过程的代码。通过调用`Stem`、`Inception_ResNet_A`、`Reduction_A`、`Inception_ResNet_B`、`Reduction_B`、`Inception_ResNet_C`等函数来构建网络的不同模块。 引用中提供了一个基于TensorflowInception-ResNet-V2的代码复现,该代码复现了原论文中的网络结构,并适用于Tensorflow 2.12版本。这可以作为学习和参考的资源。 综上所述,如果你想在Tensorflow实现Inception-ResNet网络,可以参考上述提供的引用内容和代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于TensorflowInception-Resnet-V2代码复现](https://blog.csdn.net/weixin_45506188/article/details/130102377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [TensorFlow实现inception-resnet](https://blog.csdn.net/u014524930/article/details/79330316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bestaier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值