天天看点

过拟合解决方法python_keras处理欠拟合和过拟合的实例讲解

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)])

过拟合解决方法python_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)])

过拟合解决方法python_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)])

过拟合解决方法python_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。

以上这篇keras处理欠拟合和过拟合的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: keras处理欠拟合和过拟合的实例讲解

本文地址: http://www.cppcns.com/jiaoben/python/314067.html