正则化
L1 L2正则项的使用
`kernel_regularizer`:施加在权重上的正则项,为`keras.regularizer.Regularizer`对象 `bias_regularizer`:施加在偏置向量上的正则项,为`keras.regularizer.Regularizer`对象 `activity_regularizer`:施加在输出上的正则项,为`keras.regularizer.Regularizer`对象 L1正则化可以产生稀疏权重矩阵,即大部分w为0,只有少数w非0,可以用于特征选择 L2正则化可以防止模型过拟合 是个方差 keras.regularizers.l1(0.0003) keras.regularizers.l2(0.0003) keras.regularizers.l1_l2(0.0003) Dense(units=10,bias_initializer='zeros',activation='softmax',kernel_regularizer=keras.regularizers.l2(0.0003) 复制代码
dropout 正则使用
主要是剔除一些神经元 model.add(Dropout(0.25)) 复制代码
初始化权重
通常关键字为 kernel_initializer bias_initializer kernel_initializer默认值为'glorot_uniform',对应的实例是keras.initializers.glorot_uniform(seed=None) bias_initializer默认值为'zeros',对应的实例是keras.initializers.Zeros() model.add(Dense(64, kernel_initializer='random_uniform', bias_initializer='zeros')) 均匀分布初始化 *minval:均匀分布下边界* maxval:均匀分布上边界 * seed:随机数种子 keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None) 截尾高斯分布初始化,该初始化方法与RandomNormal类似,但位于均值两个标准差以外的数据将会被丢弃并重新生成,形成截尾分布。该分布是神经网络权重和滤波器的推荐初始化方法。 keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None) 复制代码
学习率
调整学习率需要在model.fit中的callbacks回调函数中实现。
LearningRateScheduler
schedule:函数,该函数以epoch号为参数(从0算起的整数),返回一个新学习率(浮点数) keras.callbacks.LearningRateScheduler(schedule) 复制代码
ReduceLROnPlateau
- monitor:被监测的量 - factor:每次减少学习率的因子,学习率将以`lr = lr*factor`的形式被减少 - patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发 - mode:‘auto’,‘min’,‘max’之一,在`min`模式下,如果检测值触发学习率减少。在`max`模式下,当检测值不再上升则触发学习率减少。 - epsilon:阈值,用来确定是否进入检测值的“平原区” - cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作 - min_lr:学习率的下限 reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.001) model.fit(X_train, Y_train, callbacks=[reduce_lr]) 复制代码
Optimizers 优化器
keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam,Adamax,Nadam 等 例子learning_rate 学习率 sgd = SGD(learning_rate=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=['accuracy']) 复制代码
**如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。** **RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。** **Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,** **随着梯度变的稀疏,Adam 比 RMSprop 效果会好。** 整体来讲,**Adam 是最好的选择**。 很多论文里都会用 SGD,没有 momentum 等。**SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点**。 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法