基于keras中的回调函数用法说明

keras训练

fit(
 self,
 x,
 y,
 batch_size=32,
 nb_epoch=10,
 verbose=1,
 callbacks=[],
 validation_split=0.0,
 validation_data=None,
 shuffle=True,
 class_weight=None,
 sample_weight=None
)

1. x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array。如果模型的每个输入都有名字,则可以传入一个字典,将输入名与其输入数据对应起来。

2. y:标签,numpy array。如果模型有多个输出,可以传入一个numpy array的list。如果模型的输出拥有名字,则可以传入一个字典,将输出名与其标签对应起来。

3. batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。

4. nb_epoch:整数,训练的轮数,训练数据将会被遍历nb_epoch次。Keras中nb开头的变量均为"number of"的意思

5. verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录

6. callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数

7. validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。

8. validation_data:形式为(X,y)或(X,y,sample_weights)的tuple,是指定的验证集。此参数将覆盖validation_spilt。

9. shuffle:布尔值,表示是否在训练过程中每个epoch前随机打乱输入样本的顺序。

10. class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)。该参数在处理非平衡的训练数据(某些类的训练样本数很少)时,可以使得损失函数对样本数不足的数据更加关注。

11. sample_weight:权值的numpy array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode='temporal'。

fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况。

保存模型结构、训练出来的权重、及优化器状态

keras 的 callback参数可以帮助我们实现在训练过程中的适当时机被调用。实现实时保存训练模型以及训练参数。

keras.callbacks.ModelCheckpoint(
 filepath,
 monitor='val_loss',
 verbose=0,
 save_best_only=False,
 save_weights_only=False,
 mode='auto',
 period=1
)

1. filename:字符串,保存模型的路径

2. monitor:需要监视的值

3. verbose:信息展示模式,0或1

4. save_best_only:当设置为True时,将只保存在验证集上性能最好的模型

5. mode:‘auto',‘min',‘max'之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。

6. save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)

7. period:CheckPoint之间的间隔的epoch数

当验证损失不再继续降低时,如何中断训练?当监测值不再改善时中止训练

用EarlyStopping回调函数

from keras.callbacksimport EarlyStopping 

keras.callbacks.EarlyStopping(
 monitor='val_loss',
 patience=0,
 verbose=0,
 mode='auto'
)

model.fit(X, y, validation_split=0.2, callbacks=[early_stopping])

1. monitor:需要监视的量

2. patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。

3. verbose:信息展示模式

4. mode:‘auto',‘min',‘max'之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练。

学习率动态调整1

keras.callbacks.LearningRateScheduler(schedule)

schedule:函数,该函数以epoch号为参数(从0算起的整数),返回一个新学习率(浮点数)

也可以让keras自动调整学习率

keras.callbacks.ReduceLROnPlateau(
 monitor='val_loss',
 factor=0.1,
 patience=10,
 verbose=0,
 mode='auto',
 epsilon=0.0001,
 cooldown=0,
 min_lr=0
)

1. monitor:被监测的量

2. factor:每次减少学习率的因子,学习率将以lr = lr*factor的形式被减少

3. patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发

4. mode:‘auto',‘min',‘max'之一,在min模式下,如果检测值触发学习率减少。在max模式下,当检测值不再上升则触发学习率减少。

5. epsilon:阈值,用来确定是否进入检测值的“平原区”

6. cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作

7. min_lr:学习率的下限

当学习停滞时,减少2倍或10倍的学习率常常能获得较好的效果

学习率动态2

def step_decay(epoch):
 initial_lrate = 0.01
 drop = 0.5
 epochs_drop = 10.0
 lrate = initial_lrate * math.pow(drop,math.floor((1+epoch)/epochs_drop))
 return lrate
lrate = LearningRateScheduler(step_decay)
sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False)
model.fit(train_set_x, train_set_y, validation_split=0.1, nb_epoch=200, batch_size=256, callbacks=[lrate])

如何记录每一次epoch的训练/验证损失/准确度?

Model.fit函数会返回一个 History 回调,该回调有一个属性history包含一个封装有连续损失/准确的lists。代码如下:

