caffemodel结构 里面有结构吗

Everything comes to you at the right time.
可视化caffe模型结构
假设Caffe的目录是$(CAFFE_ROOT)
1.编译caffe的python接口
$ make pycaffe
2.装各种依赖
$ pip install pydot
$ sudo apt-get install graphviz
3.可视化模型
$ cd $(CAFFE_ROOT)/python/
$ ./draw_net.py ../../models/VGG_CNN_M_1024/test.prototxt VGG_CNN_M_1024.jpg
路径自己改变,./draw_net.py后面接prototxt路径和可视化图像的保存路径。
4.最终的图像。
没有更多推荐了,真正博客: http://yanjoy.win/
caffe学习(1)caffe模型三种结构
caffe模型三种结构
Blob:存储和传递(communication)
blob是数据存储和传输的包装,并且还在底层提供CPU和GPU之间的同步能力。Blob提供了保存数据的统一存储器接口; 例如图像批次,模型参数和用于优化的导数。 在数学上,blob是以C连续方式(C-contiguous fashion)存储的N维数组。
关于C连续方式,有一个解释。该方式主要与Fortran和Matlab相反,是一种以行为主顺序()的存储方式,简单的说就是把一行存完,再存下一行,把第一个通道(channel)的所有行写完后写完再写下一个通道。例如对一批(batches)图像,用4维blob存储,表示为number N(数据批量大小) x channel K(通道、维度特征) x height H (高)x width W(宽),对于索引 (n, k, h, w) 的物理地址就是:((n * K + k) * H + h) * W + w,注意区分大小写,大写是总的,小写是索引值。对于图像是4D的,当然也可以不用4D。具体参数需要根据层类型和数据大小配置。
blob使用了两块存储区域,为data(数据)和diff(网络梯度),实际值可以存储在CPU或GPU上,访问也可以不变(const)访问或者可变(mutable)访问。
const Dtype* cpu_data()
Dtype* mutable_cpu_data();
同理可得GPU上diff类型数据操作。官网上有一个example,展示了数据在CPU和GPU上流动操作。
Layer计算和连接
包括很多计算方法,如
Vision Layers:Convolution、Pooling、LRN
Loss Layers:Softmax、Sum-of-Squares
既然作为计算,就有输入输出,输入从底部(bottom)获取,并通过顶部(top)连接输出。每层须有三个关键计算:setup, forward, and backward。
setup:初始化层和连接。
forward:底部向顶部计算。
backward:给定梯度,从top计算传回bottom。A layer with parameters computes the gradient w.r.t. to its parameters and stores it internally.(是说存在layer中吗)
forward和backward也分为CPU和GPU两个版本。
If you do not implement a GPU version, the layer will fall back to the CPU functions as a backup option. This may come handy if you would like to do quick experiments, although it may come with additional data transfer cost
这里好像是说使用GPU会因为数据需要从CPU复制到GPU上,因此会有数据传输成本,但GPU跑的还是快一些,所以是quick experiments。
Net定义和操作
Net由Layer组成(The net is a set of layers connected in a computation graph有向无环图)。模型初始化由Net :: Init()处理:主要是创建blob和layer,并调用layer里的setup,同时会输出INFO。
模型定义在.prototxt文件中,训练好的模型在model目录下.binaryproto格式的文件中,模型的格式由caffe.proto定义。
没有更多推荐了,caffe zoo .caffemodels模型下载\通过网络结构估算caffemodel文件的大小(转载)
这里有很多模型文件,训练好的。
http://dl.caffe.berkeleyvision.org/
虽然之前有大概想过caffemodel的大小的估算方法,但是一直没有自己亲自算一算,最近心血来潮,把这件事情给干了,下面是我的计算方法,在这里和各位朋友分享交流。
caffemodel是训练过程中产生的文件,里面主要存放的是网络模型中各层的w和b参数,另外还存放网络形状等其它的一些信息。所以我们可以看到,caffemodel的大小主要取决于模型的w和b参数的数量。
w和b参数的数量主要由下面的两个因素决定:
网络结构。比如:卷积层数量,全连接层数量,卷积核大小、个数等等;网络输入。当网络含有全连接层的时候需要考虑这个因素,我在下面还会结合例子做具体的解释。
下面先给出一个简单的例子:
假设网络总共有10000个w和b参数,这些参数用float类型(4 Bytes)的变量表示,caffemodel的大小将大约是4* Bytes(会稍微大一点,因为caffemodel中除了存放参数还会存放类似上面提到的网络形状等等一些其它信息)。
下面再给出一个caffe中的具体例子(mnist的lenet_train_test.prototxt):
的方法画出网络模型图如下(图片有点小~~具体的数字可以参考
lenet_train_test.prototxt):
该网络主要有两个卷积层和两个全连接层,具体可以简化如下图(两个卷积层的卷积核都为5*5,步长stride都为1,两个pool层都为2*2,步长为2):
下面是对各层w和b参数的计算,(如果对参数数量计算方式不是很了解的可以参看下面的这篇博文: )
w数量:5*5*1*20=500b数量:20
w数量:5*5*20*50=25000b数量:50
w数量:1*1*(4*4*50)*500=400000b数量:500
w数量:1*1*500*10=5000b数量: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模型中如果存在分支结构, 如fast-rcnn, 最后分支那里,loss是怎么回传的? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。1被浏览99分享邀请回答暂时还没有回答,开始写第一个回答&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
caffemodel的解析
摘要:在用caffe做finetune的时候,可能需要对现有的预训练模型进行调整和修改。通过加载已经训练好的模型,结合自身网络结构的特点进行裁剪。以下是读取caffemodel,并将model中的网络展示出来。#include#include#include#include#include&proto/caffe.pb.h&intmain(intargc,char*argv[]){caf
在用caffe做finetune的时候,可能需要对现有的预训练模型进行调整和修改。通过加载已经训练好的模型,结合自身网络结构的特点进行裁剪。以下是读取caffemodel,并将model中的网络展示出来。
#include &proto/caffe.pb.h&
int main(int argc, char* argv[])
caffe::NetP
//通过proto的形式反序列化caffemodel
fstream input(&lenet_iter_10000.caffemodel&, ios::in | ios::binary);
if (!msg.ParseFromIstream(∈put))
cerr && &Failed to parse address book.& &&
return -1;
printf(&length = %d/n&, length);
printf(&Repeated Size = %d/n&, msg.layer_size());
::google::protobuf::RepeatedPtrField& LayerParameter &* layer = msg.mutable_layer();
::google::protobuf::RepeatedPtrField& LayerParameter &::iterator it = layer-&begin();
for (; it != layer-&end(); ++it)
cout && it-&name() &&
cout && it-&type() &&
cout && it-&convolution_param().weight_filler().max() &&
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
caffemodel的解析相关信息,包括
的信息,所有caffemodel的解析相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International}

我要回帖

更多关于 caffemodel 参数提取 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信