python神经网络InceptionV3模型复现详解

目录

神经网络学习小记录21——InceptionV3模型的复现详解 学习前言什么是InceptionV3模型InceptionV3网络部分实现代码图片预测

学习前言

Inception系列的结构和其它的前向神经网络的结构不太一样,每一层的内容不是直直向下的,而是分了很多的块。

什么是InceptionV3模型

InceptionV3模型是谷歌Inception系列里面的第三代模型,其模型结构与InceptionV2模型放在了同一篇论文里,其实二者模型结构差距不大,相比于其它神经网络模型,Inception网络最大的特点在于将神经网络层与层之间的卷积运算进行了拓展。
如VGG,AlexNet网络,它就是一直卷积下来的,一层接着一层;
ResNet则是创新性的引入了残差网络的概念,使得靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分,后面的特征层的内容会有一部分由其前面的某一层线性贡献。
而Inception网络则是采用不同大小的卷积核,使得存在不同大小的感受野,最后实现拼接达到不同尺度特征的融合。
对于InceptionV3而言,其网络中存在着如下的结构。
这个结构使用不同大小的卷积核对输入进行卷积(这个结构主要在代码中的block1使用)。

还存在着这样的结构,利用1x7的卷积和7x1的卷积代替7x7的卷积,这样可以只使用约(1x7 + 7x1) / (7x7) = 28.6%的计算开销;利用1x3的卷积和3x1的卷积代替3x3的卷积,这样可以只使用约(1x3 + 3x1) / (3x3) = 67%的计算开销。
下图利用1x7的卷积和7x1的卷积代替7x7的卷积(这个结构主要在代码中的block2使用)。

下图利用1x3的卷积和3x1的卷积代替3x3的卷积(这个结构主要在代码中的block3使用)。

InceptionV3网络部分实现代码

我一共将InceptionV3划分为3个block,对应着35x35、17x17,8x8维度大小的图像。每个block中间有许多的part,对应着不同的特征层深度,用于特征提取。