hist = model.fit(X, y,validation_split=0.2)
print(hist.history)

Keras输出的loss,val这些值如何保存到文本中去

Keras中的fit函数会返回一个History对象,它的History.history属性会把之前的那些值全保存在里面,如果有验证集的话,也包含了验证集的这些指标变化情况,具体写法

hist=model.fit(train_set_x,train_set_y,batch_size=256,shuffle=True,nb_epoch=nb_epoch,validation_split=0.1)
with open('log_sgd_big_32.txt','w') as f:
 f.write(str(hist.history))

示例,多个回调函数用逗号隔开

# checkpoint
checkpointer = ModelCheckpoint(filepath="./checkpoint.hdf5", verbose=1)
# learning rate adjust dynamic
lrate = ReduceLROnPlateau(min_lr=0.00001)

answer.compile(optimizer='rmsprop', loss='categorical_crossentropy',
    metrics=['accuracy'])
# Note: you could use a Graph model to avoid repeat the input twice
answer.fit(
 [inputs_train, queries_train, inputs_train], answers_train,
 batch_size=32,
 nb_epoch=5000,
 validation_data=([inputs_test, queries_test, inputs_test], answers_test),
 callbacks=[checkpointer, lrate]
)

keras回调函数中的Tensorboard

keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0,
   write_graph=True, write_images=True)

tbCallBack = keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
...
model.fit(...inputs and parameters..., callbacks=[tbCallBack])
tensorboard --logdir path_to_current_dir/Graph 

或者

from keras.callbacks import TensorBoard

tensorboard = TensorBoard(log_dir='./logs', histogram_freq=0,
       write_graph=True, write_images=False)
# define model
model.fit(X_train, Y_train,
   batch_size=batch_size,
   epochs=nb_epoch,
   validation_data=(X_test, Y_test),
   shuffle=True,
   callbacks=[tensorboard])

补充知识:Keras中的回调函数(callback)的使用与介绍

以前我在训练的时候,都是直接设定一个比较大的epoch,跑完所有的epoch之后再根据数据去调整模型与参数。这样做会比较耗时,例如说训练在某一个epoch开始已经过拟合了,后面继续训练意义就不大了。

在书上看到的callback函数很好的解决了这个问题,它能够监测训练过程中的loss或者acc这些指标,一旦观察到损失不再改善之后,就可以中止训练,节省时间。下面记录一下

介绍:

(选自《python深度学习》)

回调函数(callback)是在调用fit时传入模型的一个对象,它在训练过程中的不同时间点都会被模型调用。它可以访问关于模型状态与性能的所有可用数据,还可以采取行动:中断训练、保存模型、加载一组不同的权重或改变模型的状态。

部分回调函数:

1.ModelCheckpoint与EarlyStopping

监控目标若在指定轮数内不再改善,可利用EarlyStopping来中断训练。

可配合ModelCheckpoint使用,该回调函数可不断地保存模型,亦可以只保存某一epoch最佳性能模型

