mobilenet_v1

详解MobileNet V1,V2和V3 MobileNet系列是由谷歌公司的Andrew G. Howard等人于2016年提出的轻量级网络结构,并于2017年发布在arXiv上。MobileNet系列的特点是模型小、计算速度快,适合部署到移动端或者嵌入式系统中。相较于后期的巨型、难以训练的模型(如Transformer),MobileNet系列在卷积神经网络中是轻量级网络的经典。MobileNet对嵌入式设备非常友好。 阅读详情
  
import math
from keras.layers import *
from keras.layers import Activation
from keras.layers import GlobalAveragePooling2D
import keras.backend as K
import tensorflow as tf
def eca_layer(inputs_tensor=None,num=None,gamma=2,b=1,**kwargs):
    """
    ECA-NET
    :param inputs_tensor: input_tensor.shape=[batchsize,h,w,channels]
    :param num:
    :param gamma:
    :param b:
    :return:
    """
    channels = K.int_shape(inputs_tensor)[-1]
    t = int(abs((math.log(channels,2)+b)/gamma))
    k = t if t%2 else t+1
    x_global_avg_pool = GlobalAveragePooling2D()(inputs_tensor)
    x = Reshape((channels,1))(x_global_avg_pool)
    x = Conv1D(1,kernel_size=k,padding="same",name="eca_conv1_" + str(num))(x)
    x = Activation('sigmoid', name='eca_conv1_relu_' + str(num))(x)  #shape=[batch,chnnels,1]
    x = Reshape((1, 1, channels))(x)
    output = multiply([inputs_tensor,x])
    return output
import math
import numpy as np
import tensorflow as tf
from keras import backend
from keras import backend as K
from keras.applications import imagenet_utils
from keras.applications.imagenet_utils import decode_predictions
from keras.layers import (Activation, Add, Conv2D, Dense, DepthwiseConv2D, Reshape, MaxPooling2D,UpSampling2D,
                          Dropout, GlobalAveragePooling2D, GlobalMaxPooling2D, Multiply, Concatenate,AveragePooling2D,
                          Input, Lambda, MaxPooling2D, ZeroPadding2D)
from keras.layers.normalization import BatchNormalization
from keras.models import Model
from keras.preprocessing import image
from keras.utils.data_utils import get_file


def hard_swish(x):
    return x * K.relu(x + 3.0, max_value=6.0) / 6.0


def relu6(x):
    return K.relu(x, max_value=6)


def _conv_block(inputs, filters, kernel=(3, 3), strides=(1, 1)):
    x = Conv2D(filters, kernel,
               padding='same',
               use_bias=False,
               strides=strides,
               name='conv1')(inputs)
    x = BatchNormalization(name='conv1_bn')(x)
    return Activation(hard_swish, name='conv1_relu')(x)




def squeeze_dw(inputs, block_id=0):
    # 注意力机制单元
    input_channels = int(inputs.shape[-1])
    x = GlobalAveragePooling2D(name="conv_dw_%d_se_gap" % block_id)(inputs)
    x = Dense(int(input_channels / 16), kernel_initializer='random_uniform', name="conv_dw_%d_se_fc1" % block_id)(x)
    x = Activation(K.relu, name="conv_dw_%d_se_relu" % block_id)(x)
    x = Dense(input_channels, kernel_initializer='random_uniform', name="conv_dw_%d_se_fc2" % block_id)(x)
    x = Activation(K.sigmoid, name="conv_dw_%d_se_sigmoid" % block_id)(x)
    x = Reshape((1, 1, input_channels), name="conv_dw_%d_se_reshape" % block_id)(x)
    x = Multiply()([inputs, x])
    return x

def squeeze_pw(inputs, block_id=0):
    # 注意力机制单元
    input_channels = int(inputs.shape[-1])
    x = GlobalAveragePooling2D(name="conv_pw_%d_se_gap" % block_id)(inputs)
    x = Dense(int(input_channels / 16), kernel_initializer='random_uniform', name="conv_pw_%d_se_fc1" % block_id)(x)
    x = Activation(K.relu, name="conv_pw_%d_se_relu" % block_id)(x)
    x = Dense(input_channels, kernel_initializer='random_uniform', name="conv_pw_%d_se_fc2" % block_id)(x)
    x = Activation(K.sigmoid, name="conv_pw_%d_se_sigmoid" % block_id)(x)
    x = Reshape((1, 1, input_channels), name="conv_pw_%d_se_reshape" % block_id)(x)
    x = Multiply()([inputs, x])
    return x

