0 写在之前
经过了10天的深度学习入门计划,成果比较显著,目前已经基本了解了整个神经网络发挥作用的流程。日后仍然要继续积累经验,以下几个方面,都有很多要学习和提高的地方:
- 网络构建技巧
- 调参技巧
- 数据预处理
- 代码可读性、规范性
参加了飞浆的学习赛,赛中学习,过程中诞生了很多疑问。
1 list array tensor DataFrame
在数据处理过程中,涉及这四个数据类型之间的各种操作与转换,让我经常摸不着头脑,郁闷不已。为什么要设置这四种数据类型呢?
python几种基本的数据类型,有
- 元组(tuple)
- 列表(list)
- 字典(dict)
其中元组不能修改其中的元素,但是列表可以。实际上元组很少被使用,一般都用list。
万物都可以被放入list中,但是list永远都是一维的,也只能进行一维索引。虽然可以通过嵌套操作,一层层取出内部元素,总归比较麻烦。
于是有array。array是numpy中的类,对标matlab,重点在于实现矩阵运算。而矩阵运算,只在1维以及2维。但是其实ndarray也可以实现多维,本质是是多维的数组。
tensor是张量,主要面向的就是高纬度数组的批量计算,他跟array最本质的区别就是它是存储在显存中的,利用gpu加速计算。而array就跟一般的变量一样,存储在内存当中。
因此也能推断出,对于一个具有优异GPU性能的服务器来说,应该多去用tensor而少用array,以便去提高显存的利用率,节省并不富裕的内存占用,同时加速计算。
而DataFrame是Pandas中的数据类型。Pandas常用来进行数据预处理。它就是一个二维的表格。
因此,与其掌握他们之间的转换,不如把tensor的方法去把握好,尽量用tensor去搞定。
2 显卡是如何加速计算的呢?
“炼丹”并不能光有一个好的显卡。实践中可以发现,在数据预处理阶段,cpu占用很高,而GPU却在“摸鱼”。只有在训练以及推理的时候,GPU才会发挥主要作用。
一般来说,GPU只能读取位于显存中的数据,不能跟内存之间联系。因此,很多时候,需要花费时间进行内存到显存的数据转换(对应就是数据类型转换到tensor的过程)。
显卡相比于CPU,核心数量要多得多。有人将GPU核心比做“教授”,神通广大。将GPU Core比做学生。虽然教授强大,但是进行大量的简单计算时,往往比不过一堆学生同时进行。
3 关于batch_size的选取
不能太大,也不能太小。
之前有一个误解,认为越大越快。实际上,对于随机梯度下降法,除了梯度参数之外,还有一个参数是步长。由于可能不是最优,往往需要多次执行才能找到最优解,而增大batch_size,则会减小执行次数,往往会损失模型的精度。
batch_size取到最大的情况,成为full batch learning。反之,也存在batch_size取到最小的情况,称为online learning,即在线学习。
一般来说,batch_size取到稍大一点比较好,一般喜欢取8的倍数。超参数的选取,很多时候没有那么多确定性,可以随意一点。
4 关于Notebook的使用
使用服务器开发代码,很多时候要用到notebook。要去习惯使用notebook进行代码的开发,好的代码应该能够方便Notebook的使用。多去用Notebook的快捷键。建立程序框架,按照固定的框架去编程。不断去优化自己的框架。