VGG 参数分析 转
上面放了一个keras用vgg16训练测试的例子,我也试过用vgg16训练然后测试自己的例子,效果一般,这里我们来分析一下vgg16的网络结果
keras代码如下
- def VGG_16(weights_path=None):
- model = Sequential()
- model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))#卷积输入层,指定了输入图像的大小
- model.add(Convolution2D(64, 3, 3, activation='relu'))#64个3x3的卷积核,生成64*224*224的图像,激活函数为relu
- model.add(ZeroPadding2D((1,1)))#补0,保证图像卷积后图像大小不变,其实用<span style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;color:#333333;"><span style="font-size:10.8px;">padding = 'valid'参数就可以了</span></span>
- model.add(Convolution2D(64, 3, 3, activation='relu'))#再来一次卷积 生成64*224*224
- model.add(MaxPooling2D((2,2), strides=(2,2)))#pooling操作,相当于变成64*112*112
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(128, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(128, 3, 3, activation='relu'))
- model.add(MaxPooling2D((2,2), strides=(2,2)))#128*56*56
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(256, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(256, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(256, 3, 3, activation='relu'))
- model.add(MaxPooling2D((2,2), strides=(2,2)))#256*28*28
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(512, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(512, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(512, 3, 3, activation='relu'))
- model.add(MaxPooling2D((2,2), strides=(2,2)))#512*14*14
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(512, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(512, 3, 3, activation='relu'))
- model.add(ZeroPadding2D((1,1)))
- model.add(Convolution2D(512, 3, 3, activation='relu'))
- model.add(MaxPooling2D((2,2), strides=(2,2))) #到这里已经变成了512*7*7
- model.add(Flatten())#压平上述向量,变成一维25088
- model.add(Dense(4096, activation='relu'))#全连接层有4096个神经核,参数个数就是4096*25088
- model.add(Dropout(0.5))#0.5的概率抛弃一些连接
- model.add(Dense(4096, activation='relu'))#再来一个全连接
- model.add(Dropout(0.5))
- model.add(Dense(1000, activation='softmax'))
- if weights_path:
- model.load_weights(weights_path)
- return model
下面是详细的参数个数
- INPUT: [224x224x3] memory: 224*224*3=150K weights: 0
- CONV3-64: [224x224x64] memory: 224*224*64=3.2M weights: (3*3*3)*64 = 1,728 3*3 代表卷积大小 *3 代表输入时3个通道 *64代表输出64个
- CONV3-64: [224x224x64] memory: 224*224*64=3.2M weights: (3*3*64)*64 = 36,864 同理3*3是卷积大小 *64代表输入64通道 *64代表输出是64通道
- POOL2: [112x112x64] memory: 112*112*64=800K weights: 0
- CONV3-128: [112x112x128] memory: 112*112*128=1.6M weights: (3*3*64)*128 = 73,728
- CONV3-128: [112x112x128] memory: 112*112*128=1.6M weights: (3*3*128)*128 = 147,456
- POOL2: [56x56x128] memory: 56*56*128=400K weights: 0
- CONV3-256: [56x56x256] memory: 56*56*256=800K weights: (3*3*128)*256 = 294,912
- CONV3-256: [56x56x256] memory: 56*56*256=800K weights: (3*3*256)*256 = 589,824
- CONV3-256: [56x56x256] memory: 56*56*256=800K weights: (3*3*256)*256 = 589,824
- POOL2: [28x28x256] memory: 28*28*256=200K weights: 0
- CONV3-512: [28x28x512] memory: 28*28*512=400K weights: (3*3*256)*512 = 1,179,648
- CONV3-512: [28x28x512] memory: 28*28*512=400K weights: (3*3*512)*512 = 2,359,296
- CONV3-512: [28x28x512] memory: 28*28*512=400K weights: (3*3*512)*512 = 2,359,296
- POOL2: [14x14x512] memory: 14*14*512=100K weights: 0
- CONV3-512: [14x14x512] memory: 14*14*512=100K weights: (3*3*512)*512 = 2,359,296
- CONV3-512: [14x14x512] memory: 14*14*512=100K weights: (3*3*512)*512 = 2,359,296
- CONV3-512: [14x14x512] memory: 14*14*512=100K weights: (3*3*512)*512 = 2,359,296
- POOL2: [7x7x512] memory: 7*7*512=25K weights: 0
- FC: [1x1x4096] memory: 4096 weights: 7*7*512*4096 = 102,760,448
- FC: [1x1x4096] memory: 4096 weights: 4096*4096 = 16,777,216
- FC: [1x1x1000] memory: 1000 weights: 4096*1000 = 4,096,000
- TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
- TOTAL params: 138M parameters
VGG 参数分析 转的更多相关文章
- AI:IPPR的数学表示-CNN结构/参数分析
前言:CNN迎接多类的挑战 特定类型的传统PR方法特征提取的方法是固定的,模式函数的形式是固定的,在理论上产生了特定的"局限性" 的,分类准确度可以使用PAC学习理论的方法计算出来 ...
- http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站
http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站 http_load -p 50 -s 120 urls
- cocos2dx tolua传递参数分析
cocos2dx tolua传递参数分析: tolua_Cocos2d_CCNode_addChild00 == void CCNode::addChild(CCNode *child) tolua_ ...
- jQuery学习笔记之jQuery.fn.init()的参数分析
这篇文章主要介绍了jQuery.fn.init()的参数分析,需要的朋友可以参考下 从return new jQuery.fn.init( selector, context, rootjQuer ...
- JavaScript事件监听以及addEventListener参数分析
事件监听 在Javascript中事件的监听是用来对某些操作做出反应的方法.例如监听一个按钮的pressdown, 或者获取鼠标左键按下时候鼠标的位置.这些都需要使用监听来完成.监听的函数很简单:ad ...
- Jmeter5.1——聚合报告参数分析
Jmeter5.1——聚合报告参数分析 Label: 每个JMeter的element的Name值.例如HTTP Request的Name. Samples:发出请求的数量.如果线程组中配置的是线程数 ...
- BMDP为常规的统计分析提供了大量的完备的函数系统,如:方差分析(ANOVA)、回归分析(Regression)、非参数分析(Nonparametric Analysis)、时间序列(Times Series)等等。此外,BMDP特别擅于进行出色的生存分析(Survival Analysis )。许多年来,一大批世界范围内顶级的统计学家都曾今参与过BMDP的开发工作。这不仅使得BMDP的权威性得到
BMDP是Bio Medical Data Processing的缩写,是世界级的统计工具软件,至今已经有40多年的历史.目前在国际上与SAS.SPSS被并称为三大统计软件包.BMDP是一个大 ...
- Impala队列内存参数分析
同步发布在csdn上 问题 对Impala队列内存的几个参数分析了下,欢迎指正 队列资源池的几个内存配置 Maximum Query Memory Limit 某个队列资源池,一个查询在一个Impal ...
- external-attacher源码分析(1)-main方法与启动参数分析
更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 摘要 ceph-csi分析-external-attacher源码分析.external- ...
随机推荐
- 调用 Webapi 跨域
先讲一下,web和client各自调用webapi的post和get实例 Get方式 [HttpGet] public dynamic Test(string a) { return a+" ...
- 快乐的Lambda表达式(一)
转载:http://www.cnblogs.com/jesse2013/p/happylambda.html 原文出处: Florian Rappl 译文出处:Jesse Liu 自从Lambda ...
- MT【219】构造二次函数
(2012北大保送)已知$f(x)$是二次函数,且$a,f(a),f(f(a)),f(f(f(a)))$是正项等比数列;求证:$f(a)=a$ 构造二次函数$f(x)=qx$,则$a,f(a),f(f ...
- 树剖模板(洛谷P3384 【模板】树链剖分)(树链剖分,树状数组,树的dfn序)
洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\su ...
- 自学Linux Shell3.6-文件查看命令file cat more less tail head
点击返回 自学Linux命令行与Shell脚本之路 3.6-文件查看命令file cat more less tail head 1.参看文件类型file 该命令用来识别文件类型,也可用来辨别一些文件 ...
- 51nod 1061 最复杂的数V2
题目链接 51nod 1061 题面简述 求\([1, n]\)中约数个数最多的数. \(n \le 10^{200}\) 题解 首先,答案一定是一个反素数. 什么是反素数? 一个正整数\(x\)是反 ...
- 【AGC010D】Decrementing
Solution 日常博弈论做不出来. 首先,数值全部为1的局面先手必败. 在接下来的过程中,我们只关注那些大于1的数值. 按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同.那么局面 ...
- Hessian使用
ps:以前在项目中用过hessian,但我仅停留在知道这个层面,后面也没有详细了解其中的原理.现在要写简历都不知道怎么写,自己挖的坑,跪着也要填平. Hessian的使用 这里先写下工程中的使用,有个 ...
- 走进Java中的持有对象(容器类)【二】Collection
概述 通过前文的学习,我们对容器的分类及常用容器类的作用有了基本的认识.本文将针对Collection容器的功能与使用进行细致分析. 基本操作 Collection集合抽象出的目的是为存放独立元素的序 ...
- Java设计模式--缺省适配器模式
我认为这个模式比较常见,还记得我们学习Swing的时候吗,有没有见过很多Adapter?那时候不知道Adapter的意义所在,但至少知道他能够省去我们不需要的实现. 这个社会有N中职业(job),但是 ...