看到一篇将如何计算caffemodel大小的blog,感觉对理解模型大小很有帮助.

原文地址:http://blog.csdn.net/u014696921/article/details/52413561

  1. 模型参数很大一部分在于全连接层,而全连接层的参数 取决于全连接层的神经元个数 以及 前一层输出的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的大小计算(转载)的更多相关文章

  1. TensorFlow与caffe中卷积层feature map大小计算

    刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同 ...

  2. Java对象的内存布局以及对象所需内存大小计算详解

    1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...

  3. C++类所占内存大小计算

    C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...

  4. (一一七)基本文件操作 -SDWebImage清除缓存 -文件夹的大小计算

    在iOS的App沙盒中,Documents和Library/Preferences都会被备份到iCloud,因此只适合放置一些记录文件,例如plist.数据库文件.缓存一般放置到Library/Cac ...

  5. C++类的大小计算汇总

    C++中类涉及到虚函数成员.静态成员.虚继承.多继承.空类等. 类,作为一种类型定义,是没有大小可言的. 类的大小,指的是类的对象所占的大小.因此,用sizeof对一个类型名操作,得到的是具有该类型实 ...

  6. 【转载】【内存对齐(二)】__declspec( align(#) )的用法和大小计算

    转自:http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html 感谢作者! 在上面讲到了关于pack的内存对齐和计算方法,这里继续 ...

  7. Java对象大小计算

    这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...

  8. struct 大小计算

    结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...

  9. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

随机推荐

  1. HDU 2586 How far away? LCA 转化成RMQ

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 [题意] 给出一个N 个和N-1条边的连通图,询问任意两点间的距离.N<=40000 . [分 ...

  2. Windows下将ISO镜像制作成U盘启动的工具(U盘启动工具/UltraISO/Rufus/Universal-USB)

    说明:基于Windows的U盘启动制作都是非常的简单,在软件上指定ISO文件之后,一般都是选择写入到哪个U盘即可. 1.UltraISO 2.Rufus 3.Universal-USB 4.大白菜

  3. 通过脚本发送zabbix邮件报警

    zabbix原生的报警媒介类型中,邮件报警是我们常用的方式.当我们在CentOS6上面安装zabbix3.0并配置邮件报警的时候,在邮件配置正确的前提下,不管触发器如何触发,邮件总是发送不出去,但是在 ...

  4. Node.js的静态页面想通过jQuery的Ajax函数调用远程服务的措施无效

    程序下载:https://files.cnblogs.com/files/xiandedanteng/nodejsMakejqueryAjaxInvalid.rar 在 http://www.cnbl ...

  5. OpenCV2学习笔记(十五):利用Cmake高速查找OpenCV函数源代码

    在使用OpenCV时,在对一个函数的调用不是非常了解的情况下,通常希望查到该函数的官方声明.而假设想进一步研究OpenCV的函数,则必须深入到源码. 在VS中我们能够选中想要查看的OpenCV函数,点 ...

  6. html 后台页面布局

    <!DOCTYPE html> <html lang="en"> <head> <title></title> < ...

  7. swift -NavigationController,代理传值

    // // ViewController.swift // NavigationController // import UIKit import Foundation class ViewContr ...

  8. Hbase笔记1-2

    吴超1.1 Hbase是Hadoop中的数据库,Hadoop还需要数据库吗?我们学的Hadoop是一个分布式的存储和计算的平台为什么要在他上面建一个数据库呢,数据库是干什么的呢,数据库是一个管理系统( ...

  9. Convolutional Patch Networks with Spatial Prior for Road Detection and Urban Scene Understanding

    Convolutional Patch Networks with Spatial Prior for Road Detection and Urban Scene Understanding 深度学 ...

  10. My sql 实用教程

    http://wenku.baidu.com/link?url=uwWWeGTZU61MQSSArf2pYRd4jPd7k7gNsx75KxEUKO1MlMLAAFiIF-fus3CY4RLyyzbZ ...