ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Caffe 深度学习框架全解析:表达性架构、核心抽象与安装训练实战

Caffe 深度学习框架全解析:表达性架构、核心抽象与安装训练实战 Caffe 深度学习框架全解析表达性架构、核心抽象与安装训练实战【免费下载链接】caffeCaffe: a fast open framework for deep learning.项目地址: https://gitcode.com/gh_mirrors/ca/caffeCaffeConvolutional Architecture for Fast Feature Embedding是一个以**表达性Expression、速度Speed与模块化Modularity**为核心设计理念的深度学习框架由加州大学伯克利分校的 Berkeley AI ResearchBAIR/ Berkeley Vision and Learning CenterBVLC及社区贡献者共同开发。本指南以仓库根目录 README.md 为主线结合源码与官方文档系统讲解 Caffe 的定位与设计哲学、Blob/Layer/Net/Solver 四大核心抽象、Make 与 CMake 两套构建安装流程、caffe命令行工具的全套用法以及基于 Solver 配置文件的 MNIST 训练实战帮助读者完整掌握从编译安装到跑通第一个模型的全部关键路径。Caffe 是什么为一个目标而生的深度学习框架按照 README.md 与 docs/index.md 的官方表述Caffe 是一个为表达、速度与模块化而设计的深度学习框架表达性Expressive architecture模型与优化过程通过配置prototxt 协议缓冲文本定义而非硬编码鼓励应用创新可扩展代码Extensible code活跃的社区开发持续推动框架与模型跟踪前沿速度Speed官方文档记载使用单块 NVIDIA K40 GPU、搭配 ILSVRC2012 冠军 SuperVision 模型与预取 IOCaffe 可每天处理超过 6000 万张图像即推理约 1 ms/图像、学习约 4 ms/图像数据来自 docs/index.md社区CommunityCaffe 驱动了大量学术研究项目、初创公司原型乃至视觉、语音、多媒体领域的大规模工业应用。值得强调的一点是 Caffe 的配置驱动理念——模型的网络结构、优化器参数、学习率策略全部以 protobuf 文本.prototxt描述训练与推理过程无须重新编译且通过设置一个开关即可在 CPU 与 GPU 之间切换训练在 GPU 机器上进行、部署到通用集群或移动设备成为可能。这一设计在源码中有着直接的体现src/caffe/proto/caffe.proto中定义了NetParameter、SolverParameter、LayerParameter等完整 schema而Net、Solver的构造函数直接接受这些参数对象见 include/caffe/net.hpp 与 include/caffe/solver.hpp。四大核心抽象Blob、Layer、Net 与 Solver理解 Caffe 的源码结构可以从四个相互协作的核心抽象入手。官方教程 docs/tutorial/net_layer_blob.md 对此有专门阐述这里结合头文件进行印证。Blob统一的数据与梯度容器Blob是 Caffe 中 Layer、Net、Solver 交互的基本计算单元见 include/caffe/blob.hpp 的类注释。它是对SyncedMemory的封装同时持有数据data_与梯度diff_两部分形状管理支持任意维度的Reshape、负索引CanonicalAxisIndex、count()计算元素总数并保留num/channels/height/width等传统 4D 访问器新代码推荐使用shape(0)~shape(3)CPU/GPU 同步cpu_data()、gpu_data()及对应的mutable_*接口负责在 CPU 与 GPU 之间按需同步数据这正是单标志切换 CPU/GPU的底层支撑之一共享内存ShareData/ShareDiff让多个 Blob 共享同一块内存用于权重共享等场景序列化FromProto/ToProto支持与 protobuf 之间互相转换模型保存caffemodel与加载即依赖此机制。kMaxBlobAxes 32定义了 Blob 支持的最大轴数BlobShape使用repeated int64 dim描述维度见 src/caffe/proto/caffe.proto。Layer计算单元的最小封装Layer是网络的基本计算单元接口约定位于 include/caffe/layer.hpp。其设计要点包括生命周期方法SetUp()不可覆写依次调用CheckBlobCounts→LayerSetUp一次性初始化读取层参数→Reshape根据 bottom 形状调整 top 与内部缓冲→SetLossWeights前向与反向Forward(bottom, top)与Backward(top, bottom_need_backward, bottom)是每个层必须实现或选择性实现的核心接口实际运算分发到Forward_cpu/Forward_gpu与Backward_cpu/Backward_gpu类型体系仓库中内置了 60 种层实现覆盖卷积、池化、激活、损失、数据加载等源码位于 src/caffe/layers/头文件位于 include/caffe/layers/例如conv_layer.cpp/.cu、pooling_layer.cpp/.cu、relu_layer.cpp/.cu、softmax_loss_layer.cpp等每个层通常同时提供 CPU.cpp与 GPU.cu两种实现cuDNN 加速层部分层另有cudnn_*变体如cudnn_conv_layer、cudnn_pooling_layer编译期通过USE_CUDNN开关启用后自动替换为 NVIDIA cuDNN 加速实现。Net把 Layer 连成有向无环图Net将各Layer连接成由NetParameter指定的有向无环图DAG见 include/caffe/net.hpp 的类注释。核心能力包括按拓扑序执行Forward/Backward并提供ForwardFromTo、BackwardFromTo等分段计算接口以及ForwardBackward()一步完成前向反向的组合操作include/caffe/net.hppCopyTrainedLayersFrom系列接口用于加载预训练权重、支持迁移学习finetune其源码在 src/caffe/net.cppToProto/ToHDF5用于导出网络ShareTrainedLayersWith用于零拷贝共享已训练层。Solver驱动优化过程的引擎Solver是执行参数优化的接口见 include/caffe/solver.hpp负责在 Net 上迭代执行ApplyUpdate。仓库 src/caffe/solvers/ 内置了多种优化器实现SGD含动量与 Nesterov见sgd_solver.cpp/.cu、nesterov_solver.cpp/.cuAdaGradadagrad_solver.cpp/.cuRMSProprmsprop_solver.cpp/.cuAdaDeltaadadelta_solver.cpp/.cuAdamadam_solver.cpp/.cuSolver 还负责测试TestAll/Test、快照Snapshot、断点恢复Restore与学习率调度并支持通过ActionCallback响应 SIGINT/SIGHUP 信号以执行停止训练或保存快照等操作对应 tools/caffe.cpp 中的--sigint_effect、--sighup_effect参数。安装与构建依赖、Make 与 CMake 全流程完整安装指南见 docs/installation.md官方在 Ubuntu 16.04–12.04、OS X 10.11–10.8 及 Docker、AWS 等平台上验证过构建流程。官方 Makefile 构建与社区维护的 CMake 构建互补。依赖清单必需依赖依赖版本要求说明CUDA76.* 可用5.5/5.0 视为 legacyGPU 模式必需提供nvcc编译器与驱动BLASATLAS / MKL / OpenBLAS 任选矩阵与向量运算后端ATLAS 为默认Boost 1.55通用 C 库protobuf / glog / gflags / hdf5—序列化与日志、命令行解析、数据存储可选依赖OpenCV 2.4含 3.0图像数据层如ImageData层需要IO 库lmdb、leveldbleveldb 需要snappycuDNNv7GPU 加速Python 接口Python 2.7 或 3.3、numpy 1.7、boost 提供的boost.pythonMATLAB 接口带mex编译器的 MATLAB。关键构建开关cuDNN 与 CPU-onlyMakefile.config.example构建模板见 Makefile.config.example中有两个最常用的开关# cuDNN acceleration switch (uncomment to build with cuDNN). # USE_CUDNN : 1 # CPU-only switch (uncomment to build without GPU support). # CPU_ONLY : 1cuDNN Caffe安装 cuDNN 后在Makefile.config中取消USE_CUDNN : 1注释即可加速自动生效。官方文档特别指出cuDNN 有时并不比 Caffe 自带的 GPU 加速更快见 docs/installation.mdCPU-only Caffe取消CPU_ONLY : 1注释即可在无 CUDA 环境下构建适合云或集群部署。其他常用配置项还包括USE_OPENCV、USE_LEVELDB、USE_LMDB、USE_HDF5禁用 IO 依赖及其对应数据层、OPENCV_VERSION : 3、BLAS : atlas/mkl/open对应三种 BLAS 后端、CUDA_DIR与CUDA_ARCHGPU 架构代码生成模板默认覆盖 compute_20 至 compute_61、PYTHON_INCLUDE/PYTHON_LIBPython 接口头文件与库路径Anaconda 用户需按注释调整、WITH_PYTHON_LAYER支持以 Python 编写层、USE_NCCL多 GPU 数据并行加速对应 src/caffe/util/nccl.hpp等。BLAS 后端选择Caffe 依赖 BLAS 作为矩阵/向量计算后端三种选择各有适用场景见 docs/installation.mdATLAS免费开源Caffe 的默认选择Intel MKL商业软件但提供免费许可针对 Intel CPU 优化。安装后执行source /opt/intel/mkl/bin/mklvars.sh intel64设置环境并在配置中置BLAS : mklOpenBLAS免费开源优化且支持并行安装可能更费功夫但可能带来加速配置中置BLAS : open。方式一Make 构建官方支持cp Makefile.config.example Makefile.config # 按需调整 Makefile.config例如使用 Anaconda Python 或启用 cuDNN make all make test make runtest默认配置即可支持 CPU 与 GPU 双模式cuDNN 与 CPU-only 场景按上文开关调整编译 Python/MATLAB 包装make pycaffe与make matcaffe需先在配置中设置 MATLAB 与 Python 路径分发make distribute生成包含全部头文件、编译库与二进制的distribute目录便于部署到其他机器加速构建make all -j88 为并行编译线程数建议等于机器核心数更新 Caffe 时先执行make clean再重新编译。方式二CMake 构建社区支持需要 CMake 2.8.7mkdir build cd build cmake .. make all make install make runtestCMake 体系的模块化依赖探测脚本位于 cmake/Modules/如FindAtlas.cmake、FindMKL.cmake、FindOpenBLAS.cmake、FindLMDB.cmake、FindNCCL.cmake等便于自动定位各类依赖。硬件要求与注意事项BAIR 在 Titan X、K80、GTX 980、K40、K20、Titan、GTX 770 等显卡上运行过 ImageNet/ILSVRC 规模模型内部测试中 CUDA capability 3.0 的设备均无问题CUDA compute capability 2.0 的设备可能因硬件限制需要降低 CUDA 线程数与批大小官方建议 compute capability 3.0历史问题多为 GPU 配置、过热等环境因素而非框架本身。Python 与 MATLAB 接口PythonPycaffe依赖核心为numpy与boost.pythonpandas对部分示例也有用。可执行pip install -r requirements.txt安装官方更建议先安装 Anaconda 发行版自带大部分包及hdf5。构建完成后将模块目录加入$PYTHONPATHexport PYTHONPATH/path/to/caffe/python:$PYTHONPATH官方明确警告不要在caffe/python/caffe目录内 import 该模块。Python 3.3 开箱即用protobuf 支持需自行安装 protobuf 3.0 alpha。Python 接口的核心实现见 python/caffe/_caffe.cpp 与 python/caffe/init.py并内置了classifier.py、detector.py、net_spec.py等高阶工具。MATLABMatcaffe安装 MATLAB 并确保其mex位于$PATH。官方验证过的版本包括 2015a、2014a/b、2013a/b 与 2012b。接口实现位于 matlab/caffe/如Net.m、Solver.m、Blob.m、Layer.m。caffe命令行工具四个内建动作详解编译完成后所有上层操作都经由命令行入口caffe完成其实现见 tools/caffe.cpp入口main通过注册表分发四个动作tools/caffe.cppusage: caffe command args commands: train train or finetune a model test score a model device_query show GPU diagnostic information time benchmark model execution timetrain训练或微调模型caffe train --solverexamples/mnist/lenet_solver.prototxttrain动作tools/caffe.cpp的完整参数如下均通过 gflags 定义参数默认值说明--solver空求解器定义 protobuf 文本文件训练必需--gpu空GPU 模式逗号分隔设备 ID-gpu all使用全部可用 GPU有效批大小乘以设备数--snapshot空从快照恢复训练与--weights互斥--weights空预训练权重用于 finetune 初始化可逗号分隔多个文件与--snapshot互斥--level/--stage0 / 空网络级别与阶段配合 NetStateRule 控制层包含/排除--sigint_effectstop收到 SIGINT 时的动作snapshot / stop / none--sighup_effectsnapshot收到 SIGHUP 时的动作snapshot / stop / none训练结束时若snapshot_after_train默认 true开启会自动保存最终快照。test评测模型caffe test --modelexamples/mnist/lenet_train_test.prototxt \ --weightsexamples/mnist/lenet_iter_10000.caffemodel \ --iterations100test动作tools/caffe.cpp要求同时提供模型定义与权重按--iterations指定的次数默认 50执行前向输出每个输出 blob 的得分及损失。device_queryGPU 诊断caffe device_query --gpu 0输出指定 GPU 的设备属性信息名称、计算能力、显存等用于排查 GPU 环境问题。time性能基准caffe time --modelexamples/mnist/lenet_train_test.prototxt --iterations100time动作tools/caffe.cpp先做一次完整前向/反向以完成内存分配再逐层统计每个层的平均前向与反向耗时输出每层耗时、平均 Forward/Backward 时间与总耗时是定位网络瓶颈的实用工具。注意默认按 TRAIN phase 计时可用--phase指定 TRAIN/TEST。训练实战以 MNIST LeNet 为例的 Solver 配置官方 MNIST 教程见 examples/mnist/readme.md是入门经典案例。数据准备与训练脚本为# 准备数据见 examples/mnist/create_mnist.sh 与 convert_mnist_data.cpp ./examples/mnist/create_mnist.sh # 开始训练 ./examples/mnist/train_lenet.sh训练入口caffe train所需的 Solver 配置 examples/mnist/lenet_solver.prototxt 如下注释已按官方说明补齐# The train/test net protocol buffer definition net: examples/mnist/lenet_train_test.prototxt # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. test_iter: 100 # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr_policy: inv gamma: 0.0001 power: 0.75 # Display every 100 iterations display: 100 # The maximum number of iterations max_iter: 10000 # snapshot intermediate results snapshot: 5000 snapshot_prefix: examples/mnist/lenet # solver mode: CPU or GPU solver_mode: GPU各字段与底层实现一一对应完整 schema 见 src/caffe/proto/caffe.proto 的SolverParameter消息网络指定net指向网络结构文件也可用train_net/test_net/net_param等字段多条测试网络按字段顺序求值测试控制test_iter每个测试网络的前向次数、test_interval每多少训练迭代测试一次、test_compute_loss、test_initialization默认 true首轮迭代前先跑一次测试以确认内存并打印初始损失优化超参base_lr、momentum、weight_decay、regularization_type默认 L2可选 L1、clip_gradients默认 -1不裁剪 0 时按 L2 范数裁剪梯度、iter_size默认 1梯度按iter_size × batch_size累积学习率策略lr_policyproto 中明确注释了七种策略的公式fixed恒为base_lrstepbase_lr * gamma ^ (floor(iter / step))expbase_lr * gamma ^ iterinvbase_lr * (1 gamma * iter) ^ (-power)LeNet 示例即采用此策略multistep类似 step但由stepvalue列表指定不均匀步长polybase_lr * (1 - iter/max_iter) ^ power到max_iter时降为 0sigmoidbase_lr / (1 exp(-gamma * (iter - stepsize)))快照snapshot间隔、snapshot_prefix前缀、snapshot_format默认 BINARYPROTO可切 HDF5、snapshot_diff默认 false开启会显著增大文件体积求解器类型type默认 SGD可选 Nesterov/AdaGrad/RMSProp/AdaDelta/Adam各优化器额外参数包括 Adam 的momentum2默认 0.999、RMSProp 的rms_decay默认 0.99以及共同的数值稳定项delta默认 1e-8运行模式solver_mode默认 GPU与device_id默认 0若命令行未给--gpu程序会回退读取 solver prototxt 中的这两个字段见 tools/caffe.cpp可复现性random_seed默认 -1表示按系统时钟初始化设为非负整数可复现实验结果微调weights字段可直接在配置中指定预训练权重等价于命令行--weights命令行优先级更高。网络结构定义见 examples/mnist/lenet_train_test.prototxt其中通过include { phase: TRAIN }与include { phase: TEST }规则区分训练/测试阶段的层对应 proto 中NetStateRule的 phase/level/stage 机制见 src/caffe/proto/caffe.proto这也是配置文件决定一切设计理念的典型体现。仓库还提供了更丰富的示例供进阶参考ImageNet 训练examples/imagenet/、CIFAR-10examples/cifar10/、Siamese 网络examples/siamese/、微调与目标检测examples/finetune_flickr_style/、examples/finetune_pascal_detection/等Python notebook 示例见 examples/ 下的.ipynb文件。多 GPU 与分布式分支多 GPU 训练通过--gpu传入多个设备 ID 启用底层依赖 NCCL见 include/caffe/util/nccl.hpp 与USE_NCCL构建开关若未以USE_NCCL编译多 GPU 会直接报错提示重新构建tools/caffe.cpp。README 同时列出了三个官方维护的自定义发行分支Intel Caffe面向 CPU尤其 Intel Xeon与多节点优化的分支OpenCL Caffe支持 AMD、Intel 等设备的 OpenCL 分支Windows CaffeWindows 平台分支。此外docker/README.md 提供了开箱即用的 Docker 镜像CPU 与 GPU 两个变体对应官方安装文档中的 Docker 安装方式。社区、许可证与引用社区问题与讨论可在 caffe-users 邮件组与 Gitter 聊天室进行框架开发讨论与详细 bug 报告收集在 Issues 中见 README.md许可证Caffe 以 BSD 2-Clause 许可证发布见 LICENSEBAIR/BVLC 参考模型允许不受限制地使用引用若 Caffe 对你的研究有帮助请按 README.md 中的 BibTeX 条目引用article{jia2014caffe, Author {Jia, Yangqing and Shelhamer, Evan and Donahue, Jeff and Karayev, Sergey and Long, Jonathan and Girshick, Ross and Guadarrama, Sergio and Darrell, Trevor}, Journal {arXiv preprint arXiv:1408.5093}, Title {Caffe: Convolutional Architecture for Fast Feature Embedding}, Year {2014} }小结Caffe 之所以在深度学习框架发展史上占据重要位置在于它将表达、速度、模块化落实到了每一个设计决策以 protobuf 配置描述模型与优化、以 Blob 统一数据与梯度、以 Layer/Net/Solver 三层抽象分离计算单元、网络组织与优化过程并提供 Make/CMake 双构建体系与train/test/device_query/time四个开箱即用的命令行动作。从 Makefile.config.example 的构建配置到 examples/mnist/lenet_solver.prototxt 的训练参数再到 tools/caffe.cpp 的命令分发与 src/caffe/proto/caffe.proto 的完整 schema读者可以在仓库中逐层深入完整还原这套框架的设计全貌。【免费下载链接】caffeCaffe: a fast open framework for deep learning.项目地址: https://gitcode.com/gh_mirrors/ca/caffe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表