#-------------------------------------------------------------##   InceptionV3的网络部分#-------------------------------------------------------------#from __future__ import print_functionfrom __future__ import absolute_importimport warningsimport numpy as npfrom keras.models import Modelfrom keras import layersfrom keras.layers import Activation,Dense,Input,BatchNormalization,Conv2D,MaxPooling2D,AveragePooling2Dfrom keras.layers import GlobalAveragePooling2D,GlobalMaxPooling2Dfrom keras.engine.topology import get_source_inputsfrom keras.utils.layer_utils import convert_all_kernels_in_modelfrom keras.utils.data_utils import get_filefrom keras import backend as Kfrom keras.applications.imagenet_utils import decode_predictionsfrom keras.preprocessing import imagedef conv2d_bn(x,              filters,              num_row,              num_col,              padding='same',              strides=(1, 1),              name=None):    if name is not None:        bn_name = name + '_bn'        conv_name = name + '_conv'    else:        bn_name = None        conv_name = None    x = Conv2D(        filters, (num_row, num_col),        strides=strides,        padding=padding,        use_bias=False,        name=conv_name)(x)    x = BatchNormalization(scale=False, name=bn_name)(x)    x = Activation('relu', name=name)(x)    return xdef InceptionV3(input_shape=[299,299,3],                classes=1000):    img_input = Input(shape=input_shape)    x = conv2d_bn(img_input, 32, 3, 3, strides=(2, 2), padding='valid')    x = conv2d_bn(x, 32, 3, 3, padding='valid')    x = conv2d_bn(x, 64, 3, 3)    x = MaxPooling2D((3, 3), strides=(2, 2))(x)    x = conv2d_bn(x, 80, 1, 1, padding='valid')    x = conv2d_bn(x, 192, 3, 3, padding='valid')    x = MaxPooling2D((3, 3), strides=(2, 2))(x)    #--------------------------------#    #   Block1 35x35    #--------------------------------#    # Block1 part1    # 35 x 35 x 192 -> 35 x 35 x 256    branch1x1 = conv2d_bn(x, 64, 1, 1)    branch5x5 = conv2d_bn(x, 48, 1, 1)    branch5x5 = conv2d_bn(branch5x5, 64, 5, 5)    branch3x3dbl = conv2d_bn(x, 64, 1, 1)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch_pool = AveragePooling2D((3, 3), strides=(1, 1), padding='same')(x)    branch_pool = conv2d_bn(branch_pool, 32, 1, 1)    x = layers.concatenate(        [branch1x1, branch5x5, branch3x3dbl, branch_pool],        axis=3,        name='mixed0')    # Block1 part2    # 35 x 35 x 256 -> 35 x 35 x 288    branch1x1 = conv2d_bn(x, 64, 1, 1)    branch5x5 = conv2d_bn(x, 48, 1, 1)    branch5x5 = conv2d_bn(branch5x5, 64, 5, 5)    branch3x3dbl = conv2d_bn(x, 64, 1, 1)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch_pool = AveragePooling2D((3, 3), strides=(1, 1), padding='same')(x)    branch_pool = conv2d_bn(branch_pool, 64, 1, 1)    x = layers.concatenate(        [branch1x1, branch5x5, branch3x3dbl, branch_pool],        axis=3,        name='mixed1')    # Block1 part3    # 35 x 35 x 288 -> 35 x 35 x 288    branch1x1 = conv2d_bn(x, 64, 1, 1)    branch5x5 = conv2d_bn(x, 48, 1, 1)    branch5x5 = conv2d_bn(branch5x5, 64, 5, 5)    branch3x3dbl = conv2d_bn(x, 64, 1, 1)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch_pool = AveragePooling2D((3, 3), strides=(1, 1), padding='same')(x)    branch_pool = conv2d_bn(branch_pool, 64, 1, 1)    x = layers.concatenate(        [branch1x1, branch5x5, branch3x3dbl, branch_pool],        axis=3,        name='mixed2')    #--------------------------------#    #   Block2 17x17    #--------------------------------#    # Block2 part1    # 35 x 35 x 288 -> 17 x 17 x 768    branch3x3 = conv2d_bn(x, 384, 3, 3, strides=(2, 2), padding='valid')    branch3x3dbl = conv2d_bn(x, 64, 1, 1)    branch3x3dbl = conv2d_bn(branch3x3dbl, 96, 3, 3)    branch3x3dbl = conv2d_bn(        branch3x3dbl, 96, 3, 3, strides=(2, 2), padding='valid')    branch_pool = MaxPooling2D((3, 3), strides=(2, 2))(x)    x = layers.concatenate(        [branch3x3, branch3x3dbl, branch_pool], axis=3, name='mixed3')    # Block2 part2    # 17 x 17 x 768 -> 17 x 17 x 768    branch1x1 = conv2d_bn(x, 192, 1, 1)    branch7x7 = conv2d_bn(x, 128, 1, 1)    branch7x7 = conv2d_bn(branch7x7, 128, 1, 7)    branch7x7 = conv2d_bn(branch7x7, 192, 7, 1)    branch7x7dbl = conv2d_bn(x, 128, 1, 1)    branch7x7dbl = conv2d_bn(branch7x7dbl, 128, 7, 1)    branch7x7dbl = conv2d_bn(branch7x7dbl, 128, 1, 7)    branch7x7dbl = conv2d_bn(branch7x7dbl, 128, 7, 1)    branch7x7dbl = conv2d_bn(branch7x7dbl, 192, 1, 7)    branch_pool = AveragePooling2D((3, 3), strides=(1, 1), padding='same')(x)    branch_pool = conv2d_bn(branch_pool, 192, 1, 1)    x = layers.concatenate(        [branch1x1, branch7x7, branch7x7dbl, branch_pool],        axis=3,        name='mixed4')    # Block2 part3 and part4    # 17 x 17 x 768 -> 17 x 17 x 768 -> 17 x 17 x 768    for i in range(2):        branch1x1 = conv2d_bn(x, 192, 1, 1)        branch7x7 = conv2d_bn(x, 160, 1, 1)        branch7x7 = conv2d_bn(branch7x7, 160, 1, 7)        branch7x7 = conv2d_bn(branch7x7, 192, 7, 1)        branch7x7dbl = conv2d_bn(x, 160, 1, 1)        branch7x7dbl = conv2d_bn(branch7x7dbl, 160, 7, 1)        branch7x7dbl = conv2d_bn(branch7x7dbl, 160, 1, 7)        branch7x7dbl = conv2d_bn(branch7x7dbl, 160, 7, 1)        branch7x7dbl = conv2d_bn(branch7x7dbl, 192, 1, 7)        branch_pool = AveragePooling2D(            (3, 3), strides=(1, 1), padding='same')(x)        branch_pool = conv2d_bn(branch_pool, 192, 1, 1)        x = layers.concatenate(            [branch1x1, branch7x7, branch7x7dbl, branch_pool],            axis=3,            name='mixed' + str(5 + i))    # Block2 part5    # 17 x 17 x 768 -> 17 x 17 x 768    branch1x1 = conv2d_bn(x, 192, 1, 1)    branch7x7 = conv2d_bn(x, 192, 1, 1)    branch7x7 = conv2d_bn(branch7x7, 192, 1, 7)    branch7x7 = conv2d_bn(branch7x7, 192, 7, 1)    branch7x7dbl = conv2d_bn(x, 192, 1, 1)    branch7x7dbl = conv2d_bn(branch7x7dbl, 192, 7, 1)    branch7x7dbl = conv2d_bn(branch7x7dbl, 192, 1, 7)    branch7x7dbl = conv2d_bn(branch7x7dbl, 192, 7, 1)    branch7x7dbl = conv2d_bn(branch7x7dbl, 192, 1, 7)    branch_pool = AveragePooling2D((3, 3), strides=(1, 1), padding='same')(x)    branch_pool = conv2d_bn(branch_pool, 192, 1, 1)    x = layers.concatenate(        [branch1x1, branch7x7, branch7x7dbl, branch_pool],        axis=3,        name='mixed7')    #--------------------------------#    #   Block3 8x8    #--------------------------------#    # Block3 part1    # 17 x 17 x 768 -> 8 x 8 x 1280    branch3x3 = conv2d_bn(x, 192, 1, 1)    branch3x3 = conv2d_bn(branch3x3, 320, 3, 3,                          strides=(2, 2), padding='valid')    branch7x7x3 = conv2d_bn(x, 192, 1, 1)    branch7x7x3 = conv2d_bn(branch7x7x3, 192, 1, 7)    branch7x7x3 = conv2d_bn(branch7x7x3, 192, 7, 1)    branch7x7x3 = conv2d_bn(        branch7x7x3, 192, 3, 3, strides=(2, 2), padding='valid')    branch_pool = MaxPooling2D((3, 3), strides=(2, 2))(x)    x = layers.concatenate(        [branch3x3, branch7x7x3, branch_pool], axis=3, name='mixed8')    # Block3 part2 part3    # 8 x 8 x 1280 -> 8 x 8 x 2048 -> 8 x 8 x 2048    for i in range(2):        branch1x1 = conv2d_bn(x, 320, 1, 1)        branch3x3 = conv2d_bn(x, 384, 1, 1)        branch3x3_1 = conv2d_bn(branch3x3, 384, 1, 3)        branch3x3_2 = conv2d_bn(branch3x3, 384, 3, 1)        branch3x3 = layers.concatenate(            [branch3x3_1, branch3x3_2], axis=3, name='mixed9_' + str(i))        branch3x3dbl = conv2d_bn(x, 448, 1, 1)        branch3x3dbl = conv2d_bn(branch3x3dbl, 384, 3, 3)        branch3x3dbl_1 = conv2d_bn(branch3x3dbl, 384, 1, 3)        branch3x3dbl_2 = conv2d_bn(branch3x3dbl, 384, 3, 1)        branch3x3dbl = layers.concatenate(            [branch3x3dbl_1, branch3x3dbl_2], axis=3)        branch_pool = AveragePooling2D(            (3, 3), strides=(1, 1), padding='same')(x)        branch_pool = conv2d_bn(branch_pool, 192, 1, 1)        x = layers.concatenate(            [branch1x1, branch3x3, branch3x3dbl, branch_pool],            axis=3,            name='mixed' + str(9 + i))    # 平均池化后全连接。    x = GlobalAveragePooling2D(name='avg_pool')(x)    x = Dense(classes, activation='softmax', name='predictions')(x)    inputs = img_input    model = Model(inputs, x, name='inception_v3')    return model

