体育资讯网

您现在的位置是:首页 > 足球教学 > 正文

足球教学

caffe源码带注释分析(caffe 源码)

hacker2022-07-10 02:03:26足球教学96
本文目录一览:1、深度学习caffe的代码怎么读2、

本文目录一览:

深度学习caffe的代码怎么读

1.学习程序的第一步,先让程序跑起来,看看结果,这样就会有直观的感受。

Caffe的官网上Caffe | Deep Learning Framework 提供了很多的examples,你可以很容易地开始训练一些已有的经典模型,如LeNet。我建议先从 LeNet MNIST Tutorial开始,因为数据集很小,网络也很小但很经典,用很少的时间就可以跑起来了。当你看到terminal刷拉拉的一行行输出,看到不断减少的loss和不断上升的accuracy,训练结束你得到了99+%的准确率,感觉好厉害的样子。你可以多跑跑几个例子,熟悉一下环境和接口。

2.单步调试,跟着Caffe在网络里流动

当玩了几天之后,你对Caffe的接口有点熟悉了,对已有的例子也玩腻了,你开始想看看具体是怎么实现的了。我觉得最好的方法是通过单步调试的方式跟着程序一步一步的在网络里前向传播,然后再被当成误差信息传回来。

Caffe就像一个你平常编程中Project,你可以使用IDE或者GDB去调试它,这里我们不细说调试的过程。你可以先跟踪前向传播的过程,无非就是从高层次到低层次的调用Forward函数, Solver-Net-Layer-Specific Layer (Convolution等...).后向传播也类似,但因为你对Caffe里面的各种变量运算不熟悉,当你跟踪完前向传播时可能已经头晕眼花了,还是休息一下,消化一下整个前向传播的流程。

刚刚开始你没有必要对每个Layer的计算细节都那么较真,大概知道程序的运算流程就好,这样你才可以比较快的对Caffe有个大体的把握。

3.个性化定制Caffe

到这里,你已经可以说自己有用过Caffe了,但是还不能算入门,因为你还不知道怎么修改源码,满足自己特定的需求。我们很多时候都需要自己定义新的层来完成特定的运算,这时你需要在Caffe里添加新的层。

你一开肯定无从下手,脑子一片空白。幸运的是Caffe github上的Wiki Development · BVLC/caffe Wiki · GitHub已经有了教程了,而且这是最接近latest Caffe的源码结构的教程,你在网上搜到的Blog很多是有点过时的,因为Caffe最近又重构了代码。你可以跟着它的指导去添加自己的层。

虽然你已经知道要在哪里添加自己的东西了,但你遇到最核心的问题是如何写下面这四个函数。

forward_cpu()

forward_gpu()

backward_cpu()

backward_gpu()

你可以先模仿已有的层去实现这四个函数,而且我相信forward函数很快就可以写出来了,但backward的还是一头雾水。这时我们就要补补神经网络里最核心的内容了——Backpropagation.

4.理解并实现Backpropagation

这个我觉得是与平台无关的,不管你是使用Caffe、Torch 7,还是Theano,你都需要深刻理解并掌握的。因为我比较笨,花了好长时间才能够适应推导中的各种符号。其实也不难,就是误差顺着Chain rule法则流回到前面的层。我不打算自己推导后向传播的过程,因为我知道我没有办法将它表达得很好,而且网上已经有很多非常好的教程了。下面是我觉得比较好的学习步骤吧。

从浅层的神经网络(所谓的全连接层)的后向传播开始,因为这个比较简单,而且现在我们常说的CNN和LSTM的梯度计算也最终会回归到这里。

第一个必看的是Ng深入浅出的Ufldl教程UFLDL Tutorial,还有中文版的,这对不喜欢看英语的同学是个好消息。当然你看一遍不理解,再看一遍,忘了,再看,读个几遍你才会对推导过程和数学符号熟悉。我头脑不大行,来来回回看了好多次。

当然,Ufldl的教程有点短,我还发现了一个讲得更细腻清晰的教程, Michael Nielsen写的Neural networks and deep learning。它讲得实在太好了,以至于把我的任督二脉打通了。在Ufldl的基础上读这个,你应该可以很快掌握全连接层的反向传播。

最后在拿出standford大牛karpathy的一篇博客Hacker's guide to Neural Networks,这里用了具体的编程例子手把手教你算梯度,并不是推导后向传播公式的,是关于通用梯度计算的。用心去体会一下。

这时你跃跃欲试,回去查看Caffe源码里Convolution层的实现,但发现自己好像没看懂。虽说卷积层和全连接层的推导大同小异,但思维上还是有个gap的。我建议你先去看看Caffe如何实现卷积的,Caffe作者贾扬清大牛在知乎上的回答在 Caffe 中如何计算卷积?让我茅塞顿开。重点理解im2col和col2im.

