shuffleNet_flush privileges

shuffleNet_flush privilegeschannelshuffle:1)利用group,再组间进行深度卷积。优点:1)极大减小计算量(FLOPS)由于每个filter不再是和输入的全部featuremap做卷积,而是仅仅和一个group的featuremap做卷积。缺点:边界效应产生,即某个输出channel仅仅来自输入channel的一小部分细节:一般卷积操作中比如输入fe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

channel shuffle:

1)利用group ,再组间进行深度卷积。

优点:1)极大减小计算量(FLOPS)

               由于每个filter不再是和输入的全部feature map做卷积,而是仅仅和一个group的feature map做卷积。

 缺点:边界效应产生,即某个输出channel仅仅来自输入channel的一小部分

细节:一般卷积操作中比如输入feature map的数量是N,该卷积层的filter数量是M,那么M个filter中的每一个filter都要和N个feature map的某个区域做卷积,然后相加作为一个卷积的结果。假设你引入group操作,设group为g,那么N个输入feature map就被分成g个group,M个filter就被分成g个group,然后在做卷积操作的时候,第一个group的M/g个filter中的每一个都和第一个group的N/g个输入feature map做卷积得到结果,第二个group同理,直到最后一个group.

2)为了抵消边界效应,提出channel shuffle

这里写图片描述

本质; 即进行GConv2之前,对其输入feature map做一个分配,使得GConv2的每一个group都能卷积输入的所有group的feature map

