这是本人第一次写博客,所以先啰嗦一下关于自己为什么开始写博客的想法。当我遇到问题的时候,和大家一样,经常谷歌或百度,这时就会看到很多人在博客上分享他们的工作经验,而这些经验经常帮助我解决问题,所以每次都对这些人心存感激。之前也想过要把自己的东西写到博客上和大家分享,遗憾的是每次都闲麻烦、浪费时间,感觉没什么必要。直到最近决定深入学习caffe,经常会看一些关于caffe源码学习的博客,比如:http://www.cnblogs.com/louyihang-loves-baiyan/,但这样的学习过程不是看看就能掌握的,即使这些博客写的很好。所以参考大家分享的经验的同时,也来总结自己的学习过程,并与大家分享,既是为了更好的学习,也为了和大家交流,同时希望得到批评指正。
首先还是说明一下自己已经了解的一些东西。第一,深度学习的基础知识,比如神经网络,BP算法等;第二,对caffe的简单了解和使用,主要参考caffe官网;第三,之前一直用torch,至于为什么还要学习caffe,主要是因为自己看的很多文章都是基于caffe实现的,为了更好的学习别人的方法,不可能每次都用torch重新实现,于是决定深入学习caffe,同时来提高coding的能力。
读caffe代码时,用的是Qt Creator,如果有更好的工具,期待分享哦。
使用caffe时,会发现,我们要定义一个网络或设置优化参数时,只需要写一个ptototxt文本文件就好了。原来Protocol Buffer就是来做这件事情的。首先通过官方C++基本教程学习,但是这里存储/解析的时二进制格式,像我们用的易读的文本格式会有些不同。先给出参照官方C++基本教程和caffe源码(io.cpp)写的一个解析文本文件的例子(read.cpp, write.cpp, addressbook.proto, 和储存/解析文本address.txt)。
address.proto
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
write.cpp(某些头文件可能是不必要的)
// See README.txt for information and build instructions.
#include <iostream>
#include <fstream>
#include <string>
#include <fcntl.h>
#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/text_format.h>
#inc