这时你知道了Convolution的前向传播,还差一点就可以弄明白后向传播怎么实现了。我建议你死磕Caffe中Convolution层的计算过程,把每一步都搞清楚,经过痛苦的过程之后你会对反向传播有了新的体会的。在这之后,你应该有能力添加自己的层了。再补充一个完整的添加新的层的教程Making a Caffe Layer • Computer Vision Enthusiast。这篇教程从头开始实现了一个Angle To Sine Cosine Layer,包含了梯度推导,前向与后向传播的CPU和GPU函数,非常棒的一个教程。

最后,建议学习一下基本的GPU Cuda编程,虽然Caffe中已经把Cuda函数封装起来了,用起来很方便,但有时还是需要使用kernel函数等Cuda接口的函数。这里有一个入门的视频教程,讲得挺不错的NVIDIA CUDA初级教程视频。

作者:Gein Chen

来源:知乎

新手试运行了一个 caffe 的 Python 代码,出现这个错误是怎么回事

一、问题

在成功编译caffe的源码之后,可以在Python环境中使用caffe。

在Ubuntu环境下,打开python解释程序,输入import caffe时:出现以下错误

import caffe

Traceback (most recent call last):

File "stdin", line 1, in module

ImportError: No module named caffe

二、解决思路

基本思路是把caffe中的python导入到解释器中

三、解决方法

第一种方法:设置环境变量

在终中输入:

export PYTHONPATH=~/caffe/python #caffe的路径下面的python

则该终端起作用,关掉终端后或重新打开一终端,则失效。

放到配置文件中,可以永久有效果,命令操作如下:

A.把环境变量路径放到 ~/.bashrc文件中

sudo echo export PYTHONPATH="~/caffe/python" ~/.bashrc

B.使环境变量生效

source ~/.bashrc

第二种方法:通过代码来实现

在每个python代码中使用以下代码: (这个方法在写python代码时有用)

caffe_root = '~/caffe/python '

import sys

sys.path.insert(0, caffe_root + 'python')

import caffe

如何修改caffe源码

首先,利用 Understanding 软件,可以方便的查看到 caffe 源码的目录结构,如下图所示。

可以注意到,在 Caffe 源码里有一个『Tools』的目录,里面有一些相当有用的工具,如『compute_image_mean.cpp』、『convert_imageset.cpp』等,其中『convert_imageset.cpp』直接操作到了文本文件,如下列代码所示。那么函数『ReadImageToDatum』将就是突破口。

1 // convert_imageset.cpp, line 129-2 for (int line_id = 0; line_id lines.size(); ++line_id) {3     if (!ReadImageToDatum(root_folder + lines[line_id].first,4         lines[line_id].second, resize_height, resize_width, is_color, datum)) {5       continue;6     }7     // ...8 }

定义在io.cpp里的函数ReadImageToDatum完成了将图片数据转换成caffe能够处理的Datum类型,主要修改的文件大都集中在数据层,将其单标签改成多标签支持。针对车辆检测,对caffe所作的修改有如下的部分:

caffe.proto

将optional改为repeated,使得标签变量label为数组,即支持多标签。否则无此属性Datum.label_size()。

data_layer.hpp

将lines_由protected修改为public,使得后续能够利用指针直接访问lines_数据,其中保存了图片名及其对应的标签信息。详见test_det_net.cpp

data_layer.cpp

修改top_label,使得其保存图片的多标签信息。

image_data_layer.cpp

从文本文件里读取图片的路径及标签信息,将原来int label修改成std::vector vec_label。同时需要特别注意的就是不要忘记申请相应的存储空间(*top)[1]-Reshape(this-...),否则在初始化网络时就会出现错误。

memory_data_layer.cpp

虽然这个在实际应用中没有用到,但因其涉及到最底层的数据层,所以也修改了。

convert_imageset.cpp

这个程序是将图片数据打包与数据库的形式,默认为leveldb

io.hpp

io.cpp

这个文件涉及到最底层的数据读写工作。

caffe源码 哪些层需要.cu文件

1.学习程序的第一步,先让程序跑起来,看看结果,这样就会有直观的感受。

Caffe的官网上Caffe | Deep Learning Framework 提供了很多的examples,你可以很容易地开始训练一些已有的经典模型,如LeNet。我建议先从

LeNet MNIST Tutorial开

始,因为数据集很小,网络也很小但很经典,用很少的时间就可以跑起来了。当你看到terminal刷拉拉的一行行输出,看到不断减少的loss和不断上升

