上节课回顾:
最优化:SGD(黑色),SGD+momentum(蓝色),Nesterov,Rmsprop(红色),Adam(紫色)
正则化:dropout,batch normalization
迁移学习
CPU vs GPU
CPU擅长逻辑控制,串行的运算。和通用类型数据运算不同,GPU擅长的是大规模并发计算.
CPU 和 GPU 的区别是什么? - 虫子君的回答 - 知乎 https://www.zhihu.com/question/19903344/answer/96081382
一个简单的比较:纵轴是时间,ms
在cpu上跑 | 在cuda上跑 | 用优化过的cuda,也就是cuDNN(一种基于GPU的加速库)上跑
数据从存储读到GPU在速度上是一个瓶颈,解决方法:
1.将数据全部读到RAM
2.用SSD代替HDD
3.用更多的CPU线程取数据
深度学习框架现状:
来自GitHub的star统计:https://github.com/hunkim/DeepLearningStars
前三
![](https://i-blog.csdnimg.cn/blog_migrate/33c8fb63192c6142f61c2f38cfa12889.png)
不过,听说Facebook的PyTorch比较好用
为甚么要使用深度学习框架?
1.很容易建立大的计算图,也就是复杂的神经网络结构
2.计算梯度变得更容易
3.可以更高效地使用GPU加速(cuDNN,cuBLAS等)
如果你就用numpy,那么你只能在CPU上跑,而且得自己计算梯度
TensorFlow
例子,训练一个两层的ReLU网络,L2 loss
![](https://i-blog.csdnimg.cn/blog_migrate/2dbf9454c270f618a5feca0d049477ee.png)
问题:w1,w2更新时会在cpu/gpu之间copy
也可以利用一个optimizer更新权值,loss计算也可以由函数完成:
初始化方式也可以自己定义:
PyTorch
三层抽象
Tesnsor:n维矩阵
Variable:神经网络的Node
Module:神经网络的layer
两者比较:Static vs Dynamic Graphs
![](https://i-blog.csdnimg.cn/blog_migrate/108edfdc51b8750a8ecbb67efee080c4.png)
1.静态图允许框架在运行前优化图
2.静态图建立好以后自己就可以连续执行了,不需要访问代码了;动态图的建立和执行时交替的,需要访问代码
3.在遇到条件分支时,动态图可以随意调整,静态图需要想一些trick在运行前就把控制流程确定下来
4.在遇到循环时,静态图也难搞一点,可读性差一点
后来,Google发布了TensorFlow Fold库,帮助建立动态计算图。
为什么dynamic graphy这么重要呢?
因为循环和递归有很多重要应用:
- Recurrent networks 时间递归神经网络
- Recursive networks 结构递归神经网络
- Modular Networks
- (Your creative idea here)
Caffe
1.Core written in C++
2.Has Python and MATLAB bindings
3.Good for training or finetuningfeedforward classification models
4.Often no need to write code!
5.Not used as much in research anymore,still popular for deploying models