图片预测

建立网络后,可以用以下的代码进行预测。

def preprocess_input(x):    x /= 255.    x -= 0.5    x *= 2.    return xif __name__ == '__main__':    model = InceptionV3()    model.load_weights("inception_v3_weights_tf_dim_ordering_tf_kernels.h5")        img_path = 'elephant.jpg'    img = image.load_img(img_path, target_size=(299, 299))    x = image.img_to_array(img)    x = np.expand_dims(x, axis=0)    x = preprocess_input(x)    preds = model.predict(x)    print('Predicted:', decode_predictions(preds))

预测所需的已经训练好的InceptionV3模型可以在github下载非常方便。

预测结果为:

Predicted: [[('n02504458', 'African_elephant', 0.50874853), ('n01871265', 'tusker', 0.19524273), ('n02504013', 'Indian_elephant', 0.1566972), ('n01917289', 'brain_coral', 0.0008956835), ('n01695060', 'Komodo_dragon', 0.0008260256)]]

这里我推荐一个很不错的blog讲InceptionV3的结构的深度神经网络Google Inception Net-V3结构图里面有每一层的结构图,非常清晰。

以上就是python神经网络InceptionV3模型复现详解的详细内容,更多关于python神经网络InceptionV3模型的资料请关注我们其它相关文章!

(0)

