【深度学习:21 天实战 Caffe】课后习题参考答案

来源:互联网 发布:carousel.js 编辑:程序博客网 时间:2024/06/09 17:05

自出版以来收到很多读者的反馈,其中一个比较常见的诉求是提供习题答案。

在写作之初只是希望读者阅读完每一章后,能通过习题再对当前章节做一个回顾,将学到的知识迅速投入实战,或者扩展知识面,了解更多相关内容。很多习题是开放性的问题,没有标准答案,经历过实践尝试解决问题才会有所收获。


现公布部分章节习题参考答案如下:


第 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<float>; \  template class classname<double>

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

有兴趣的读者可以试着修改并重新编译 Caffe,看有什么效果。


3. 可以对比学习,例如 TensorFlow 中的 Tensor 实现。


第 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. 略


9 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脚面被压了肿起来了怎么办 每天加班很累反而失眠严重怎么办 减肥药吃了口臭嘴巴苦怎么办 上火引起的牙疼怎么办吃什么药 舌苔厚口气重怎么办应该吃什么药 宝宝老是额头热四肢不热怎么办 考老师考砸了心理崩溃了怎么办 苹果手机一会白屏一会黑屏怎么办 360云盘的东西删不了怎么办 手机邮箱打开的文件疑似病毒怎么办 电脑qq发送的文件失效了怎么办 小米4c温控文件打开是乱码怎么办 超星尔雅用学号登录密码忘了怎么办 全脸做激光去黄褐斑后脸发红怎么办 上传到微云中的视频下载不了怎么办 微云保存的小电影下载不了怎么办 苹果手机下载有云朵下载不了怎么办 手机下载登录忘了密码了怎么办 软软件被手机加密忘了密码怎么办 苹果手机想下载东西忘了密码怎么办 已经不念书几年了突然想上学怎么办 江湖风云录把王老爷子杀了怎么办 练扫踢胫骨旁边的肌肉受伤了怎么办 四个月宝宝没抱住摔了头部怎么办 老公老是跟年轻的小姑娘聊天怎么办 老婆出轨老公想离婚又舍不得怎么办 孕妇打完无痛分娩针就想睡觉怎么办 熟食店开空调菜品吹的很干怎么办 不锈钢锅在液化气烧了发黄怎么办 在小镇门面卤菜店不好卖怎么办? 被辣椒辣到嘴唇了该怎么办 沁园净水机不制水指示灯不亮怎么办 太辣了辣得胃疼怎么办 出现连接问题或mmi码无效怎么办 存折丢了怎么办卡号也不记得了 车内皮子被烂苹果腐蚀有印怎么办 锅被腐蚀后变黑色应该怎么办 后厨炉灶里的炉芯进水了怎么办 小儿九个月老是流黄鼻子该怎么办 肉炖的老了不烂怎么办 吃了凉东西现在一直打嗝应该怎么办