import keras
callbacks_list=[
 keras.callbacks.EarlyStopping(
  monitor='acc',#监控精度
  patience=5,#5轮内不改善就中止
),
 keras.callbacks.ModelCheckpoint(
  filepath='C:/apple/my_model.h5',#模型保存路径
  monitor='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,#在这里放入callback函数
   validation_data=(x_val,y_val)
 )

2.ReduceLROnPlateau回调函数

如果验证损失不再改善,可以使用该回调函数来降低学习率。

import keras

callbacks_list=[
 keras.callbacks.ReduceLROnPlateau(
  monitor='val_loss',#监控精度
  patienece=5, # 5轮内不改善就改变
  factor=0.1#学习率变为原来的0.1
)
]
model.compile(optimizer='rmsprop',
    loss='binary_crossentropy',
    metrics=['acc'])
model.fit(x,y,
   epochs=10,
   batch_size=32,
   callbacks=callbacks_list,#在这里放入callback函数
   validation_data=(x_val,y_val)
 )

以上这篇基于keras中的回调函数用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈keras中的目标函数和优化函数MSE用法

    mean_squared_error / mse 均方误差,常用的目标函数,公式为((y_pred-y_true)**2).mean() model = Sequential() model.add(Dense(64, init='uniform', input_dim=10)) model.add(Activation('tanh')) model.add(Activation('softmax')) sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, ne

  • Keras之自定义损失(loss)函数用法说明

    在Keras中可以自定义损失函数,在自定义损失函数的过程中需要注意的一点是,损失函数的参数形式,这一点在Keras中是固定的,须如下形式: def my_loss(y_true, y_pred): # y_true: True labels. TensorFlow/Theano tensor # y_pred: Predictions. TensorFlow/Theano tensor of the same shape as y_true . . . return scalar #返回一个标量

  • keras中的loss、optimizer、metrics用法

    用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.losses,keras.optimizers,metrics包下面的函数 例如: sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', opt

  • 基于keras中的回调函数用法说明

    keras训练 fit( self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None ) 1. x:输入数据.如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应

  • C#中异步回调函数用法实例

    本文实例讲述了C#中异步回调函数用法.分享给大家供大家参考.具体如下: static void Main(string[] args) { Func<string,string> showMessage = ShowMessage; //设置了回调函数Completed,不能有返回值 IAsyncResult result = showMessage.BeginInvoke("测试异步委托",new AsyncCallback(Completed),null); //半段异

  • 基于numpy中的expand_dims函数用法

    常见的一种应用场景: 条件:假设A的shape为[4, 2],B的shape为[5, 2] 目的:实现A中的每一行, 减去B中的所有行(broadcast操作). 实现: A1 = np.expand_dims(A, -2) => A1的shape变为[4, 1, 2] B1 = np.expand_dims(B, 0) => B1的shape变为[1, 5, 2] A1 - B1 其他示例: wh = np.random.randint(1,3, size=(4,2)) np.expand_

  • JS中的回调函数实例浅析

    本文实例讲述了JS中的回调函数.分享给大家供大家参考,具体如下: 在说回调函数之前,不妨先看一段代码,相信有点js基础的同学都能明白他的含义: document.getElementById('demo').click=function(){ alert(1); }; 这段代码其实就是一段事件回调,这样写看的其实相对模糊一些,我们不妨看下接下来的代码 document.getElementById('demo').addEventListener('click',function(){ aler

  • 基于keras中训练数据的几种方式对比(fit和fit_generator)

    一.train_on_batch model.train_on_batch(batchX, batchY) train_on_batch函数接受单批数据,执行反向传播,然后更新模型参数,该批数据的大小可以是任意的,即,它不需要提供明确的批量大小,属于精细化控制训练模型,大部分情况下我们不需要这么精细,99%情况下使用fit_generator训练方式即可,下面会介绍. 二.fit model.fit(x_train, y_train, batch_size=32, epochs=10) fit的

  • keras中的History对象用法

    keras中的fit_generator和fit函数均返回History对象,那么History怎么用呢?事实上History对象已经记录了运行输出.在了解之前,我们甚至自己定义回调函数记录损失和准确率等. 相关keras源码位于网址: class History(Callback): """Callback that records events into a `History` object. This callback is automatically applied

  • python回调函数用法实例分析

    本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕 才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它 的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).回调和异步调用的关系非常紧密

  • Android编程之匿名内部类与回调函数用法分析

    本文实例讲述了Android编程之匿名内部类与回调函数用法.分享给大家供大家参考,具体如下: 我们Android开发中经常用到一些匿名内部类,及其其中的回调函数,例如,我们给Button设置监听器时候通常要实现OnCLickListener接口,并重写其中的Onclick()方法,这就是匿名内部类与回调函数,那么你对Java匿名内部类以及回调函数又理解多少呢?这篇文档给予比较详细的解释. 首先应该知道,内部类是JAVA语言的主要附加部分.内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同

  • Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 二.什么是回调: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用

  • JavaScript callback回调函数用法实例分析

    本文实例讲述了JavaScript callback回调函数用法.分享给大家供大家参考,具体如下: 在使用开源项目的时候经常会使用到回调函数,如果把回调函数弄清楚了,那么对我们深入了解开源项目会有很大帮助. 回调函数百度百科的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应.

随机推荐