神经网络过拟合的处理方法
获取更多的训练数据
调节模型允许存储的信息量
模型越小,越不容易过拟合。因为当模型容量很大的时候,网络会学习到一种类似全映射的方式。好比如反正能记住,所有的图片对应的答案都记下来。这会导致泛化能力变差。如果你去约束他的记忆容量,然后通过训练避免网络模型去提取压缩有效的内在映射关系。这样会帮助提升泛化能力。
添加权重正则化
这里的前提是这样一个经验, 模型的参数值分布的熵越小的模型越不容易过拟合, 这个前提就当经验好了,为啥不知道。所以我们希望训练出来的参数逼近正态分布,均值为0。 对于大的参数进行惩罚,让网络训练通过惩罚反馈,不断的把参数中的大值打压下去。
要实现这个目的,方法是,在计算传递损失的时候,添加惩罚值。
from keras import regularizers
model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(10000,)))
...
上面代码中regularizers.l2(0.001)表示在损失反向传递的时候,在计算损失的时候,要加上权重矩阵引起的惩罚,该层权重矩阵每个系数的平方*0.001作为惩罚值添加到损失中。这个损失只有在训练的时候添加,在测试的时候是不惩罚的。
dropout正则化
对某一层使用dropout,就是在训练过程中随机把该层的输出舍弃一些。(设置为0)同时因为测试时没有单元被舍弃,所以需要该层的输出值按dropout比例缩小(这个纯粹就讲不出啥道理了)
通常测试中为了让测试时输出不变,训练时dropout往往这样实现
layer_output *= np.random.randint(0,high=2,size=layer_output.shape)
layer_output /= 0.5 #注意因为随机丢掉了一半,这里参数要扩大一倍(感觉是经验做法)
在keras可以通过dropout层向网络中引入正则化。dropout将被应用与前面一层的输出
model.add(layers.Dropout(0.5))
机器学习模型建立的通用流程
1 定义问题,收集数据集
要明确并整理你要用机器学习解决的问题. 他的输入是什么,输出是什么. 要收集足够的数据集. 并且这些数据集包含足够的学习信息(输入到输出的各种映射关系都涵盖).
2 选择衡量成功的指标
这个涉及的是如何计算损失。对于平衡分类问题(每个类别的可能性相同),精度和接收者操作特征曲线下面积是常用指标,对于类别不平衡的问题,可以使用准确率, 这里精度和准确率的区别是啥???
3确定评估方法
根据数据集的大小可以选择
- 留出验证集
- K折交叉验证
- 重复的K折交叉验证
3准备数据
比如将数据格式化为张量(因为神经网络的输入必须是张量)
比如把张量的取值缩放到较小的值范围
比如当不同的特征具有不同的取值范围的时候,进行数据标准化
你可能需要做特征工程,尤其是对于小数据问题 (这句话不理解)