def _depthwise_conv_block(inputs, sq_dw, sq_pw,pointwise_conv_filters, depth_multiplier=1, strides=(1, 1), block_id=1):
    x = DepthwiseConv2D((3, 3),
                        padding='same',
                        depth_multiplier=depth_multiplier,
                        strides=strides,
                        use_bias=False,
                        name='conv_dw_%d' % block_id)(inputs)

    x = BatchNormalization(name='conv_dw_%d_bn' % block_id)(x)
    x = Activation(hard_swish, name='conv_dw_%d_relu' % block_id)(x)


    # 引入注意力机制
    if sq_dw:
        x = squeeze_dw(x, block_id=block_id)


    # 点卷积
    x = Conv2D(pointwise_conv_filters, (1, 1),
               padding='same',
               use_bias=False,
               strides=(1, 1),
               name='conv_pw_%d' % block_id)(x)
    x = BatchNormalization(name='conv_pw_%d_bn' % block_id)(x)

    x = Activation(hard_swish, name='conv_pw_%d_relu' % block_id)(x)

    # 引入注意力机制
    if sq_pw:
        x = squeeze_pw(x, block_id=block_id)
    return x


def MobileNet_V1(inputs, sq_dw, sq_pw, embedding_size=128, dropout_keep_prob=0.4, alpha=1.0, depth_multiplier=1):
    # 160,160,3 -> 80,80,32
    # 128,128,3 -> 64,64,32
    x = _conv_block(inputs, 32, strides=(2, 2))

    # 80,80,32 -> 80,80,64
    # 64,64,32 -> 64,64,64
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 64, depth_multiplier, strides=(1, 1), block_id=1)

    # 80,80,64 -> 40,40,128
    # 64,64,64 -> 32,32,128
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 128, depth_multiplier, strides=(2, 2), block_id=2)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 128, depth_multiplier, block_id=3)

    # 40,40,128 -> 20,20,256
    # 32,32,128 -> 16,16,256
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 256, depth_multiplier, strides=(2, 2), block_id=4)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 256, depth_multiplier, block_id=5)
    # x3 = _depthwise_conv_block(x, sq_dw, sq_pw, 256, depth_multiplier, block_id=5)

    # 20,20,256 -> 10,10,512
    # 16,16,256 -> 8,8,512
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, strides=(2, 2), block_id=6)
    # x = _depthwise_conv_block(x3, sq_dw, sq_pw, 512, depth_multiplier, strides=(2, 2), block_id=6)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, block_id=7)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, block_id=8)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, block_id=9)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, block_id=10)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, block_id=11)
    # x2 = _depthwise_conv_block(x, sq_dw, sq_pw, 512, depth_multiplier, block_id=11)

    # 10,10,512 -> 5,5,1024
    # 8, 8, 512 -> 4, 4, 1024
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 1024, depth_multiplier, strides=(2, 2), block_id=12)
    # x = _depthwise_conv_block(x2, sq_dw, sq_pw, 1024, depth_multiplier, strides=(2, 2), block_id=12)
    x = _depthwise_conv_block(x, sq_dw, sq_pw, 1024, depth_multiplier, block_id=13)
    # x1 = _depthwise_conv_block(x, sq_dw, sq_pw, 1024, depth_multiplier, block_id=13)



    # 1024
    # 全局平局池化层
    # x = GlobalAveragePooling2D()(x)
    # x = Reshape((1, 1, 1024))(x)

    # dw替换gap
    x = DepthwiseConv2D((5, 5),
                        padding='valid',
                        depth_multiplier=1,
                        strides=(1, 1),
                        use_bias=False,
                        name='conv_dw_14')(x)
    x = Reshape((1024,), name="reshape_1024")(x)

    # 空间金字塔池化结构 spp
    # maxpool1 = MaxPooling2D(pool_size=(20, 20), strides=(1, 1), padding="same")(x3)
    # maxpool2 = MaxPooling2D(pool_size=(10, 10), strides=(1, 1), padding="same")(x2)
    # maxpool3 = MaxPooling2D(pool_size=(5, 5), strides=(1, 1), padding="same")(x1)
    # x = Concatenate()([maxpool1, maxpool2, maxpool3, x])
    # x = Reshape((2304,), name="reshape_1024")(x)

    # 空间金字塔池化结构 spp
    # maxpool1 = AveragePooling2D(pool_size=(20, 20), strides=(1, 1), padding="valid")(x3)
    # maxpool2 = AveragePooling2D(pool_size=(10, 10), strides=(1, 1), padding="valid")(x2)
    # maxpool3 = AveragePooling2D(pool_size=(5, 5), strides=(1, 1), padding="valid")(x1)
    # x = Concatenate()([maxpool1, maxpool2, maxpool3, x])
    # x = Reshape((2816,), name="reshape_1024")(x)



    # 防止网络过拟合,训练的时候起作用
    x = Dropout(1.0 - dropout_keep_prob, name='Dropout')(x)
    # 全连接层到128
    # 128
    x = Dense(embedding_size, use_bias=False, name='Bottleneck')(x)
    x = BatchNormalization(momentum=0.995, epsilon=0.001, scale=False,
                           name='BatchNorm_Bottleneck')(x)

    # 创建模型
    model = Model(inputs, x, name='mobilenet_v1')

    return model

