深度学习| 深度学习框架介绍与应用
- 图像的一般问题Caffe很方便,是目前产品化最多的库;
- 多关注TensorFlow,社区发达资源多;
- 可以关注Facebook的Pytorch + caffe2,研究+产品应用组合;
- MxNet对显存利用率很高,而且Amazon也大力支持;
Caffe
- 来源于Berkeley的开源框架
- 高效、一般的训练无需手写大量代码
- 有python和mathlab的接口
- 对于卷积神经网络的训练和fine-tuning非常方便
Speed with krizhevsky's 2012 model:
- K40/Titan: 2ms / image, K20: 2.6ms
- Caffe + cuDNN: 1.17ms / image on K40
- 60 million images / day
- 8-core CPU: ~20 ms/image
1. caffe安装
Ubuntu 14.04+的请参考教程
https://www.zybuluo.com/hanxiaoyang/note/364737
CentOS7.0的请参考教程
https://www.zybuluo.com/hanxiaoyang/note/364680
Mac的可以参考
https://www.zybuluo.com/hanxiaoyang/note/370344
2. caffe的使用方法
这种训练方式不用写代码
①Resize图片,转换存储格式(LMDB/ LevelDB)(二进制的存储读写效率是非常高的)
②定义网络结构(编辑prototxt)
③定义solver(编辑另一个prototxt)
④一行命令开始训练(可以基于已有的权重赋值)

第一步:转化格式
- DataLayer reading from LMDB is the easiest
- Create LMDB using convert imageset
- Need text file where each line is (“[path /to image.jpeg] [label]”)
- Create HDF5 file yourself using h5py
第二步:定义层次结构




1/255=0.00390625








第三步:定义solver
定义和训练相关的信息

第四步:训练


模型库首选model zoo

关于fine-tuning
如果层次不变,只需修改输入输出

如果层次改变,添加/ 删减层次

fine-tuning技巧/ 注意点
优先学习权放在新加层
- 每一层都有控制学习率的参数:blobs_lr ;
- 一般会把前面层学习率调低,最后新加层调高;
- 你甚至可以freeze前面的层次不动;
- 一般fine-tuning的前期loss下降非常快,中间有个瓶颈期,要有耐心;
在solver处调整学习率
- 调低solver处的学习率(1/10,1/100);
- 记住存储一下中间结果,以免出现意外;
3. Pycaffe
Import caffe加载库
- caffe.net 是加载/ 运行/ 训练模型的主类(接口)
- caffe.Classifier和caffe.Detector是针对识别/ 检测的接口
- caffe.SGDSolver最优化
- caffe.io负责输入输出和预处理
- caffe.draw可以画出网络结构图
加载所需库
- import numpy as np
- import matplotlib.pyplot as plt
- from PIL import Image
- import caffe
选择GPU或者CPU
- #使用cpu
- caffe.set_mode_cpu()
- #使用gpu
- caffe.set_device(0)
- caffe.set_mode_gpu()
4. Pycaffe训练
定义网络结构

载入solver

Solver训练

5. Pycaffe 用CNN抽取特征
做完前向运算取出某层输出

更详细的流程可以参考:https://github.com/HanXiaoyang/image_retrieval/blob/master/compute_fea_for_image_retrieval.py
Pycaffe 图像识别

你在conv.prototxt中定义好了卷积层如左下

TensorFlow
Computation graph VS layer based
计算模型
- 首先构造好整个计算链路;
- 可以对链路进行优化;
- 分布式调度;

基于层模型
- 每个层的计算,固定实现forward/ backward ;
- 必须手动指定目标GPU卡;
TensorFlow的一些概念
在TensorFlow里:
- 使用张量(tensor)表示数据;
- 使用图(graph)来表示计算任务;
- 在被称之为会话(Session)的上下文(context)中执行图;
- 通过变量(Variable)维护状态;
- 使用feed和fetch可以为任意的操作(arbitrary operation)赋值或者从其中获取数据;
关于张量(tensor)
张量可以用多维数组来表示
Numpy VS Tensorflow

Tensorflow需要显示地输出tensor(借助eval())

Tensorflow的“计算图”
Tensorflow一般可分为2部分
- 构造部分,包含计算流图;
- 执行部分,通过session来执行图中的计算;
构建图
- 创建源节点(source op);
- 源节点输出传递给其他节点(op)做运算;
TF默认图
- TensorFlow Python库有一个默认图(default graph)
- 节点构造器(op构造器)可以增加节点;
看一个TF示例
- 2个constant()节点
- 1个manmul()节点

真实的计算要用到session,马上来
通过TF中的session执行真的操作

Session对象在使用完成后,记得关闭以释放资源;
我们会用到变量(variables)来保存参数W

注意到tf.initialize_all_variables,我们要预先对变量初始化(initialization)
TF中一个计算图的状态变更过程

关于多GPU/ CPU
用with ... device语句用来指派特定的CPU或GPU操作

总结下

TensorBoard可视化

PyTorch
主要特点

简单入门:高速计算

自动求导

基本概念:



浙公网安备 33010602011771号