def _shuffle(x, groups):
    def shuffle_layer(x):
        _, w, h, n = K.int_shape(x)
        nb_chan_per_grp = n // groups

        x = K.reshape(x, (-1, w, h, nb_chan_per_grp, groups))
        x = K.permute_dimensions(x, (0, 1, 2, 4, 3)) # Transpose only grps and chs(按照给定的模式重排一个张量的轴)
        x = K.reshape(x, (-1, w, h, n)
        return x

 

 

附代码:

 

from keras.models import Model
from keras.layers import *
from keras.activations import *
from keras.callbacks import *
import keras.backend as K
from keras.engine.topology import get_source_inputs
count=0
def _info(groups):
    return {
        1: [24, 144, 288, 576],
        2: [24, 200, 400, 800],
        3: [24, 240, 480, 960],
        4: [24, 272, 544, 1088],
        8: [24, 384, 768, 1536]
    }[groups], [None, 3, 7, 3]


def basemodel(input_tensor=None, input_shape=None,groups=8):

    if input_tensor is None:
        img_input = Input(shape=input_shape)
    else:
        if not K.is_keras_tensor(input_tensor):
            img_input = Input(tensor=input_tensor, shape=input_shape)
        else:
            img_input = input_tensor

    bn_axis = 3 if K.image_data_format() == 'channels_last' else 1

    x = Conv2D(24,
               kernel_size=(3, 3),
               strides=2,
               use_bias=False,
               padding='same')(img_input)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = MaxPooling2D(pool_size=(3, 3),
                     strides=2,
                     padding='same',)(x)
    x = Activation('relu',name='pool1')(x)


    channels_list, repeat_list = _info(groups)   #  [24, 200, 400, 800],[None, 3, 7, 3]
   # import pdb;pdb.set_trace()

    for i, (out_channels, repeat) in enumerate(zip(channels_list[1:], repeat_list[1:]), start=1):

        x = _stage(x, groups, channels_list[i-1], out_channels, repeat)


 #8
    if input_tensor is not None:
        inputs = get_source_inputs(input_tensor)
    else:
        inputs = img_input
    model = Model(inputs, x, name='basemodel_dense')

    return model


def _stage(tensor, groups, in_channels, out_channels, repeat):#repeat=repeat_list[1:],[None, 3, 7, 3]
    x = _shufflenet_unit(tensor, groups, in_channels, out_channels, 2) #2

    for _ in range(repeat):
        x = _shufflenet_unit(x, groups, out_channels, out_channels, 1)


    return x

#out_i=[4,12,16]
#(name='stage%s'% k[0])

def _pw_group(tensor, groups, in_channels, out_channels):      #一个组,分通道卷积操作,之后cancat
    """Pointwise grouped convolution."""
    nb_chan_per_grp = in_channels // groups

    pw_convs = []
    for grp in range(groups):
        x = Lambda(lambda x: x[:, :, :, nb_chan_per_grp * grp: nb_chan_per_grp * (grp + 1)])(tensor)
        grp_out_chan = int(out_channels / groups + 0.5)

        pw_convs.append(
            Conv2D(grp_out_chan,
                   kernel_size=(1, 1),
                   padding='same',
                   use_bias=False,
                   strides=1)(x)
        )

    return Concatenate(axis=-1)(pw_convs)


def _shuffle(x, groups):            #通道间的打乱
    def shuffle_layer(x):
        _, w, h, n = K.int_shape(x)
        nb_chan_per_grp = n // groups

        x = K.reshape(x, (-1, w, h, nb_chan_per_grp, groups))
        x = K.permute_dimensions(x, (0, 1, 2, 4, 3)) # Transpose only grps and chs(按照给定的模式重排一个张量的轴)
        x = K.reshape(x, (-1, w, h, n))

        return x

    return Lambda(shuffle_layer)(x)


def _shufflenet_unit(tensor, groups, in_channels, out_channels, strides, shuffle=True, bottleneck=4):
    bottleneck_channels = out_channels // bottleneck

    x = _pw_group(tensor, groups, in_channels, bottleneck_channels)   #深度可分离卷积
    x = BatchNormalization()(x)
    x = Activation('relu')(x)

    if shuffle:
        x = _shuffle(x, groups)         #通道间的打乱

    x = DepthwiseConv2D(kernel_size=(3, 3),             #深度卷积
                        padding='same',
                        use_bias=False,
                        strides=strides)(x)
    x = BatchNormalization()(x)


    x = _pw_group(x, groups, bottleneck_channels,
                  out_channels if strides < 2 else out_channels - in_channels)
    x = BatchNormalization()(x)

    if strides < 2:
        x = Add()([tensor, x])
    else:
        avg = AveragePooling2D(pool_size=(3, 3),
                               strides=2,
                               padding='same')(tensor)

        x = Concatenate(axis=-1)([avg, x])
    global count
    count+=1
    x = Activation('relu',name='stage%s'% count)(x)



    return x



 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195795.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最全QQ盗号手法分析,全面防御QQ盗号[通俗易懂]

    最全QQ盗号手法分析,全面防御QQ盗号[通俗易懂]你的QQ是否被盗过号,或者你身边的朋友、同学是否有过被盗号的经历。如今的安全机制真的没有效吗?盗号真的这么简单吗?本期将彻底解决这一问题。本期是上一期的姊妹篇,建议先看上一期,这样对于攻击者的手法才有更好的理解:传送门常见的盗号手法1、诱导链接以及二维码  这种情况在QQ群里面见的多。通常是发送一些具有诱惑性的链接诱导你去点击。也可能会是一些二维码,如下图。为了做这期,能更好的了解其盗号的手段,我把凡是我看到的盗号链接都点了个遍,那些恶意二维码我也扫了个遍。这是我在了解其原理并做了相应的安全措施.

    2022年7月26日
    12
  • centos7 配置lamp 环境[通俗易懂]

    centos7 配置lamp 环境[通俗易懂]搭建版本版本组合php5.6+apache/2.4.6(centos7)+mysql5.7.24因为新系统不能确认哪些指令已经搭建所以安装前需要确认下是否拥有检测是否已经安装过Vimrpm-qa|grepvim显示出完整的包名:vim-common,vim-enhanced,vim-minimal,vim-filesystem表示安装成功若是缺少Vim包名:则使用命令:比如说:vim-enhanced这个包少了,执行:yum-yinstallvim-enha..

    2022年5月29日
    36
  • pycharm的调试功能_安卓调试模式怎么打开

    pycharm的调试功能_安卓调试模式怎么打开Debug调试,是对于学习编程人员来说是一项重要的技能。只有当你学会debug了以后,才可以正确的知道程序的走向流程是如何的,DEBUG是排除程序故障的意思。debug则是通过工具来对代码进行调试,进而一步步找出程序中出现bug的位置,也就是程序中具体错误代码的位置。Pycharm中的debug模式首先,还是用示例说话,我们先写一段简短的代码,来帮助我们完成今天要讲的内容。初学者可能没见过for循环中的下划线‘_’,在Python中是占位符的意思,因…

    2022年8月28日
    1
  • SMO算法最通俗易懂的解释

    SMO算法最通俗易懂的解释我的机器学习教程「美团」算法工程师带你入门机器学习已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~SVM通常用对偶问题来求解,这…

    2022年6月30日
    22
  • java虚拟机内存分配_深入理解java虚拟机第二版

    java虚拟机内存分配_深入理解java虚拟机第二版深入理解Java虚拟机之对象的内存布局、访问定位

    2022年4月20日
    40
  • plsql 中文乱码 字符集解决方案「建议收藏」

    plsql 中文乱码 字符集解决方案「建议收藏」1.环境变量,NLS_LANG:SIMPLIFIEDCHINESE_CHINA.ZHS16GBK2.如果想转换为UTF8字符集,可以赋予“NLS_LANG”为“AMERICAN_AMERICA.UTF8”3.oracle查看数据库字符集select*fromnls_database_parameters,其来源于props$,是表示数据库的字符集。客户端字符集环境

    2022年6月10日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号