百度网盘已弃用。随书资源已经放在码云和 github,方便国内外朋友下载。
码云:https://gitee.com/yongkezhao/PracticeCaffeIn21Days
github:https://github.com/zhaoyongke/Caffe21Days
-------------------------------------------------------
自出版以来收到很多读者的反馈,其中一个比较常见的诉求是提供习题答案。
在写作之初只是希望读者阅读完每一章后,能通过习题再对当前章节做一个回顾,将学到的知识迅速投入实战,或者扩展知识面,了解更多相关内容。很多习题是开放性的问题,没有标准答案,经历过实践尝试解决问题才会有所收获。
现公布部分章节习题参考答案如下:
第 1 天 1.4 节,P9
1.
Geoffrey Hinton:http://www.cs.toronto.edu/~hinton/
Yann LeCun : https://research.facebook.com/yann-lecun
Youshua Bengio:http://www.iro.umontreal.ca/~bengioy/yoshua_en/index.html
2. https://www.coursera.org/learn/machine-learning
3. 略
第 2 天 2.7 节,P18
1. 略
2. 略
第 3 天 3.7 节,P25
1. 略
2. 可以从 DL 社区组成、开源传统、业界支持等方面讨论。
3. 可以从语言选择、编程接口、数学库、模型描述、分布式支持、GPU 支持、上层应用对接等多个维度考虑。
第 4 天 4.6 节,P32
1. (sudo) yum install python-devel python-pip numpy
(sudo) apt-get install python-dev python-pip numpy
2. 方法:可以在编译完 Caffe 后,使用
# ldd build/lib/libcaffe.so
查看所有依赖包库的位置。默认安装位置一般在 /usr/lib/,/lib/,/lib64/ 或 /usr/local/lib 下。
3. 可以,但要将习题 2 中(与 Caffe 编译相关的)所有依赖全部复制,否则会报错找不到某个依赖包。
第 5 天 5.11 节,P49
igemm 表示整型普通矩阵乘法,矩阵每个元素都是 int。在矩阵乘计算过程中,int 类型容易发生溢出,导致计算结果错误。一般数学库(MKL, OpenBLAS)都是面向科学计算领域,允许结果存在一定误差,但不能出现错误。
第 6 天 6.4 节,P79
1. 思路:用 Windows 画图软件绘制手写体数字,缩放到 28 x 28,另存为图片(jpg 或 png 均可),用 MATLAB 将图片转换为 MNIST 格式数据,替换掉 test 数据集,之后再创建 test_lmdb,修改 lenet_train_val.prototxt 使用该数据集。利用训练好的模型和 lenet_train_val.prototxt 进行 caffe test,检查正确率。
2. 思路:修改 caffe.cpp 中 test() 函数,如果出现预测失败则转储对应的输入 data blob 和 label blob。
3. 略
第 7 天 7.5 节,P99
1. 使用 $ grep -nHR 命令可以轻松找到。
./include/caffe/common.hpp:70:
#define NOT_IMPLEMENTED LOG(FATAL) << "Not Implemented Yet"
./include/caffe/common.hpp:41:
// Instantiate a class with float and double specifications.
#define INSTANTIATE_CLASS(classname) \
char gInstantiationGuard##classname; \
template class classname; \
template class classname
2. 碰巧看到知乎上有人问了这个问题,这个教科书式的回答我给 100 分。
https://www.zhihu.com/question/49467045 学生 的回答
3. 略
第 8 天 8.5 节,P147
1. 使用 $ grep -nHR 跟踪 Net 成员变量 memory_used_ 可以轻松找到:
# grep -nHR "memory_used_" .
include/caffe/net.hpp:306: size_t memory_used_;
src/caffe/net.cpp:68: memory_used_ = 0;
src/caffe/net.cpp:163: memory_used_ += top_vecs_[layer_id][top_id]->count();
src/caffe/net.cpp:166: << "Memory required for data: " << memory_used_ * sizeof(Dtype);
(输出可能与你的略有不同,以你的实际输出为准)
2. Caffe 代码中定义了宏 DISABLE_COPY_AND_ASSIGN,利用了 C++ 语言特性,即只要将类拷贝构造函数与赋值运算符重载函数声明为私有就能禁用这两个函数。
该宏定义位于 include/caffe/common.hpp (使用 grep -nHR 大法)
#define DISABLE_COPY_AND_ASSIGN(classname) \
private:\
classname(const classname&);\
classname& operator=(const classname&)
【进阶】在 C++ 11 语言特性中,可以直接将这两个函数声明为 deleted,即只声明但无论如何都不能使用。在 TensorFlow 中有相似功能的宏 TF_DISALLOW_COPY_AND_ASSIGN 则使用了 C++ 11 特性:
// A macro to disallow the copy constructor and operator= functions
// This is usually placed in the private: declarations for a class.
#define TF_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
void operator=(const TypeName&) = delete
第 9 天 9.3 节, P171
1. 略
2. 略
3. 参考 matcaffe
第 10 天 10.5 节,P180
1. 修改模型时不需要重新编译代码。换了新的硬件或库实现时无需重新训练模型。
2. 可以,需要重新设置学习速率等超参数。
第 11 天 11.3 节, P192
1. 略
2. 略
第 12 天 12.4 节, P205
1. 参考代码。首先将输入 blob 的每个元素减去最大值,再计算指数。
2. K/N(可以用多种方法)。
3. ImageNet-22K : ln(22000) 约为 9.9988;
Cifar-10:ln(10) 约为 2.3;
Cifar-100:ln(100) 约为 4.6;
4. 略
5. 可以合并。因为 Forward 计算不需要 diff。 Backward 阶段通过 top diff 与 weight 计算得到 bottom diff,继续向下传递。 data 和 diff 刚好可以实现时间上错开计算,故可以共享存储空间。Weight data 和 diff 同样也可以合并,只是需要提前进行 update 计算。
第 13 天 13.3 节, P230
1. 略
2. 略
第 14 天 14.1 节, P257
1. 可以参考 16.2.2 节代码;
2. 同上
3. 思路:编译 matcaffe 或 pycaffe,用 Matlab 或 Python 的网络库实现 web 服务,并将服务获取的数据送入常驻内存的 Net 对象执行预测。
第 15 天 15.4 节,P273
1. 见源码。
2.
Fermi:http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_Whitepaper.pdf
Kepler:http://international.download.nvidia.com/pdf/kepler/NVIDIA-Kepler-GK110-GK210-Architecture-Whitepaper.pdf
Maxwell:http://international.download.nvidia.com/geforce-com/international/pdfs/GeForce_GTX_980_Whitepaper_FINAL.PDF
Pascal:http://www.nvidia.cn/object/pascal-architecture-whitepaper-cn.html
3. 首先 Caffe 框架经历几次迭代,逐渐适应了 GPU 硬件和 加速库如 cuDNN,为此引入了 engine 机制,对于不同实现只需设置不同 engine 即可,用户以较小工作量就能选择 CPU、GPU、cuDNN 模式。设计类似框架,需要将框架和实现进行解耦,引入工厂设计模式,对不同实现要兼容并包。
4. Xeon Phi 平台接近 CPU 模式,使用 MKL 无缝迁移;FPGA 则分两种:PCIe 插卡方案接近 GPU 模式,遵循数据拷贝-计算-数据拷贝的三步,需要修改 Blob 实现,支持将存储空间置于 FPGA 板卡内;单颗芯片集成方案(如 Zynq、SoC、Xeon + FPGA)则接近多核 CPU 模式,需要考虑 cache coherent 问题,需要更细粒度划分算法,将 SIMD 部分使用 FPGA 实现。
第 16 天 16.6 节,P298
1. 略
2. 略
3. 打印 train 和 val loss 曲线,看曲线走势。
如果 train loss 不断下降,test loss 趋于不变,说明网络过拟合,可以用正则化方法加以改善;
如果 train loss 和 test loss 均在下降,说明网络欠拟合,可增大学习速率继续训练直至 train loss 和 test loss 趋于平缓,再减小学习速率;
第 17 天 17.3 节,P317
1. 参考 https://docs.docker.com/engine/reference/builder/
2. 参考下图
3. 可以。参考:https://blog.docker.com/2013/09/docker-can-now-run-within-docker/
4. 运行 caffe time 或者 cublas gemm 进行对比。
5. 例如 TensorFlow:https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#docker-installation
第 18 天 18.4 节,P326
1. 需要进行图像切割、标注目标类别、标注目标位置、转换为需要的格式。
2. Google 和 百度可以利用强大的搜索引擎对互联网资源进行收集、汇总、编排,形成数据集。
Apple 可以利用 iPhone, iPad, Mac 等终端配合 app 进行数据搜集。
Microsoft 可以利用 OneDrive 或者 Windows 服务获取。
Amazon、Alibaba 可以利用平台上的海量商品数据。
Tencent 可以利用 QQ 聊天记录、QQ 空间图片、微信朋友圈、个人相册等数据。
3. 可以,但图像类别仍是 1000 个训练阶段预定的类别,其他乱入的物体可能出现误判。
第 19 天 19.8 节,P354
1. 略
2. 略
第 20 天 20.3 节,P361
1. 略
2. 略