深度学习-21天实战Caffe
- 基本知识
- ubuntu 安装 caffe
- sudo apt-get install git
- sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
- sudo apt-get install --no-install-recommends libboost-all-dev
- sudo apt-get install libatlas-base-dev
- sudo apt-get install python-dev
- sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
- 命令行参数处理的两个常用工具:getopt,gflags;
- caffe 使用 lmdb 和 leveldb 两个工具来实现数据格式的标准化,这样有助于简化模型,避免因为输入数据格式多种多样,产生适配困难;
- ubuntu 安装 caffe
- Caffe 代码梳理
- 目录结构
- include 存放头文件,src 存放源代码,tools 存放常用工具;
- 如何有效的阅读源码
- 从 src/caffe/proto/caffe.proto 开始,了解基本数据结构的内存对象和磁盘文件的一一映射关系(将文件加载到内存对象,和将内存对象保存为文件);
- 看头文件:通过头文件声明理解整个框架(可以发挥想象力去猜测具体实现)
- 有针对性的看 cpp 和 cu 文件;
- 编写各种工具,集成到 tools 中
- tools 下面本身已经有很多实用的工具,包括训练模型、测试模型、特征提取、转换数据格式等,可以根据需要修改;
- 也可以使用 python 或者 matlab 包装 Caffe 的方法,便于调节模型训练效果;
- Caffe 支持哪些深度学习特性
- 卷积层
- 大自然中一种常见的运算,一切信号的观测、采集、传输、处理都可以使用卷积过程来实现;
- 卷积层的计算为三维或四维的计算;与二维相比,在于增加了多个通道,每个通道仍然使用二维卷积的方法计算,多个通道与多个卷积核分别进行二维卷积,得到多通道的输出,之后再“合并”为一个通道;
- 卷积计算时没有“翻转”,而是做滑动窗口计算;
- 全连接层
- 每个节点与相邻的所有节点都有连接关系,所以叫“全连接层”;
- CNN 网络中,前几层卷积层参数量占比小,但计算量大;后几层全连接层参数占比大,但计算量小;因此,在做计算速度优化时,重点放在卷积层;而在做参数优化、权值剪裁时,重点放在全连接层;
- 激活函数
- 激活函数是一个非线性处理单元;用来将前面一层的输入,压缩到特定的值域;
- 当深度神经网络配备上激活函数后,理论就可以逼近任意函数;
- 常用的激活函数有 Sigmoid、tanh、ReLU 等三类,其中前两个是饱和激活函数,最后一个是非饱和激活函数;
- 卷积层
- 目录结构
- Caffe 数据结构
- Blob
- Blob 基本用法
- Blob 是个四维数组,用来存储各种数据,例如图像、权值等;维度从低到高分别为 width, height, channels, num;
- 在进行网络计算时,每层的输入和输出都需要通过 Blob 对象进行缓冲;它是 Caffe 的基本存储单元;
- Blob 可以通过下标,其访问方式跟数组下标的访问方式一致;
- 据说 Blob 可以实现 CPU 和 GPU 的数组同步,好奇是如何实现的呢?
- 猜测:如果仅仅是数组,正常应该是通过 CUDA 实现数据的拷贝吧;
- blob 的方法
- count(),获取元素个数;
- mutable_cpu_data(),获取源值数组在 CPU 主存中的指针;
- mutable_gpu_data(),获取源值数组在 GPU 显存中的指针;
- mutable_cpu_diff(),获取差值数组在 CPU 主存中的指针;
- mutable_gpu_diff(),获取差值数组在 GPU 显存中的指针;
- Update(),将 mutable_cpu_data 与 mutable_cpu_diff 两个数组整合,实现 data = data - diff 的操作;
- data_at(),获取指定下标位置的值;
- asum_data() ,用来实现所有元素的绝对值之和(L1 范数);
- sumsq_data() ,用来实现所有元素的平方和(L2范数);
- shape_string(),获取维度(字符串格式);
- ToProto(&bp, true),将 Blob 对象序列化,第二个参数表示是否携带 diff 数组(默认不带)
- BlobProto bp;
- a.ToProto(&bp, true);
- WriteProtoToBinaryFile(bp, “a.blob”);
- FromProto(bp2, true),从序列化对象中初始化 Blob 对象,第二个参数表示是否连同形状
- BlobProto bp2;
- ReadProtoFromBinaryFileOrDie(“a.blob”, &bp2);
- Blob
b; - b.FromProto(bp2, true);
- 数据结构描述
- BlobShape 和 BlobProto 本质上是两个结构体,不过用对象进行了封装,这样可以隐藏复杂性,简化调用过程,减少出错概率;
- Blob 实现
- Blob 类的详细源代码,各种方法的具体实现过程;
- Blob 基本用法
- Layer
- 基本原理
- 一般由四部分组成,它们都是使用 Blob 存储;
- 必有:一个输入 Blob,一个输出 Blob;
- 可选:权值(Weight) Blob ,偏置项(Bias) Blob;
- 两个运算方向
- 前向传播(Forward):对输入 Blob 进行处理,得到输出 Blob(如果有权值和偏置项,则它们会参与输出计算);
- 反向传播(backward):对输出 Blob 的 diff 进行处理,得到输入 Blob 的 diff(如果有权值和偏置,则也可能会参与计算);
- 一般由四部分组成,它们都是使用 Blob 存储;
- 数据结构描述
- Layer 实现
- 基本原理
- Net
- Net 基本用法
- 对应的描述文件为 *.prototxt;
- 一般既包含 Layer 对象,也包含 Blob 对象;
- 数据结构描述:
- Net 实现
- 两种类型的 Blob,一种是 param 开头的权值 Blob(归属模型),一种是以 blob 开头的输入和输出 Blob(归属数据)
- 整个深度学习的过程,就是不断从输入和输出数据 Blob 提取知识,存储到权值 Blob 模型中,用于后来的计算;
- Net 基本用法
- 机制和策略
- 机制提供了使用的可能性;策略则提到了具体的使用方法;
- 机制和策略是相对的概述,当前的策略也可以是上一层更大抽象规则下的机制;
- Blob
- Caffe I/O 模块
- 数据读取层:dataLayer 是 Layer 派生类,可以读取 LMDB、LEVELDB,还可以直接从原始图像读取(ImageDataLayer);
- 数据结构描述
- 数据读取层实现
- 数据变换器
- 提供了对原始输入图像的预处理方法,包括随机切块、随机镜像、幅度缩放、去均值、灰度/色度变换等;
- 数据结构描述
- 数据变换器的实现
- 数据读取层:dataLayer 是 Layer 派生类,可以读取 LMDB、LEVELDB,还可以直接从原始图像读取(ImageDataLayer);
- Caffe 模型
- prototxt 表示
- 内存中的表示
- 磁盘上的表示
- Caffe Model Zoo
- 模型分享平台;各地研究人员分享模型和参数的平台,通过共享结果,节省人力物力,提高研究效率;
- Caffe 前向传播计算
- Caffe 反向传播计算
- Caffe 最优化求解过程
- Caffe 实用工具
- 训练和预测
- 特征提取
- 转换图像格式
- 计算图像均值
- 自己编写工具
- 源码阅读
- image_data_layer.cpp
- Image_data_layer 层的实现,实际上也是使用 opencv 来对图像进行变换;
- ReadImageToCVMat 函数,可以将图片读入的同时,进行尺寸设置;
- image_data_layer 继承自 BasePrefetchingDataLayer
- BasePrefetchingDataLayer 则双重继承自 BaseDataLayer 和 InternalThread
- BaseDataLayer 继承自 Layer;
- image_data_layer 构造函数以 LayerParameter 为参数;有 DataLayerSetUp 方法进行数据成员设置;
- image_data_layer.cpp
- 其他事项
- 待学习如何使用这两个工具;
- caffe train 使用训练数据集(图片+标签),对模型进行训练,最后得到的结果为权值文件
- caffe test :用 train 的结果(即权值文件),对测试数据集进行测试,检查训练的结果是否达到预期;
- 专业名词
- antialias 抗锯齿
- high endian 大端法,low endian 小端法,intel 的处理器使用小端法
- 问题集
- 标签数据集是用来存储什么数据?
- 如何使用训练好的模型,检测自己的图片?
- 如何将自己的图片,转换成 Caffe 可以识别的格式?
- 据说要转换成 LMDB 格式才能够被 caffe 识别;
- 如何使用 LMDB 工具转换图片的格式?
- 估计可以在 caffe 目录下的 tools 常用工具文件夹中找找看;
- 待学习如何使用这两个工具;
深度学习-21天实战Caffe
https://ccw1078.github.io/2019/04/04/深度学习-21天实战Caffe/