一、经验法则[1]
原文:Rules-of-thumb for building a Neural Network
多层感知器(Multilayer Perceptron)算是深度学习里的hello world了,对于建一个MLP的模型(Keras),有以下的经验法则:
1. 层数:从两层隐藏层(hidden layers)开始, 不包括最后一层
2. 中间层的大小(节点数):一般是2的指数,比如4,8,16,32等等,第一层应该是输入数据特征的一半,下一层应该是前一层的一半。
3. 分类问题输出层的大小:如果是二分的问题,输出层的大小为1,如果有多个类别,则输出层大小是类的数量。
4. 回归问题输出层的大小:如果是单响应,输出层大小为1 ,如果是多响应回归,则输出层大小是响应的数量。
5. 中间层的激活函数:用relu.
6. 输出层的激活函数:如果是二分,用sigmoid,如果是多分,用softmax,如果是回归,用linear。对于自编码器,如果输入是连续的,用linear,如果输入是离散的,根据情况用sigmoid或者softmax。
7. Dropout层:在除了输入之外的每一层后面加Dropout,把 dropout rate设为0.5,如果觉得0.5正则化的节点太多,那应该增加层的大小而不是减少dropout率,如果一定要在输入层上加dropout,那dropout rate应该小于0.2.
8. 数据预处理:假设数据已经是数值类型并且分类是one-hot label, 在数据进入模型之前,用sklearn.preprcessing里的MinMaxScaler对数据进行处理,如果效果不好,可以用StandardScaler。
9. 分训练集,验证集和测试集:用sklearn.model_selection里的train_test_split。
10. 类的权重:如果有分布不均的数据,如果是二分,权重是{0:1的数量/数据大小,1:0的数量/数据大小},对于数据分布特别不均衡的情况,权重可能会不好使。
11. Optimizer:默认Adam。
12. 分类的loss:对于二分,用binary-crossentropy,对与多分,如果是独热标签,用categorical_crossentropy,如果标签是整数,用sparse_categorical_crossentropy。
13. 回归的loss:用mse。
14. 分类的结果好坏:用accuracy看正确分类的百分比,对于不平衡的数据还可以用tf.keras.metrics.Recall() 和tf.keras.metrics.FalsePositives()。
15. 回归的结果:tf.keras.metrics.RootMeanSquaredError()。
16. Epochs:从20开始,看能不能看到loss减小和准确性增加,如果没有最小值就继续加,如果最小值很少,加到100。
17. Batch size:2的指数,从16开始,如果是不平衡的数据,从128开始。
MLP如何选择 hidden layer的层数[2]:
hidden layer 数量->结果
0-->只能用于表示线性可分方程
1-->可以估计包括从一个有限空间到另一个有限空间的连续映射的任何函数(universal function approximator)
2-->可以表示任意准确率的任意决策边界
>2-->可以学习更加复杂的表示
MLP如何选择神经元数量[2]:
神经元数目太少会导致欠拟合,太多会过拟合,如何选择合适数量的神经元的经验法则如下:
- 隐藏层神经元的数量应在输入层大小和输出层大小之间
- 隐藏层神经元的数量应该是输入层大小的2/3,加上输出层的大小
- 隐藏层神经元的数量应该小于两倍的输入层大小
二、从头开始
数据预处理[3]
在数据进入神经网络之前,应该被处理为浮点数类型的变量。
图像
1. 读入图片文件
2. 把JPEG(如果是JPEG)的内容解码为RGB的像素点
3. 转成浮点数类型的张量
4. 把像素数值从[0,255] 转为 [0,1] 区间内
对于图像处理Keras有处理图像的工具,keras.preprocessing.image, 其中包括类ImageDataGenerator, 可以自动返回处理过的图片batch。
keras里的ImageDataGenerator数据增强[3]
为了避免数据重复训练造成的过拟合,一般会对数据进行增强,对于图像来说就是旋转,变形,翻转,加点噪声等。同样的keras的ImageDataGenerator也有相应的功能,详细的参考文档。
随机
在model.fit_generator里shuffle的参数,shuffle=True就可以在训练前打乱每个batch的顺序,也可以防止过拟合。
训练神经网络的一般流程[4]:
1.定义一个神经网络以及参数
2.在一个输入的数据库上迭代
3.输入在神经网络里过一遍(前馈)
4.计算得到loss(和正确的答案比较)
5.反向传播,计算参数梯度
6.向梯度下降的方向升级权重,最简单的就是weight = weight - learning_rate * gradient
Referrence:
[1]. Rules-of-thumb for building a Neural Network
[2]. The Number of Hidden Layers. "Artificial Intelligence for Humans, Volume 3: Deep Learning and Neural Networks" ISBN: 1505714346
[3]. Chollet, Deep Learning with Python, 2018, p135-138
网友评论