fit函数 model_深度学习笔记38_利用回调函数保存最佳的模型

fit函数 model_深度学习笔记38_利用回调函数保存最佳的模型_第1张图片

利用回调函数保存最佳的模型

ModelCheckpoint 与 EarlyStopping回调函数

对于EarlyStopping回调函数,最好的使用场景就是,如果我们发现经过了数轮后,目标指标不再有改善了,就可以提前终止,这样就节省时间。

该函数的具体参数如下:

keras.callbacks.EarlyStopping( monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto', baseline=None, restore_best_weights=False)
  • monitor: 被监测的数据。
  • min_delta: 在被监测的数据中被认为是提升的最小变化, 例如,小于 min_delta 的绝对变化会被认为没有提升。
  • patience: 没有进步的训练轮数,在这之后训练就会被停止。
  • verbose: 详细信息模式。
  • mode: {auto, min, max} 其中之一。 在 min 模式中, 当被监测的数据停止下降,训练就会停止;在 max 模式中,当被监测的数据停止上升,训练就会停止;在 auto 模式中,方向会自动从被监测的数据的名字中判断出来。
  • baseline: 要监控的数量的基准值。 如果模型没有显示基准的改善,训练将停止。
  • restore_best_weights: 是否从具有监测数量的最佳值的时期恢复模型权重。 如果为 False,则使用在训练的最后一步获得的模型权重。

在中断的时候,我们可以结合ModelCheckpoint来保存模型,这样我们可以保证只保存的是最佳模型。

keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
  • filepath: 字符串,保存模型的路径。
  • monitor: 被监测的数据。
  • verbose: 详细信息模式,0 或者 1 。
  • save_best_only: 如果 save_best_only=True, 被监测数据的最佳模型就不会被覆盖。
  • mode: {auto, min, max} 的其中之一。 如果 save_best_only=True,那么是否覆盖保存文件的决定就取决于被监测数据的最大或者最小值。 对于 val_acc,模式就会是 max,而对于 val_loss,模式就需要是 min,等等。 在 auto 模式中,方向会自动从被监测的数据的名字中判断出来。
  • save_weights_only: 如果 True,那么只有模型的权重会被保存 (model.save_weights(filepath)), 否则的话,整个模型会被保存 (model.save(filepath))。
  • period: 每个检查点之间的间隔(训练轮数)。

具体的coding如下:

import keras

callbacks_list = [
    # 目标指标不再有改善了,就可以提前终止
    keras.callbacks.EarlyStopping(
        monitor='acc', # 被监测的模型的精度
        patience=1 # 没有进步的训练轮数为1,在这之后训练就会被停止
    ),
    # 保存模型
    keras.callbacks.ModelCheckpoint(
    filepath = 'my_model.h5', # 文件路径
    monitor='val_loss', # 如果val_loss 没有改善就不覆盖
    save_best_only=True) # 保持最佳模型
]

model.compile(optimizer='rmsprop',
             loss='binary_crossentropy',
             metrics=['acc'])

model.fit(x,y,
         epochs=10,
         batch_size=32,
         callbacks=callbacks_list,
         validation_data=(x_val,y_val))

实践一个具体的项目

imdb评论的分类问题,利用一维卷积来训练,我们之前在训练的过程发现了经过几轮的后就出现了过拟合,现在利用对于EarlyStopping回调函数以及Checkpoint函数进行判断。实践效果如下。 在第7轮训练中就停止了,因为发现验证集的精度没有提高了。并且将最好的数据模型结果进行了保存。

# 数据准备

from keras.datasets import imdb
from keras.preprocessing import sequence

max_features = 10000
max_len = 500

print('Loading data...')
(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=max_features)
print(len(x_train),'train sequences')
print(len(x_test),'test sequences')

# 截断成一个相同长度的序列
print('Pad sequences (samples x time)')
x_train = sequence.pad_sequences(x_train,maxlen=max_len)
x_test = sequence.pad_sequences(x_test,maxlen = max_len)
print("x_train shape:",x_train.shape)
print("x_test shape:",x_test.shape)
Using TensorFlow backend.


Loading data...
25000 train sequences
25000 test sequences
Pad sequences (samples x time)
x_train shape: (25000, 500)
x_test shape: (25000, 500)
from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSprop

model = Sequential()
model.add(layers.Embedding(max_features,128,input_length = max_len))
model.add(layers.Conv1D(32,7,activation = 'relu'))
model.add(layers.MaxPool1D(5))
model.add(layers.Conv1D(32,7,activation = 'relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))

model.summary()
WARNING:tensorflow:From D:Anaconda3envstfgpulibsite-packagestensorflowpythonframeworkop_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, 500, 128)          1280000   
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 494, 32)           28704     
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 98, 32)            0         
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 92, 32)            7200      
_________________________________________________________________
global_max_pooling1d_1 (Glob (None, 32)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 33        
=================================================================
Total params: 1,315,937
Trainable params: 1,315,937
Non-trainable params: 0
_________________________________________________________________
import keras

callbacks_list = [
    # 目标指标不再有改善了,就可以提前终止
    keras.callbacks.EarlyStopping(
        monitor='acc', # 被监测的模型的精度
        patience=1 # 没有进步的训练轮数为1,在这之后训练就会被停止
    ),
    # 保存模型
    keras.callbacks.ModelCheckpoint(
    filepath = 'my_model.h5', # 文件路径
    monitor='val_loss', # 如果val_loss 没有改善就不覆盖
    save_best_only=True) # 保持最佳模型
]

model.compile(optimizer=RMSprop(lr = 1e-4),
             loss = 'binary_crossentropy',
             metrics = ['acc'])



history = model.fit(x_train,y_train,
                   epochs=10,
                   batch_size=128,
                   callbacks=callbacks_list,
                   validation_split = 0.2)
                   #validation_data=(x_test,y_test))
WARNING:tensorflow:From D:Anaconda3envstfgpulibsite-packagestensorflowpythonopsmath_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
WARNING:tensorflow:From D:Anaconda3envstfgpulibsite-packagestensorflowpythonopsmath_grad.py:102: div (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Deprecated in favor of operator or tf.math.divide.
Train on 20000 samples, validate on 5000 samples
Epoch 1/10
20000/20000 [==============================] - 6s 276us/step - loss: 0.8337 - acc: 0.5093 - val_loss: 0.6874 - val_acc: 0.5652
Epoch 2/10
20000/20000 [==============================] - 2s 90us/step - loss: 0.6699 - acc: 0.6379 - val_loss: 0.6641 - val_acc: 0.6578
Epoch 3/10
20000/20000 [==============================] - 2s 90us/step - loss: 0.6236 - acc: 0.7527 - val_loss: 0.6081 - val_acc: 0.7440
Epoch 4/10
20000/20000 [==============================] - 2s 91us/step - loss: 0.5259 - acc: 0.8080 - val_loss: 0.4831 - val_acc: 0.8068
Epoch 5/10
20000/20000 [==============================] - 2s 90us/step - loss: 0.4117 - acc: 0.8496 - val_loss: 0.4217 - val_acc: 0.8342
Epoch 6/10
20000/20000 [==============================] - 2s 90us/step - loss: 0.3519 - acc: 0.8711 - val_loss: 0.4083 - val_acc: 0.8436
Epoch 7/10
20000/20000 [==============================] - 2s 90us/step - loss: 0.3161 - acc: 0.8711 - val_loss: 0.4273 - val_acc: 0.8276

搭建自己的回调函数

通过扩展 keras.callbacks.Callback 基类来创建一个自定义的回调函数。 通过类的属性 self.model,回调函数可以获得它所联系的模型。 我们需要用实现这些方法来,来方便我们在模型训练的过程中来加入控制和监控。主要可以在如下时间点来调用我们设置的函数:

在每轮开始时被调用 on_epoch_begin
在每轮结束时被调用 on_epoch_end
在训练开始时被调用 on_train_begin
在训练结束时被调用 on_train_end
在处理每个批量之前被调用 on_batch_begin
在处理每个批量之后被调用 on_batch_end

回调函数还可以访问下列属性。 - self.model:调用回调函数的模型实例。 - self.validation_data:传入 fit 作为验证数据的值。

下面是一个简单的例子,在训练时,保存一个列表的批量损失值

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self,logs={}):
        self.losses = []

    def on_batch_end(self,batch,logs={}):
        self.losses.append(logs.get('loss'))

分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

fit函数 model_深度学习笔记38_利用回调函数保存最佳的模型_第2张图片

你可能感兴趣的:(fit函数,model)