参考书目:陈允杰.TensorFlow与Keras——Python实战深度学习应用.北京:2021年中国水利水电出版社
这个系列基本上不讲数学原理,只让读者从代码的角度使用最简洁的Python代码实现深度学习方法。
神经网络模型在具体的训练过程中有很多技能,对于过拟合、欠拟合、梯度爆炸、操作太慢等不同的问题,都有自己的处理方法。下面是一个接一个的介绍。
过拟合和欠拟合
过拟合处理方法有三种,一种是加惩罚项范数,又成为权重衰减,L1和L例如,在建造卷积层时,2范数两者:
model.add(Conv2D(32, kernel_size=(3, 3), padding="same", input_shape=X_train.shape[1:], activation="relu", kernel_regularizer=regularizers.l2(0.02), bias_regularizer=regularizers.l2(0.02)))
kernel_regularizer=regularizers.l2(0.02)表示对系数的惩罚。.02表示惩罚力度,其他层次也是如此。
二是增加dropout层,又称丢包层,将神经网络中的一部分神经元随机‘休眠’,即输出为0:
model.add(Dropout(0.25))
0.25表示丢包百分比。
第三种是早期停止机制,可以在一定程度上减少神经网络训练周期的过拟合。稍后介绍Keras如何方便实现内部早停机制?
欠拟合反过来操作,不加权重衰减,减少包层丢失,增加训练轮数等方法...
选择优化器
优化器也有参数,不同的类型也会导致不同的训练时间和训练结果。以下是如何定义优化器。
# 编译模型 opt_sgd = optimizers.SGD(lr=0.05,decay=1e-6, momentum=.09) opt_adam = optimizers.Adam(lr=0.001,decay=1e-6) opt_rms = optimizers.RMSprop(lr=0.001,decay=1e-6) model.compile(loss="categorical_crossentropy", optimizer=opt_sgd,metrics=["accuracy"])
在编译模型时,生成优化器类,指定参数,然后放入。一般来说,会选择Adma,综合来看Adma最好的优化器。
批量标准化
批量标准化的好处如下:
1.加速神经网络收敛
2.学习率更高,初始化权重不那么重要
3.缓解梯度消失或爆炸的问题。
在激活函数之前,标准化层应在全连接(卷积层、循环层)层后定义模型:
# 定义模型 #MLP层 model = Sequential() model.add(Dense(11, input_dim=X_train.shape[1], use_bias=False)) model.add(BatchNormalization()) model.add(Activation("relu")) model.add(Dense(11, use_bias=False)) model.add(BatchNormalization()) model.add(Activation("relu")) model.add(Dense(1, activation="sigmoid")) model.summary() #显示模型摘要信息 #或卷积层 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), padding="same", input_shape=X_train.shape[1:], use_bias=False)) model.add(BatchNormalization()) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, kernel_size=(3, 3), padding="same", use_bias=False)) model.add(BatchNormalization()) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(512, activation="relu")) model.add(Dropout(0.5)) model.add(Dense(10, activation="softmax")) model.summary() # 显示模型摘要信息
在正确的时间停止模型
在Keras里面主要是利用EarlyStopping实现,训练时加入就行了。
# 训练模型 from keras.callbacks import EarlyStopping # 建立 EarlyStopping 物件 es = EarlyStopping(monitor="val_loss", mode="min", verbose=1,patience=5) history = model.fit(X_train, Y_train, validation_split=0.2, epochs=30, batch_size=10, verbose=0, callbacks=[es])
monitor表示监控指标,mode意味着有改进标准,最大值或最小值。verbose=表示可以显示训练停在哪个周期。patience=5表示达到标准后可延迟5个周期停止。
若采用精度作为监测指标,则mode最大值应改为:
from keras.callbacks import EarlyStopping # 建立 EarlyStopping 物件 es = EarlyStopping(monitor="val_accuracy", mode="max", verbose=1, patience=5) history = model.fit(X_train, Y_train, validation_split=0.2, epochs=50, batch_size=10, verbose=0, callbacks=[es])
自动储存最优权重
# 训练模型 from keras.callbacks import ModelCheckpoint # 建立 ModelCheckpoint 物件 mc = ModelCheckpoint("best_model.h5", monitor="val_accuracy", mode="max", verbose=1, save_best_only=True) history = model.fit(X_train, Y_train, validation_split=0.2, epochs=15, batch_size=10, verbose=0, callbacks=[mc])
同时,使用早停和自动存储
# 训练模型 from keras.callbacks import EarlyStopping # 建立 EarlyStopping 物件 es = EarlyStopping(monitor="val_loss", mode="min",verbose=1) from keras.callbacks import ModelCheckpoint # 建立 ModelCheckpoint 物件 filename = "weights-{epoch:02d}-{val_accuracy:.2f}.h5" mc = ModelCheckpoint(filename, monitor="val_acc", mode="max", verbose=1, save_best_only=True) history = model.fit(X_train, Y_train, validation_split=0.2, epochs=20, batch_size=10, verbose=0, callbacks=[es, mc])