if __name__ == "__main__":
    inputs = Input([160, 160, 3])
    # inputs = Input([128, 128, 3])
    model = MobileNet_V1(inputs, sq_dw=False, sq_pw=True)
    model.summary()

浅谈 Mobilenet V1-V3 一:复杂网络模型移植问题 二:模型剪枝策略 三:Mobilenet v1的横空出世 四:Mobilenet v2大杂烩 五:Mobilenet v3完全体   至此我对模型剪枝的原理,进行了简单讲解,希望对大家有所帮助,有不懂的地方或者建议,欢迎大家在下方留言评论。 我是努力在CV泥潭中摸爬滚打的江南咸鱼,我们一起努力,不留遗憾! ... 阅读详情

相关推荐

tensorflow 1.14 ssd_mobilenet_v1 模型训练

tensorflow ssd_mobilenet 模型训练 1 工具版本 序号 软件名称 版本 安装命令 1 操作系统 ubuntu 18.04 2 python 3.6.9 3 tensorflow 1.14 sudo pip3 install tensorflow 4 protobuf 3.12.3 2 下载 tensorflow/models 2.1 下载 git clone https://github.com/tensorflow/models.git 2.

bibo1984的博客 3829

深度学习笔记3——Pytorch 图像处理中ECA注意力机制的解析与代码详解

【代码】深度学习笔记2——Pytorch 图像处理中ECA注意力机制的解析与代码详解。

qq_35260752的博客 1149

UNet 改进(15):带有ECA注意力机制的UNet网络实现

模块化设计:每个功能组件都封装为独立的模块,便于理解和修改注意力机制:通过ECA模块增强了模型对重要特征的关注能力灵活性:支持双线性插值和转置卷积两种上采样方式对称结构:经典的编码器-解码器结构,带有跳跃连接这种结合了注意力机制的UNet变体在医学图像分割、遥感图像分析等任务中往往能取得比原始UNet更好的性能,同时保持了模型的高效性。

2401_82355416的博客 861

MobileNet v1 和 v2

1 MobileNet V1 MobileNet是针对移动端优化的卷积,所以当需要压缩模型时,可以考虑使用MobileNet替换卷积。下面我们开始学习MobileNet原理,并且先通过Tensorflow函数接口实现MobileNet,再手写python代码实现MobileNet。 1.1 普通卷积 MobileNet是用于替换普通卷积,相比普通卷积,MobileNet参数更少,计算速度更快...

Loong Cheng的博客 1万+

UNet 改进(23):基于深度可分离卷积的UNet实现

代码概述这段代码实现了一个UNet网络架构,并提供了两种卷积块选择:• 标准卷积块• 深度可分离卷积块通过参数可以灵活切换这两种实现方式,让我们能够比较不同卷积方式对网络性能的影响。核心组件解析2.1 深度可分离卷积(DepthwiseSeparableConv)深度卷积(Depthwise Convolution):对每个输入通道单独应用卷积核逐点卷积(Pointwise Convolution):使用1×1卷积混合通道信息。

2401_82355416的博客 1028

Miniconda3迁移(附图详细过程)

服务器上目录占满,想要将conda迁移到其他目录下的操作方法,详细教程。

2301_77554343的博客 6942

mobilenet-v1和mobilenet-v2详解