相关推荐

  • python神经网络InceptionV3模型复现详解

    目录 神经网络学习小记录21——InceptionV3模型的复现详解 学习前言什么是InceptionV3模型InceptionV3网络部分实现代码图片预测 学习前言 Inception系列的结构和其它的前向神经网络的结构不太一样,每一层的内容不是直直向下的,而是分了很多的块. 什么是InceptionV3模型 InceptionV3模型是谷歌Inception系列里面的第三代模型,其模型结构与InceptionV2模型放在了同一篇论文里,其实二者模型结构差距不大,相比于其它神经网络模型,Inc

  • python神经网络Xception模型复现详解

    目录 什么是Xception模型 Xception网络部分实现代码 图片预测 Xception是继Inception后提出的对Inception v3的另一种改进,学一学总是好的 什么是Xception模型 Xception是谷歌公司继Inception后,提出的InceptionV3的一种改进模型,其改进的主要内容为采用depthwise separable convolution来替换原来Inception v3中的多尺寸卷积核特征响应操作. 在讲Xception模型之前,首先要讲一下什么是

  • python神经网络Densenet模型复现详解

    目录 什么是Densenet Densenet 1.Densenet的整体结构 2.DenseBlock 3.Transition Layer 网络实现代码 什么是Densenet 据说Densenet比Resnet还要厉害,我决定好好学一下. ResNet模型的出现使得深度学习神经网络可以变得更深,进而实现了更高的准确度. ResNet模型的核心是通过建立前面层与后面层之间的短路连接(shortcuts),这有助于训练过程中梯度的反向传播,从而能训练出更深的CNN网络. DenseNet模型,

  • python神经网络ShuffleNetV2模型复现详解

    目录 什么是ShuffleNetV2 ShuffleNetV2 1.所用模块 2.网络整体结构 网络实现代码 什么是ShuffleNetV2 据说ShuffleNetV2比Mobilenet还要厉害,我决定好好学一下 这篇是ECCV2018关于轻量级模型的文章. 目前大部分的轻量级模型在对比模型速度时用的指标是FLOPs,这个指标主要衡量的就是卷积层的乘法操作. 但是实际运用中会发现,同一个FLOPS的网络运算速度却不同,只用FLOPS去进行衡量的话并不能完全代表模型速度. 通过如下图所示对比,

  • python神经网络Inception ResnetV2模型复现详解

    目录 什么是Inception ResnetV2 Inception-ResNetV2的网络结构 1.Stem的结构: 2.Inception-resnet-A的结构: 3.Inception-resnet-B的结构: 4.Inception-resnet-C的结构: 全部代码 什么是Inception ResnetV2 Inception ResnetV2是Inception ResnetV1的一个加强版,两者的结构差距不大,如果大家想了解Inception ResnetV1可以看一下我的另一

  • python神经网络ResNet50模型的复现详解

    目录 什么是残差网络 什么是ResNet50模型 ResNet50网络部分实现代码 图片预测 什么是残差网络 最近看yolo3里面讲到了残差网络,对这个网络结构很感兴趣,于是了解到这个网络结构最初的使用是在ResNet网络里. Residual net(残差网络): 将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分. 意味着后面的特征层的内容会有一部分由其前面的某一层线性贡献. 其结构如下: 深度残差网络的设计是为了克服由于网络深度加深而产生的学习效率变低与准确率无法有效提升的

  • python神经网络MobileNet模型的复现详解

    目录 什么是MobileNet模型 MobileNet网络部分实现代码 图片预测 什么是MobileNet模型 MobileNet是一种轻量级网络,相比于其它结构网络,它不一定是最准的,但是它真的很轻 MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution. 对于一个卷积点而言: 假设有一个3×3大小的卷积层,其输入通道为16.输出通道为32.具体为,32个3×3大小的卷积核会遍历

  • python神经网络MobileNetV2模型的复现详解

    目录 什么是MobileNetV2模型 MobileNetV2网络部分实现代码 图片预测 什么是MobileNetV2模型 MobileNet它哥MobileNetV2也是很不错的呢 MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution. MobileNetV2是MobileNet的升级版,它具有两个特征点: 1.Inverted residuals,在ResNet50里我们认识

  • python神经网络MobileNetV3 large模型的复现详解

    目录 神经网络学习小记录38——MobileNetV3(large)模型的复现详解 学习前言什么是MobileNetV3代码下载MobileNetV3(large)的网络结构1.MobileNetV3(large)的整体结构2.MobileNetV3特有的bneck结构 网络实现代码 学习前言 为了防止某位我的粉丝寒假没有办法正常工作,我赶紧看了看MobilenetV3. 什么是MobileNetV3 最新的MobileNetV3的被写在了论文<Searching for MobileNetV3

  • python神经网络MobileNetV3 small模型的复现详解

    目录 什么是MobileNetV3 large与small的区别 MobileNetV3(small)的网络结构 1.MobileNetV3(small)的整体结构 2.MobileNetV3特有的bneck结构 网络实现代码 什么是MobileNetV3 不知道咋地,就是突然想把small也一起写了. 最新的MobileNetV3的被写在了论文<Searching for MobileNetV3>中. 它是mobilnet的最新版,据说效果还是很好的. 作为一种轻量级网络,它的参数量还是一如

随机推荐