的accuracy,训练结束你得到了99+%的准确率,感觉好厉害的样子。你可以多跑跑几个例子,熟悉一下环境和接口。

2.单步调试,跟着Caffe在网络里流动

当玩了几天之后,你对Caffe的接口有点熟悉了,对已有的例子也玩腻了,你开始想看看具体是怎么实现的了。我觉得最好的方法是通过单步调试的方式跟着程序一步一步的在网络里前向传播,然后再被当成误差信息传回来。

在VS2013中打开caffe源代码,都能编译成功,下一步应该怎么训练模型

你想调用你的模型,最简单的办法是看examples/cpp_classification里面的cpp文件,那是教你如何调用caffe获取分类结果的...(你没接触过caffe的话,建议你直接按照这个文件来操作可能会比较简单,下面我的代码我也不知道没接触过caffe的人看起来难度会有多大)

不过那个代码我看着不太习惯,所以之前自己稍微写了一个简易的版本,不知道怎么上传附件,懒人一个就直接把代码贴在最后了。

先简单解释一下如何使用,把这个代码复制到一个头文件中,然后放在examples里面一个自己创建的文件夹里面,然后写一个main函数调用这个类就可以了,比如:

复制,保存到caffe/examples/myproject/net_operator.hpp,然后同目录下写一个main.cpp,在main函数里面#include "net_operator.hpp",就可以使用这个类了:

const string net_prototxt = "..."; // 你的网络的prototxt文件,用绝对路径,下面同理

const string pre_trained_file = "..."; // 你训练好的.caffemodel文件

const string img_path = "..."; // 你要测试的图片路径

// 创建NetOperator对象

NetOperator net_operator(net_prototxt, pre_trained_file);

Blobfloat *blob = net_operator.processImage(img_path);

// blob就得到了最后一层的输出结果,至于blob里面是怎么存放数据的,你需要去看看官网对它的定义

写完main.cpp之后,到caffe目录下,make,然后它会编译你写的文件,对应生成的可执行文件。比如按我上面写的那样,make之后就会在caffe/build/examples/myproject文件夹里面生成一个main.bin,执行这个文件就可以了。因为生成的可执行文件并不是直接在代码目录下,所以前面我建议你写的路径用绝对路径

另外如果你要获取的不是最后一层的输出,你需要修改一下processImage函数的返回值,通过NetOperator的成员变量net_来获取你需要的blob,比如有个blob名称为"label",你想获取这个blob,可以通过net_-blob_by_name("label")来获取,当然获取到的是shared_ptrBlobfloat 类型的,搜一下boost shared_ptr就知道跟普通指针有什么不同了

如何看懂caffe代码

问我意利咖啡馆哪我肯定说caffe grecocaffe greco ~家张于1760咖啡馆仍保持着百变装潢侍者既往身着高雅黑色礼服佩戴领结都丝苟甚至都像随性意利作风看簇新咖啡机甚至怀疑自穿越侯2百前罗马~咖啡未必意利我却减少我嗜咖啡追寻殿堂级师脚步拜伦、歌德、王尔德、瓦格纳、李斯特名字都闪耀着艺术光辉《罗马假》安妮公主记者家店享受咖啡与香槟~咖啡味道已重要品尝已仅仅咖啡更积淀百历史与风情意利充满着文与艺术即使破旧却永远掩饰其光华古现代共存美丽永远名字

发表评论

评论列表

  • 泪灼心児(2022-07-10 07:50:58)回复取消回复

    贾扬清大牛在知乎上的回答在 Caffe 中如何计算卷积?让我茅塞顿开。重点理解im2col和col2im.这时你知道了Convolution的前向传播,还差一点就可以弄明白后向传播怎么实现了。我建议你死磕Caffe中Convolut

  • 假欢蓝殇(2022-07-10 02:52:12)回复取消回复

    的形式,默认为leveldbio.hppio.cpp这个文件涉及到最底层的数据读写工作。caffe源码 哪些层需要.cu文件1.学习程序的第一步,先让程序跑起来,看看结果,这样就会有直观的感受。Caffe的官

  • 晴枙桃靥(2022-07-10 08:58:56)回复取消回复

    pre_trained_file = "..."; // 你训练好的.caffemodel文件const string img_path = "..."; // 你要测试的图片路径// 创建NetOperator对象

  • 假欢掩吻(2022-07-10 08:45:38)回复取消回复

    你可以使用IDE或者GDB去调试它,这里我们不细说调试的过程。你可以先跟踪前向传播的过程,无非就是从高层次到低层次的调用Forward函数, Solver-Net-Layer