Inception-ResNet-v1

本文档详细介绍了如何逐步构建Inception-ResNet-v1网络模型,包括InceptionResNetA、InceptionResNetB、ReductionB和InceptionResNetC等模块的实现,并给出了Stem部分的代码。最后,整合这些模块构建了完整的InceptionResNetV1网络模型。
摘要由CSDN通过智能技术生成

上一篇Inception-v4中,已经实现了Inception-v4网络模型,参考此篇博客以及Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning论文。再来实现一下Inception-ResNet-v1网络模型,其实Inception-ResNet-v2网络模型与Inception-ResNet-v1相差很小,只是需要变动一下其中的参数,故不再实现v2。

第一步,实现 InceptionResNetA

'''
Figure 10. 
The schema for 35 × 35 grid (Inception-ResNet-A)
module of Inception-ResNet-v1 network.
'''
def InceptionResNetA(activation_shape=(35,35,256)):
    input_ = Input(shape=activation_shape)
    
    conv1 = Conv2D(32, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    
    conv2 = Conv2D(32, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv3 = Conv2D(32, kernel_size=(3,3), strides=1, padding='SAME', activation='relu')(conv2)
    
    conv4 = Conv2D(32, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv5 = Conv2D(32, kernel_size=(3,3), strides=1, padding='SAME', activation='relu')(conv4)
    conv6 = Conv2D(32, kernel_size=(3,3), strides=1, padding='SAME', activation='relu')(conv5)
    
    conv7 = concatenate([conv1, conv3, conv6])   #?????
    
    conv8 = Conv2D(256, kernel_size=(1,1), strides=1, padding='SAME')(conv7)
    
    
    add1 = add([input_, conv8])
    
    output_ = Activation('relu')(add1)
    
    model = Model(inputs=input_, outputs=output_)
#     model.summary()
    return model
# InceptionResNetA()

第二步,实现 InceptionResNetB

'''
Figure 11. 
The schema for 17 × 17 grid (Inception-ResNet-B)
module of Inception-ResNet-v1 network.
'''
def InceptionResNetB(activation_shape=(17,17,896)):
    input_ = Input(shape=activation_shape)
    
    conv1 = Conv2D(128, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    
    conv2 = Conv2D(128, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv3 = Conv2D(128, kernel_size=(1,7), strides=1, padding='SAME', activation='relu')(conv2)
    conv4 = Conv2D(128, kernel_size=(7,1), strides=1, padding='SAME', activation='relu')(conv3)
    
    conv5 = concatenate([conv1, conv4])
    
    conv6 = Conv2D(896, kernel_size=(1,1), strides=1, padding='SAME')(conv5)
    
    add1 = add([input_, conv6])
    
    output_ = Activation('relu')(add1)
    
    model = Model(inputs=input_, outputs=output_)
#     model.summary()
    return model
# InceptionResNetB()

第三步,重新定义 ReductionB

'''
Figure 12. 
“Reduction-B” 17×17 to 8×8 grid-reduction module.
This module used by the smaller Inception-ResNet-v1 network in Figure 15.
'''
def ReductionB(concat_shape=(17,17,896)):
    input_ = Input(shape=concat_shape)
    
    maxpool = MaxPool2D(pool_size=(3,3), strides=2, padding='VALID')(input_)
    
    conv1 = Conv2D(256, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv2 = Conv2D(384, kernel_size=(3,3), strides=2, padding='VALID', activation='relu')(conv1)
    
    conv3 = Conv2D(256, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv4 = Conv2D(256, kernel_size=(3,3), strides=2, padding='VALID', activation='relu')(conv3)
    
    conv5 = Conv2D(256, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv6 = Conv2D(256, kernel_size=(3,3), strides=1, padding='SAME', activation='relu')(conv5)
    conv7 = Conv2D(256, kernel_size=(3,3), strides=2, padding='VALID', activation='relu')(conv6)
    
    concat1 = concatenate([maxpool, conv2, conv4, conv7])
    
    model = Model(inputs=input_, outputs=concat1)
#     model.summary()
    
    return model
# ReductionB()

第四步,实现 InceptionResNetC

'''
Figure 13. 
The schema for 8×8 grid (Inception-ResNet-C) module
of Inception-ResNet-v1 network.
'''
def InceptionResNetC(activation_shape=(8,8,1792)):
    input_ = Input(shape=activation_shape)
    
    conv1 = Conv2D(192, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    
    conv2 = Conv2D(192, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(input_)
    conv3 = Conv2D(192, kernel_size=(1,3), strides=1, padding='SAME', activation='relu')(conv2)
    conv4 = Conv2D(192, kernel_size=(3,1), strides=1, padding='SAME', activation='relu')(conv3)
    
    conv5 = concatenate([conv1, conv4])
    
    conv6 = Conv2D(1792, kernel_size=(1,1), strides=1, padding='SAME')(conv5)
    
    add1 = add([input_, conv6])
    
    output_ = Activation('relu')(add1)
    
    model = Model(inputs=input_, outputs=output_)
#     model.summary()
    return model
# InceptionResNetC()

第五步,实现 Stem

'''
Figure 14. 
The stem of the Inception-ResNet-v1 network
'''
def Stem(input_shape=(299, 299, 3)):
    input_ = Input(shape=input_shape)
    conv1 = Conv2D(32, kernel_size=(3,3), strides=2, padding='VALID', activation='relu')(input_)
    conv2 = Conv2D(32, kernel_size=(3,3), strides=1, padding='VALID', activation='relu')(conv1)
    conv3 = Conv2D(64, kernel_size=(3,3), strides=1, padding='SAME', activation='relu')(conv2)
    
    maxpool1 = MaxPool2D(pool_size=(3,3), strides=2, padding='VALID')(conv3)
    conv4 = Conv2D(80, kernel_size=(1,1), strides=1, padding='SAME', activation='relu')(maxpool1)
    
    conv5 = Conv2D(192, kernel_size=(3,3), strides=1, padding='VALID', activation='relu')(conv4)
    conv6 = Conv2D(256, kernel_size=(3,3), strides=2, padding='VALID', activation='relu')(conv5)
    
    model = Model(inputs=input_, outputs=conv6)
#     model.summary()
    return model
# Stem()

第六步,实现 InceptionResNetV1网络模型

'''
Figure 14. 
The stem of the Inception-ResNet-v1 network.
'''
def InceptionResNetV1(input_shape=(299,299,3), nclass=1000):
    model = Sequential()
    model.add(Input(shape=input_shape))
    model.add(Stem())
    for i in range(5):
        model.add(InceptionResNetA())
    model.add(ReductionA(filter_bank_size=[192, 192, 256, 384], concat_shape=(35, 35, 256)))
    for i in range(10):
        model.add(InceptionResNetB())
    model.add(ReductionB())
    for i in range(5):
        model.add(InceptionResNetC())
    model.add(GlobalAveragePooling2D())
    model.add(Dropout(0.2))
    model.add(Dense(nclass, 'softmax'))
    
    return model
model = InceptionResNetV1()
model.summary()

如有错误,欢迎指正!!!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Inception-ResNet-v1是一种深度学习模型,它结合了InceptionResNet两种网络结构的优点,能够在图像分类、目标检测等任务中取得较好的性能。该模型由Google团队提出,是2016年ImageNet图像分类比赛的冠军模型之一。 ### 回答2: Inception-ResNet-v1是Google团队在ImageNet图像识别比赛中的一个著名的深度卷积神经网络模型。它是在已经被证明有效的Inception-v4模型的基础上,引入residual module的思想,并结合Inception结构进行的改良。这个模型的主要目的是为了解决网络深度增加时,产生的梯度消失与梯度爆炸问题。 Inception-ResNet-v1的初始化参数使用了一个预训练的Inception-v3模型,这样可以获得更好的特征提取能力。同时,为了加强模型的拟合能力,使用的是具有指数增长的范围的卷积核尺寸,这样可以增加模型的非线性表示能力,进一步增强特征提取的能力。相比于之前的Inception-v4模型,Inception-ResNet-v1引入了很多残差模块,残差模块可以增加模型的深度,获得更好的特征提取能力。 总体上说,Inception-ResNet-v1的模型结构更加简洁,但却获得了更好的性能指标。这个模型可以用于各式各样的图像识别任务,比如物体识别、图像分类、人脸识别等。它在ImageNet数据集上获得了很高的分类准确率,也被广泛应用于深度学习领域,成为了深度学习算法中的一种经典模型。 ### 回答3: Inception-ResNet-v1是一种卷积神经网络结构,由Google Brain团队在2016年提出。它结合了Inception网络和ResNet网络的特点,具有更好的性能和效率。 Inception-ResNet-v1网络的特点是使用了残差模块和多路特征提取结构。残差模块可以有效地解决梯度消失和梯度爆炸问题,从而加速训练和提高网络精度。多路特征提取结构可以分别从不同层次提取特征,更好地利用了图像的信息。 Inception-ResNet-v1网络的整体结构可以分为两个部分:特征提取和分类。在特征提取部分,网络采用了多层卷积和池化操作,从输入的图像中提取出不同层次的特征。在分类部分,网络通过全局平均池化等操作,将特征映射到固定的维度上,并使用softmax函数进行分类。 Inception-ResNet-v1网络在多个计算机视觉任务上都表现出了出色的性能,比如图像分类、目标检测和语义分割等。这得益于其创新的网络结构和高效的实现方式。此外,它的开源代码和预训练模型也为其他研究者提供了很好的参考和启示,促进了深度学习领域的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值