【Caffe】caffemodel的大小计算(转载)
看到一篇将如何计算caffemodel大小的blog,感觉对理解模型大小很有帮助.
原文地址:http://blog.csdn.net/u014696921/article/details/52413561
- 模型参数很大一部分在于全连接层,而全连接层的参数 取决于全连接层的神经元个数 以及 前一层输出的feature maps 的神经元个数,前一层 feature maps的神经元个数非常重要!! 如果网络设计的不合理,在全连接层之前,feature maps 还是很大,那么全连接层的参数会非常非常多!举个例子,经典Lenet非常小吧? 28*28 的 Mnist 图片 经过 conv1: 5*5 pool1: 2*2 conv2: 5*5 pool2: 2*2
到达全连接层之前的feature maps 是 4*4*50 (50是conv2的卷积核数 ),那么全连接层一的参数就是
4*4*50*500 = 400,000 ,40万个参数
但是如果把227*227的直接扔进去呢? 经过:conv1: 5*5 pool1: 2*2 conv2: 5*5 pool2: 2*2 ,
到达全连接层之前的feature maps 是 54*54*50,那么全连接层一的参数是 54*54*50*500 =72,900,000 直接多出 54*54 / (4*4) = 182.25 倍的参数
所以网络的设计(卷积层+pool层) 应该与图片的输入相匹配,否则网络参数会”爆炸”
以下是caffemodel所占内存的计算方法:
虽然之前有大概想过caffemodel的大小的估算方法,但是一直没有自己亲自算一算,最近心血来潮,把这件事情给干了,下面是我的计算方法,在这里和各位朋友分享交流。
caffemodel是训练过程中产生的文件,里面主要存放的是网络模型中各层的w和b参数,另外还存放网络形状等其它的一些信息。所以我们可以看到,caffemodel的大小主要取决于模型的w和b参数的数量。
w和b参数的数量主要由下面的两个因素决定:
1. 网络结构。比如:卷积层数量,全连接层数量,卷积核大小、个数等等;
2. 网络输入。当网络含有全连接层的时候需要考虑这个因素,我在下面还会结合例子做具体的解释。
下面先给出一个简单的例子:
假设网络总共有10000个w和b参数,这些参数用float类型(4 Bytes)的变量表示,caffemodel的大小将大约是4*10000=40000 Bytes(会稍微大一点,因为caffemodel中除了存放参数还会存放类似上面提到的网络形状等等一些其它信息)。
下面再给出一个caffe中的具体例子(mnist的lenet_train_test.prototxt):
用 http://www.cnblogs.com/denny402/p/5106764.html的方法画出网络模型图如下(图片有点小~~具体的数字可以参考 lenet_train_test.prototxt):
该网络主要有两个卷积层和两个全连接层,具体可以简化如下图(两个卷积层的卷积核都为5*5,步长stride都为1,两个pool层都为2*2,步长为2):
下面是对各层w和b参数的计算,(如果对参数数量计算方式不是很了解的可以参看下面的这篇博文: http://blog.csdn.net/zouxy09/article/details/8781543)
conv1:
w数量:5*5*1*20=500
b数量:20
conv2:
w数量:5*5*20*50=25000
b数量:50
ip1:
w数量:1*1*(4*4*50)*500=400000
b数量:500
ip2:
w数量:1*1*500*10=5000
b数量:10
把上面各层的参数相加得到:
(500 + 20) + (25000 + 50) + (400000 + 500) + (5000 + 10) = 431080
即总共有431080个w和b参数,因为每一个参数以float类型(4 Bytes)存储,所以存储这么多参数需要的空间为:
431080 * 4 = 1724320 (Byte) 约等于 1.64 MB 。
计算出来的结果和训练得到的caffemodel的大小差不多(稍微小了一点)。
到这里,我们就基本上解释了怎么估算一个caffemodel的大小了。上面还卖了个关子,提到w和b参数除了和网络结构有关以外,还和网络的输入有关。
以上面的mnist例子来说,假如输入不是28*28而是N*N(这里N是比28大的一个整数),那么假设pool2的输出表示为n*n(在网络结构不变的情况下,这里的n比4大),所以也就导致了ip1全连接层的w参数数量增多(ip1的w参数数量为 n*n*50*500),从而导致了caffemodel大小的变化。
从上面的计算大家也可以看到,一个网络的大小很大程度上取决于全连接层,第一个全连接层的连接数(参数数量)一般是最多的。后来《Network in Network》把全连接层换成average pooling,目的就是为了减小参数的数量。有兴趣的朋友可以搜一搜这篇论文看看。
【Caffe】caffemodel的大小计算(转载)的更多相关文章
- TensorFlow与caffe中卷积层feature map大小计算
刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同 ...
- Java对象的内存布局以及对象所需内存大小计算详解
1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...
- C++类所占内存大小计算
C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...
- (一一七)基本文件操作 -SDWebImage清除缓存 -文件夹的大小计算
在iOS的App沙盒中,Documents和Library/Preferences都会被备份到iCloud,因此只适合放置一些记录文件,例如plist.数据库文件.缓存一般放置到Library/Cac ...
- C++类的大小计算汇总
C++中类涉及到虚函数成员.静态成员.虚继承.多继承.空类等. 类,作为一种类型定义,是没有大小可言的. 类的大小,指的是类的对象所占的大小.因此,用sizeof对一个类型名操作,得到的是具有该类型实 ...
- 【转载】【内存对齐(二)】__declspec( align(#) )的用法和大小计算
转自:http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html 感谢作者! 在上面讲到了关于pack的内存对齐和计算方法,这里继续 ...
- Java对象大小计算
这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...
- struct 大小计算
结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte
#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...
随机推荐
- iOS中正则表达式的基本使用方法
一.第三方框架RegexKitLite的使用 在ios项目中可以借用第三方框架RegexKitLite来简化对正则表达式的使用,使用方法如下 1.去RegexKitLite下载类库,解压出来会有一个例 ...
- 从内存溢出看Java 环境中的内存结构
作为有个java程序员,我想大家对下面出现的这几个场景并不陌生,倍感亲切,深恶痛绝,抓心挠肝,一定会回过头来问为什么为什么为什么会这样,嘿嘿,让我们看一下我们日常在开发过程中接触内存溢出的异常: Ex ...
- sql server 性能调优 资源等待之内存瓶颈的三种等待类型
原文:sql server 性能调优 资源等待之内存瓶颈的三种等待类型 一.概述 这篇介绍Stolen内存相关的主要三种等待类型以及对应的waittype编号,CMEMTHREAD(0x00B9),S ...
- How To Use NSOperations and NSOperationQueues
Update 10/7/14: This tutorial has now been updated for iOS 8 and Swift; check it out! Everyone has h ...
- [Functional Programming] Transition State based on Existing State using the State ADT (liftState, composeK)
While sometimes outside input can have influence on how a given stateful transaction transitions, th ...
- EffectiveJava(17)要么为继承而设计,要么禁止继承
1.如果为了继承而设计类,那么该类必须有文档说明它可覆盖的方法的自用性.对于每个公有的 或受保护的方法或者构造器,它的文档必须指明该方法或者构造器调用了那些可覆盖的方法,是以 什么顺序调用的,每个调用 ...
- json-server模拟接口获取mock数据
转载:http://blog.csdn.net/stevennest/article/details/76167343 安装json-server 运行以下命令 cnpm install json-s ...
- 100多道经典的JAVA面试题及答案解析
面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...
- h5+ 管理设备信息
Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 1.属性 1.1.imei: 设备的国际移动设备身份码, ...
- jQuery异步框架探究2:jQuery.Deferred方法
(本文针对jQuery1.6.1版本号)关于Deferred函数的描写叙述中有一个词是fledged,意为"羽翼丰满的",说明jQuery.Deferred函数应用应该更成熟. 这 ...