最近efficientnet和efficientdet在分类和检测方向达到了很好的效果,他们都是根据Google之前的工作,mobilenet利用nas搜索出来的结构。之前也写过《轻量级深度学习网络概览》,里面提到过mobilenetv1和mobilenetv2的一些思想。下面基于slim mobilenet的实现版本来具体讲讲他们的结构 一、mobilenet-v1 mobilenet-v1创新...

Michael’s Blog 2931

比利时风电光伏负荷一体化数据集解析与应用

本文深度解析了由比利时输电系统运营商Elia集团提供的风电光伏负荷一体化数据集。该数据集整合了负荷、风电与光伏出力数据,并包含多时间尺度的官方预测值,时间跨度长达四年,是研究能源转型、构建电力预测模型及分析电网运行的宝贵资源。文章详细介绍了数据价值、字段含义、实战应用场景(如预测模型基准测试、风光互补性分析)以及数据处理指南,为相关领域的研究与开发提供了高质量数据基础和实践参考。

weixin_29200741的博客 428

对MobileNet V1-V3的理解

可分离卷积分为:空间可分离卷积与深度可分离卷积 MobileNet用的是深度可分离卷积 深度可分离卷积: 深度可分离卷积=深度卷积(depthwise convolution)+逐点卷积(pointwise convolution) 一、MobileNet V1 详解 1. 设输入特征图是M维,卷积核是Dk * Dk,输出特征图是N维,大小是Dg * Dg 普通卷积: 计算量:Dk * Dk * M * N * Dg * Dg 计算量:5 * 5 * 3 * 256 * 8 * 8 ≈ 123W 深度卷.

方悔读书迟 5510

DCDC BUCK开关电源PCB设计

在开关电源中,BUCK(降压)电路、BOOST(升压)电路以及BUCK - BOOST(升降压)三种电路是最基本的拓扑结构。转换器又分DCDC(直流转直流)和ACDC(交流转直流),DCDC装换器结构无疑是比ACDC转换器结构简单,所以从DCDC转换器结构入手学习开关电源是一种很好的选择。本文主要从应用角度,进行相关器件的选型计算以及PCB绘制讲解DCDC 12V转5Vbuck电路。

2301_78342510的博客 6883

卡尔曼滤波器中的Q,R

对于系统状态的估计(滤波结果)所使用的信息来源于两个方面,一个是对系统状态演变模型的了解,包括系统转移矩阵和输入控制矩阵,输入孔质量等,另一方面来自于对系统状态的观测量。从上面公式来看,真正所要滤波得到的结果来自于公式(4)中的系统状态估计值x的某些分量,公式(4)的结果是由公式(1)所得到的状态预测值和来自观测量y计算得到的。所以,在不同算法中,R, Q的取值根据反应的不同量纲,可以有很大的变化,但它们的比值会决定了滤波值应该更多来自于系统模型演化的信息,还是来自于观察信号信息。

qq_43416206的博客 500

mobilenet系列论文解读:从v1-v3

一文看遍mobilenet,毫无疑问,移动端的轻量级网络中mobienet肯定是首当其冲,从v1-v3,有着相当的提升和改进,但究其核心,最主要的还是引入了深度可分离卷积的计算,确实很有代表性,不过在v3中引入了NAS,这就比较玄学了,v3我没有直接复现过,只玩过基于它实现的目标检测网络,v3的yolov3我记得可以在voc上做到74%左右,效果挺好的,v1和v2的目标检测网络,比如mobilenet-ssd、mobilenet-yolo在部署的时候的确相当轻量化,尤其是当年mobilenetv1-ssd结

lovep1的博客 4310

Vue3 + uniapp 踩坑:iOS 真机调试一直报错Maximum call stack size exceeded,和(in promise)MiniProgramError err的解决方法

不是你写错代码,是微信开发工具和 iOS 真机调试的兼容问题。开个空项目都报错,勾个设置就没问题,不是你,是工具的锅。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1265

MobileNet 进化史: 从 V1 到 V3(V1篇)

MobileNet 进化史: 从 V1 到 V3(V1篇) 这部分内容总共由如下 3 篇文章构成。 MobileNet 进化史: 从 V1 到 V3(V1篇) MobileNet 进化史: 从 V1 到 V3(V2篇) MobileNet 进化史: 从 V1 到 V3(V3篇) 1. 前言 MobileNet V1 是 Andrew G. Howard(Google Inc.) 等人于 201...

生命在于折腾! 4459

EMC意义下的共模(Common Mode)和差模(Differential Mode)

