zoukankan      html  css  js  c++  java
  • 学习笔记TF032:实现Google Inception Net

    Google Inception Net,ILSVRC 2014比赛第一名。控制计算量、参数量,分类性能非常好。V1,top-5错误率6.67%,22层,15亿次浮点运算,500万参数(AlexNet 6000万)。V1降低参数量目的,参数越多模型越庞大,需数据量越大,高质量数据昂贵;参数越多,耗费计算资源越大。模型层数更深,表达能力更强,去除最后全连接层,用全局平均池化层(图片尺寸变1x1),参数大减,模型训练更快,减轻过拟合(《Network in Network》论文),Inception Module提高参数利用效率,大网络中小网络。增加分支网络,NIN级联卷积层、NLPConv层。一般,卷积层增加输出通道数,提升表达能力,计算量增大、过拟合,每个输出通道对应一个滤波器,同一滤波器共享参数,只能提取一类特征。NIN,输出通道组保信息。MLPConv,普通卷积层,接1x1卷积、ReLU激活函数。

    Inception Module结构,4个分支。第一分支,输入1x1卷积。1x1卷积,跨通道组织信息,提高网络表达能力,输出通道升维、降维。4个分支都用1x1卷积,低成本跨通道特征变换。第二分支,1x1卷积,3x3卷积,两次特征变换。第三分支,1x1卷积,5x5卷积。第四分支,3x3最大池化,1x1卷积。1x1卷积性价比高,小计算量,特征变换、非线性化。4个分支后聚合操作合并(输出通道数聚合)。Inception Module 包含3种不同尺寸卷积、1个最大池化,增加不同尺度适应性。网络深度、宽度高效扩充,提升准确率,不过拟合。

    Inception Net,找到最优稀疏结构单元(Inception Module)。Hebbian原理,神经反射活动持续、重复,神经元连接稳定性持久提升,两个神经元细胞距离近,参与对方重复、持续兴奋,代谢变化成为使对方兴奋细胞。一起发射神经元会连在一起(Cells that fire together,wire together),学习过程刺激使神经元间突触强度增加。《Provable Bounds for Learning Some Deep Representations》,很大很稀疏神经网络表达数据集概率分布,网络最佳构筑方法是逐层构筑。上层高度相关(correlated)节点聚类,每个小簇(cluster)连接一起。相关性高节点连接一起。

    图片数据,临近区域数据相关性高,相邻像素点卷积连接一起。多个卷积核,同一空间位置,不同通道卷积核输出结果,相关性极高。稍大一点卷积(3x3、5x5),连接节点相关性高,适当用大尺寸卷积,增加多样性(diversity)。Inception Module 4分支,不同尺寸(1x1、3x3、5x5)小型卷积,连接相关性很高节点。

    Inception Module,1x1卷积比例(输出通道数占比)最高,3x3、5x5卷积稍低。整个网络,多个Inception Module堆叠。靠后Inception Module卷积空间集中度渐降低,捕获更大面积特征,捕捉更高阶抽象特征。靠后Inception Module,3x3、5x5大面积卷积核占比(输出通道数)更多。

    Inception Net 22层,最后一层输出,中间节点分类效果好。使用辅助分类节点(auxiliary classifiers),中间层输出作分类,按较小权重(0.3)加到最终分类结果。相当模型融合,给网络增加反向传播梯度信号,提供额外正则化。

    Google Inception Net家族:2014年9月《Going Deeper with Convolutions》Inception V1,top-5错误率6.67%。2015年2月《Batch Normalization:Accelerating Deep Network Trainign by Reducing Internal Covariate》Inception V2,top-5错误率4.8%。2015年12月《Rethinking the Inception Architecture ofr Computer Vision》Inception V3,top-5错误率3.5%。2016年2月《Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning》Inception V4,top-5错误率3.08%。

    Inception V2,用两个3x3卷积代替5x5大卷积,降低参数量,减轻过拟合,提出Batch Normalization方法。BN,非常有效正则化方法,让大型卷积网络训练速度加快很多倍,收敛后分类准确率大幅提高。BN 对每个mini-batch数据内部标准化(normalization)处理,输出规范化到N(0,1)正态分布,减少Internal Covariate Shift(内部神经元分布改变)。传统深度神经网络,每层输入分布变化,只能用很小学习速率。每层BN 学习速率增大很多倍,迭代次数只需原来的1/14,训练时间缩短。BN正则化作用,减少或者取消Dropout,简化网络结构。

    增大学习速率,加快学习衰减速度,适用BN规范化数据,去除Dropout,减轻L2正则,去除LRN,更彻底shuffle训练样本,减少数据增强过程数据光学畸变(BN训练更快,样本被训练次数更少,更真实样本对训练有帮助)。

    Inception V3,引入Factorization into small convolutions思想,较大二维卷积拆成两个较小一维卷积,节约大量参数,加速运算,减轻过拟合,增加一层蜚线性,扩展模型表达能力。非对称卷积结构拆分,比对称拆分相同小卷积核效果更明显,处理更多、更丰富空间特征,增加特征多样性。

    优化Inception Module结构,35x35,17x17,8x8。分支中使用分支,8x8结构,Network In Network In Network。V3结合微软ResNet。

    使用tf.contrib.slim辅助设计42层Inception V3 网络。

    Inception V3 网络结构
    类型 kernel尺寸/步长(或注释) 输入尺寸
    卷积 3x3/2 299x299x3
    卷积 3x3/1 149x149x32
    卷积 3x3/1 147x147x32
    池化 3x3/2 147x147x64
    卷积 3x3/1 73x73x64
    卷积 3x3/2 71x71x80
    卷积 3x3/1 35x35x192
    Inception模块组 3个InceptionModule 35x35x288
    Inception模块组 5个InceptionModule 17x17x768
    Inception模块组 3个InceptionModule 8x8x1280
    池化 8x8 8x8x2048
    线性 logits 1x1x2048
    Softmax 分类输出 1x1x1000

    定义简单函数trunc_normal,产生截断正态分布。

    定义函数inception_v3_arg_scope,生成网络常用函数默认参数,卷积激活函数、权重初始化方式、标准化器。设置L2正则weight_decay默认值0.00004,标准差stddev默认值0.1,参数batch_norm_var_collection默认值moving_vars 。

    定义batch normalization参数字典,定义衰减系数decay 0.997,epsilon 0.001,updates_collections为tf.GraphKeys.UPADTE_OPS,字典variables_collections中beta、gamma设None,moving_mean、moving_variance设batch_norm_var_collection。

    slim.agr_scope,函数参数自动赋默认值。with slim.arg_scope([slim.conv2d, slim.fully_connected], weights_regularizer=slim.l2_regularizer(weight_decay)) ,对[slim.conv2d, slim.fully_connected]两个函数参数自动赋值,参数weights_regularizer值默认设为slim.l2_regularizer(weight_decay)。不需要每次重复设置参数,只需要修改时设置。

    嵌套一个slim.arg_scope,卷积层生成函数slim.conv2d参数赋默认值,权重初始化器weights_initializer设trunc_normal(stddev),激活函数设ReLU,标准化器设slim.batch_norm,标准化器参数设batch_norm_params,返回定义好的scope。

    定义函数inception_v3_base,生成Inception V3网络卷积。参数inputs 输入图片数据tensor,scope 函数默认参数环境。定义字典表end_points ,保存关键节点。slim.agr_scope,设置slim.conv2d、slim.max_pool2d、slim_avg_pool2d函数参数默认值,stride设1,padding设VALID。非Inception Module卷积层,slim.conv2d创建卷积层,第一参数输入tensor,第二参数输出通道数,第三参数卷积核尺寸,第四参数步长stride ,第五参数padding模式。第一卷积层输出通道数32,卷积核尺寸3x3,步长 2,padding模式VALID。

    非Inception Module卷积层,主要用3x3小卷积核。Factorization into small convolutions思想, 用两个1维卷积模拟大尺寸2维卷积,减少参数量,增加非线性。1x1卷积,低成本跨通道特征组合。第一卷积层步长2,其余卷积层步长1。池化层尺寸3x3、步长2重叠最大池化。网络输入数据惊寸299x299x3,经过3个步长2层,尺寸缩小为35x35x192,空间尺寸大降低,输出通道增加很多。一共5个卷积层,2个池化层,实现输入图片数据尺寸压缩,抽象图片特征。

    三个连续Inception模块组。

    第1个Inception模块组3个结构类似Inception Module。

    第1 Inception模块组第1个Inception Module,名称Mixed_5b。slim.arg_scope设置所有Inception模块组默认参数,所有卷积层、最大池化、平均池化层步长设1,padding模式设SAME。设置Inception Module variable_scope名称Mixed_5b。4个分支,Branch_0到Branch_3。第一分支64输出通道1x1卷积。第二分支48输出通道1x1卷积,连接64输出通道5x5卷积。第三分支64输出通道1x1卷积,连接2个96输出通道3x3卷积。第四分支3x3平均池化,连接32输出通道1x1卷积。最后tf.concat合并4分支输出(第三维度输出通道合并),生成Inception Module最终输出。所有层步长为1,padding模型SAME,图片尺寸不缩小,维持35x35,通道数增加,4个分支通道数和64+64+96+32=256,最终输出tensor尺寸35x35x256。

    第1 Inception模块组第2个Inception Module,名称Mixed_5c。步长1,padding模型SAME。4个分支,第四分支最后接64输出通道1x1卷积。输出tensor尺寸35x35x288。

    第1 Inception模块组第3个Inception Module,名称Mixed_5d。输出tensor尺寸35x35x288。

    第2个Inception模块组5个Inception Module。第2到第5Inception Module结构类似。

    第2 Inception模块组第1个Inception Module,名称Mixed_6a。3个分支。第一分支384输出通道3x3卷积,步长2,padding模式VAILD,图片尺寸压缩为17x17。第二分支3层,64输出通道1x1卷积,两个96输出通道3x3卷积,最后一层步长2,padding模式VAILD,分支输出tensor尺寸17x17x96。第三分支3x3最大池化层,步长2,padding模式VAILD,分支输出tensor尺寸17x17x256。三分支输出通道合并,最终输出尺寸17x17x(384+96+256)=17x17x768。第2 Inception模块组5个Inception Module尺寸相同。

    第2 Inception模块组第2个Inception Module,名称Mixed_6b。4个分支。第一分支192输出通道1x1卷积。第二分支3层,第一层128输出通道1x1卷积,第二层128输出通道1x7卷积,第三层192输出通道7x1卷积。Factorization into small convolutions思想,串联1x7卷积和7x1卷积,相当合成7x7卷积,参数量大减,减轻过拟合,增加一个激活函数,增强非线性特征变换。第三分支5层,第一层128输出通道1x1卷积,第二层128输出通道7x1卷积,第三层128输出通道1x7卷积,第四层128输出通道7x1卷积,第五层192输出通道1x7卷积。Factorization into small convolutions典范,反复拆分7x7卷积。第四分支3x3平均池化层,连接192输出通道1x1卷积。四分支合并,最终输出tensor尺寸17x17x(192+192+192+192+192)=17x17x768。

    第2 Inception模块组第3个Inception Module,名称Mixed_6c。第二分支和第三分支前几个卷积层输出通道数从128变为160,最终输出通道数还是192。网络每经过一个Inception Module,即使输出尺寸不变,特征被重新精炼一遍,丰富卷积和非线性化,提升网络性能。

    第2 Inception模块组第4个Inception Module,名称Mixed_6d。

    第2 Inception模块组第5个Inception Module,名称Mixed_6e。Mixed_6e存储end_points,作Auxiliary Classifier输助模型分类。

    第3个Inception模块组3个Inception Module。第2到第3Inception Module结构类似。

    第3 Inception模块组第1个Inception Module,名称Mixed_7a。3个分支。第一分支2层,192输出通道1x1卷积,连接320输出通道3x3卷积,步长2,padding模式VAILD,图片尺寸压缩为8x8。第二分支4层,192输出通道1x1卷积,192输出通道1x7卷积,192输出通道7x1卷积,192输出通道3x3卷积,最后一层步长2,padding模式VAILD,分支输出tensor尺寸8x8x192。第三分支3x3最大池化层,步长2,padding模式VAILD,池化层不改变输出通道,分支输出tensor尺寸8x8x768。三分支输出通道合并,最终输出尺寸8x8x(320+192+768)=8x8x1280。从这个Inception Module开始,输出图片尺寸缩小,通道数增加,tensor 总size下降。

    第3 Inception模块组第2个Inception Module,名称Mixed_7b。4个分支。第一分支320输出通道1x1卷积。第二分支,第一层384输出通道1x1卷积,第二层2个分支,384输出通道1x3卷积和384输出通道3x1卷积,用tf.concat合并两个分支,得到输出tensor尺寸8x8x(384+384)=8x8x768。第三分支,第一层448输出通道1x1卷积,第二层384输出通道3x3卷积,第三层2个分支,384输出通道1x3卷积和384输出通道3x1卷积,合并得到8x8x768输出tensor。第四分支3x3平均池化层,连接192输出通道1x1卷积。四分支合并,最终输出tensor尺寸8x8x(320+768+768+192)=8x8x2048。这个Inception Module,输出通道数从1280增加到2048。

    第3 Inception模块组第3个Inception Module,名称Mixed_7c。返回这个Inception Module结果,作inception_v3_base函数最终输出。

    Inception V3网络结构,首先5个卷积层和2个池化层交替普通结构,3个Inception模块组,每个模块组内包含多个结构类似Inception Module。设计Inception Net重要原则,图片尺寸不断缩小,从299x299通过5个步长2卷积层或池化层,缩小8x8,输出通道数持续增加,从开始3(RGB三色)到2048。每一层卷积、池化或Inception模块组,空间结构简化,空间信息转化高阶抽象特征信息,空间维度转为通道维度。每层输出tensor总size持续下降,降低计算量。Inception Module规律,一般4个分支,第1分支1x1卷积,第2分支1x1卷积再接分解后(factorized)1xn和nx1卷积,第3分支和第2分支类似,更深,第4分支最大池化或平均池化。Inception Module,通过组合简单特征抽象(分支1)、比较复杂特征抽象(分支2、分支3)、一个简化结构池化层(分支4),4种不同程度特征抽象和变换来有选择保留不同层高阶特征,最大程度丰富网络表达能力。

    全局平均池化、Softmax、Auxiliary Logits。函数inception_v3输入参数,num_classes最后需要分类数量,默认1000ILSVRC比赛数据集种类数,is_training标志是否训练过程,训练时Batch Normalization、Dropout才会被启用,dropout_keep_prob训练时Dropoutr所需保留节点比例,默认0.8。prediction_fn分类函数,默认使用slim.softmax。spatial_squeeze参数标志输出是否进行squeeze操作(去除维数1维度)。reuse标志网络和Variable是否重用。scope包含函数默认参数环境,用tf.variable_scope定义网络name、reuse参数默认值,用slim.arg_scope定义Batch Normalization和Dropout的is_trainin标志默认值。用incepiton_v3_base构筑整个网络卷积,拿到最后一层输出net和重要节点字典表end_points。

    Auxiliary Logits,辅助分类节点,帮助预测分类结果。用slim.arg_scope 卷积、最大池化、平均池化设默认步长1,默认padding模式SAME。通过end_points取Mixed_6e,再接5x5平均池化,步长3,padding设VALID,输出尺寸17x17x768变5x5x768。接128输出通道1x1卷积和768输出通道5x5卷积。权重初始化方式重设标准差0.01正态分布,padding模式VALID,输出尺寸变1x1x768。输出变1x1x1000。用tf.squeeze函数消除输出tensor前两个1维度。最后输助分类节点输出aux_logits储存到字典表end_points。

    分类预测逻辑。Mixed_7e最后卷积层输出8x8全局平均池化,padding模式VALID,输出tensor尺寸变1x1x2048。接Dropout层,节点保留率dropout_keep_prob。连接输出通道数1000的1x1卷积,激活函数、规范化函数设空。tf.squeeze去除输出tensor维数1维度,接Softmax分类预测结果。最后返回输出结果logits、包含输助节点end_points。

    Inception V3 网络构建完成。超参数选择,包括层数、卷积核尺寸、池化位置、步长大小、factorization使用时机、分支设计,需要大量探索和实践。

    Inception V3运算性能测试。网络结构大,令batch_size 32。图片尺寸299x299,用tf.random_uniform生成随机图片数据 input。用slim.arg_scope加载inception_v3_arg_scope(),scope包含Batch Normalization默认参数,激活函数和参数初始化方式默认值。在arg_scope,调inception_v3函数,传入inputs,获取logits和end_points。创建Session,初始化全部模型参数。设置测试batch数量100,用time_tensorflow_run测试Inception V3网络forward性能。

    Inception V3网络,图片面积比VGGNet 224x224大78%,forward速度比VGGNet快。2500万参数,比Inception V1的700万多,不到AlexNet的6000万的一半,比VGGNet的1.4亿少很多。42层,整个网络浮点计算量仅50亿次,比Inception V1的15亿次多,比VGGNet少。可以移植到普通服务器提供快速响应服务,或移植到手机实时图像识别。

    Inception V3 backward性能测试,将整个网络所有参数加入参数列表,测试对全部参数求导所需时间,或直接下载ImageNet数据集,使用真实样本训练并评测所需时间。

    Inception V3,Factorization into small convolutions很有效,可以降低参数量、减轻过拟合,增加网络非线性表达能力。卷积网络从输入到输出,图片尺寸逐渐缩小,输出通道数逐渐增加,空间结构简化,空间信息转化为高阶抽象特征信息。Inception Module多个分支提取不同抽象程度高阶特征很有效,丰富网络表达能力。

    参考资料:
    《TensorFlow实战》

    欢迎付费咨询(150元每小时),我的微信:qingxingfengzi

  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/libinggen/p/7248101.html
Copyright © 2011-2022 走看看