利用 train_on_batch 精细管理训练过程
大部分使用 keras 的同学使用 fit() 或者 fit_generator() 进行模型训练, 这两个 api 对于刚接触深度学习的同学非常友好和方便,但是由于其是非常深度的封装,对于希望自定义训练过程的同学就显得不是那么方便(从 torch 转 keras 的同学可能更喜欢自定义训练过程),而且,对于 GAN 这种需要分步进行训练的模型,也无法直接使用 fit 或者 fit_generator 直接训练的。因此,keras 提供了 train_on_batch 这个 api,对一个 mini-batch 的数据进行梯度更新。
总结优点如下:
- 更精细自定义训练过程,更精准的收集 loss 和 metrics
- 分步训练模型-GAN的实现
- 多GPU训练保存模型更加方便
- 更多样的数据加载方式,结合 torch dataloader 的使用
下面介绍 train_on_batch 的使用
1. train_on_batch 的输入输出
1.1 输入
y_pred = Model.train_on_batch(
x,
y=None,
sample_weight=None,
class_weight=None,
reset_metrics=True,
return_dict=False,
)
- x:模型输入,单输入就是一个 numpy 数组, 多输入就是 numpy 数组的列表
- y:标签,单输出模型就是一个 numpy 数组, 多输出模型就是 numpy 数组列表
- sample_weight:mini-batch 中每个样本对应的权重,形状为 (batch_size)
- class_weight:类别权重,作用于损失函数,为各个类别的损失添加权重,主要用于类别不平衡的情况, 形状为 (num_classes)
- reset_metrics:默认True,返回的metrics只针对这个mini-batch, 如果False,metrics 会跨批次累积
- return_dict:默认 False, y_pred 为一个列表,如果 True 则 y_pred 是一个字典
1.2 输出
- 单输出模型,1个loss,没有metrics,train_on_batch 返回一个标量,代表这个 mini-batch 的 loss, 例如
model = keras.models.Model(inputs=inputs, outputs=outputs)
model.compile(Adam, loss=['binary_crossentropy'])
y_pred = model.train_on_batch(x=image,y=label)
# y_pred 为标量
- 单输出模型,有1个loss,n个metrics,train_on_batch 返回一个列表, 列表长度为 1+n, 例如
model = keras.models.Model(inputs=inputs, outputs=outputs)
model.compile(Adam, loss=['binary_crossentropy'], metrics=['accuracy'])
y_pred = model.train_on_batch(x=image,y=label)