在电子产品中,信号或电源通过两根导线传输。对比维度差模(DM)共模(CM)电流方向一进一出,相等相反同向、相等回流路径两根导线组成的闭合回路地或外壳EMC影响较小容易辐射干扰,重点治理类型定义有用信号干扰信号抑制方法常规滤波器、电感、电容共模电感、磁环、屏蔽、接地技术等。

weixin_43199439的博客 1244

华为非AI方向0603笔试真题-爆破小游戏(详细思路+多语言题解)

华为非AI方向0603笔试第二题【爆破小游戏】,提供详细思路讲解以及代码实现。

qq_45776114的博客 358

MobileNet-V1

目录MobileNet-V11、深度可分离卷积2、MobileNet V1 模型架构3、宽度乘子 α\alphaα 和分辨率乘子 ρ\rhoρ4、对比同时期的一些重量级模型 MobileNet-V1 Author:Andrew G. Howard et al. MobileNetV1出自谷歌,主要技术是采用深度可分离卷积(Depthwise Separable Convolution)减低模型的...

weixin_37179744的博客 745

加速访问Cloudflare的网站的解决方案

本文主要介绍了加速访问Cloudflare的网站的解决方案,希望能对大家有所帮助。通过软件计算得到最快的IP地址的效果图如下图所示,具体解决方案参考下文。 在这里插入图片描述 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

MobileNet-v1和MobileNet-v2

MobileNet-v1: MobileNet主要用于移动端计算模型,是将传统的卷积操作改为两层的卷积操作,在保证准确率的条件下,计算时间减少为原来的1/9,计算参数减少为原来的1/7. MobileNet模型的核心就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的pointwise convolution操作。简单讲就是将原来一个卷积层分成两个卷积...

Chown先森 6890

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mobilenet v1_在mobilenet v1上进行评论

mobilenet v1In this article, I will explain about MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications paper from Google. They developed a class of efficient models calle...

weixin_26630173的博客 170

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比 DW与PW计算量 普通卷积计算量 计算量对比 2、MobileNet V1 MobileNet V1网络结构 MobileNet V1网络结构代码 3、MobileNet V2 倒残差结构模块 倒残差模块代码 MobileNet V2详细网络结构 MobileNet V2网络结构代码 4、MobileNet V3

guoqingru0311的博客 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

mobileNet-v1之pytorch实现

本博文主要是针对mobileNet-v1采用pytorch进行实现,代码也是参考他人的代码,具体实现如下: # -*- coding: utf-8 -*- """ Created on Tue May 21 20:41:58 2019 @author: Administrator """ import time import torch import torch.nn as ...

仰望星空 4969

MobileNet_V1----MobileNet_V3

MobileNet_v1 传统卷积网络,内存需求大,运算量大,无法在移动设备以及嵌入式设备上进行。 2017年Goolge提出MobileNet,相比于传统卷积神经网络,准确率小幅降低但大大较少了模型参数与运算量,并具备超参数α,β可根据需求调整精度与计算量。 传统卷积 对于传统卷积网络,卷积核channels=输入特征矩阵channels; 输出特征矩阵channels=卷积核个数 DWCNN即depthwise_conv,每个卷积核对应输入特征矩阵一个通道,卷积核channels=.

weixin_45104951的博客 2007

MobileNet 系列:从V1到V3

MobileNet 系列:从V1到V3

weixin_44966641的博客 969

MobileNet v1

摘要部分主要讲了MobileNet v1是基于流线型结构,其使用深度可分离卷积去构建轻量化神经网络。作者提出两个简单的全局超参数来高效的平衡延迟和准确性,而超参数允许模型构建者基于问题的约束来为其应用选择合适的模型大小。作者提出问题:现在的趋势是为了达到更高的准确率,网络结构越来越深、越来越复杂,但是实际上这些都没有必要的。在真实的应用中,识别任务是需要及时地展现在被限制的计算平台上。...

qq_45603050的博客 600

MobileNet V1

深度可分离卷积将传统卷积分为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。下面将详细介绍如何将传统卷积分离为深度卷积和逐点卷积以及为什么要引入深度可分离卷积。设输入特征维度为为通道数。标准卷积核的参数为为卷积核大小,为输入的通道数,为输出的通道数。卷积后输出维度为:。在传统卷积过程中每个卷积核对输入特征进行次扫描,每次扫描的深度为(channel),每个通道需要。

qq_35766376的博客 2032
上一篇: CBAM
下一篇: mobilenet_v3_224
半棵树dd
博客等级 码龄7年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值