keras处理欠拟合和过拟合的实例讲解

作者:Lzj000lzj 时间:2022-06-23 05:14:38 

baseline


import tensorflow.keras.layers as layers
baseline_model = keras.Sequential(
[
layers.Dense(16, activation='relu', input_shape=(NUM_WORDS,)),
layers.Dense(16, activation='relu'),
layers.Dense(1, activation='sigmoid')
]
)
baseline_model.compile(optimizer='adam',
     loss='binary_crossentropy',
     metrics=['accuracy', 'binary_crossentropy'])
baseline_model.summary()

baseline_history = baseline_model.fit(train_data, train_labels,
         epochs=20, batch_size=512,
         validation_data=(test_data, test_labels),
         verbose=2)

小模型


small_model = keras.Sequential(
[
layers.Dense(4, activation='relu', input_shape=(NUM_WORDS,)),
layers.Dense(4, activation='relu'),
layers.Dense(1, activation='sigmoid')
]
)
small_model.compile(optimizer='adam',
     loss='binary_crossentropy',
     metrics=['accuracy', 'binary_crossentropy'])
small_model.summary()
small_history = small_model.fit(train_data, train_labels,
         epochs=20, batch_size=512,
         validation_data=(test_data, test_labels),
         verbose=2)

大模型


big_model = keras.Sequential(
[
layers.Dense(512, activation='relu', input_shape=(NUM_WORDS,)),
layers.Dense(512, activation='relu'),
layers.Dense(1, activation='sigmoid')
]
)
big_model.compile(optimizer='adam',
     loss='binary_crossentropy',
     metrics=['accuracy', 'binary_crossentropy'])
big_model.summary()
big_history = big_model.fit(train_data, train_labels,
         epochs=20, batch_size=512,
         validation_data=(test_data, test_labels),
         verbose=2)

绘图比较上述三个模型


def plot_history(histories, key='binary_crossentropy'):
plt.figure(figsize=(16,10))

for name, history in histories:
val = plt.plot(history.epoch, history.history['val_'+key],
    '--', label=name.title()+' Val')
plt.plot(history.epoch, history.history[key], color=val[0].get_color(),
   label=name.title()+' Train')

plt.xlabel('Epochs')
plt.ylabel(key.replace('_',' ').title())
plt.legend()

plt.xlim([0,max(history.epoch)])

plot_history([('baseline', baseline_history),
   ('small', small_history),
   ('big', big_history)])

keras处理欠拟合和过拟合的实例讲解

三个模型在迭代过程中在训练集的表现都会越来越好,并且都会出现过拟合的现象

大模型在训练集上表现更好,过拟合的速度更快

l2正则减少过拟合


l2_model = keras.Sequential(
[
layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001),
    activation='relu', input_shape=(NUM_WORDS,)),
layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001),
    activation='relu'),
layers.Dense(1, activation='sigmoid')
]
)
l2_model.compile(optimizer='adam',
     loss='binary_crossentropy',
     metrics=['accuracy', 'binary_crossentropy'])
l2_model.summary()
l2_history = l2_model.fit(train_data, train_labels,
         epochs=20, batch_size=512,
         validation_data=(test_data, test_labels),
         verbose=2)
plot_history([('baseline', baseline_history),
   ('l2', l2_history)])

keras处理欠拟合和过拟合的实例讲解

可以发现正则化之后的模型在验证集上的过拟合程度减少

添加dropout减少过拟合


dpt_model = keras.Sequential(
[
layers.Dense(16, activation='relu', input_shape=(NUM_WORDS,)),
layers.Dropout(0.5),
layers.Dense(16, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
]
)
dpt_model.compile(optimizer='adam',
     loss='binary_crossentropy',
     metrics=['accuracy', 'binary_crossentropy'])
dpt_model.summary()
dpt_history = dpt_model.fit(train_data, train_labels,
         epochs=20, batch_size=512,
         validation_data=(test_data, test_labels),
         verbose=2)
plot_history([('baseline', baseline_history),
   ('dropout', dpt_history)])

keras处理欠拟合和过拟合的实例讲解

批正则化


model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(784,)),
layers.BatchNormalization(),
layers.Dense(64, activation='relu'),
layers.BatchNormalization(),
layers.Dense(64, activation='relu'),
layers.BatchNormalization(),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer=keras.optimizers.SGD(),
   loss=keras.losses.SparseCategoricalCrossentropy(),
   metrics=['accuracy'])
model.summary()
history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.legend(['training', 'validation'], loc='upper left')
plt.show()

总结

防止神经网络中过度拟合的最常用方法:

获取更多训练数据。

减少网络容量。

添加权重正规化。

添加dropout。

来源:https://blog.csdn.net/Lzj000lzj/article/details/94132842

标签:keras,欠拟合,过拟合
0
投稿

猜你喜欢

  • php开启openssl的方法

    2023-11-14 06:52:51
  • python网络爬虫之如何伪装逃过反爬虫程序的方法

    2022-08-12 10:23:23
  • 利用python爬取软考试题之ip自动代理

    2023-01-30 01:17:28
  • Python urlopen()函数 示例分享

    2022-08-15 01:00:58
  • 微信小程序基于数据库时间实现商品倒计时功能(可重用代码)

    2024-01-16 06:05:38
  • sql 存储过程批量删除数据的语句

    2012-08-21 10:24:14
  • 页面中横排布局的思考

    2008-01-18 12:56:00
  • python3发送邮件需要经过代理服务器的示例代码

    2023-07-27 01:00:44
  • pandas进行时间数据的转换和计算时间差并提取年月日

    2021-03-14 02:22:22
  • python 数据提取及拆分的实现代码

    2023-11-13 09:13:12
  • 使用python切片实现二维数组复制示例

    2021-11-02 22:24:41
  • Python实现通过文件路径获取文件hash值的方法

    2023-10-27 21:41:20
  • JavaScript 判断浏览器类型及版本

    2024-05-13 10:36:39
  • python实现一组典型数据格式转换

    2023-07-14 22:19:04
  • 用tensorflow构建线性回归模型的示例代码

    2022-04-12 03:41:47
  • vue开发chrome插件,实现获取界面数据和保存到数据库功能

    2024-01-19 03:18:57
  • Python数据类型详解(一)字符串

    2023-08-12 22:55:56
  • pandas数据清洗实现删除的项目实践

    2021-09-02 16:44:17
  • Python的getattr函数方法学习使用示例

    2021-10-18 13:43:25
  • MySQL5.7中的JSON基本操作指南

    2024-01-27 20:38:34
  • asp之家 网络编程 m.aspxhome.com