锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Python深度学习09——Keras实现深度学习模型调整技巧

时间:2022-11-23 07:30:00 连接器fit系列

参考书目:陈允杰.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])

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章