Keras之fit_generator与train_on_batch用法


Posted in Python onJune 17, 2020

关于Keras中,当数据比较大时,不能全部载入内存,在训练的时候就需要利用train_on_batch或fit_generator进行训练了。

两者均是利用生成器,每次载入一个batch-size的数据进行训练。

那么fit_generator与train_on_batch该用哪一个呢?

train_on_batch(self, x, y, class_weight=None, sample_weight=None)

fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose=1, callbacks=[], validation_data=None, nb_val_samples=None, class_weight=None, max_q_size=10)

推荐使用fit_generator,因为其同时可以设置 validation_data,但是采用train_on_batch也没什么问题,这个主要看个人习惯了,没有什么标准的答案。

下面是François Chollet fchollet本人给出的解答:

With fit_generator, you can use a generator for the validation data as well. In general I would recommend using fit_generator, but using train_on_batch works fine too. These methods only exist as for the sake of convenience in different use cases, there is no "correct" method.

补充知识:tf.keras中model.fit_generator()和model.fit()

首先Keras中的fit()函数传入的x_train和y_train是被完整的加载进内存的,当然用起来很方便,但是如果我们数据量很大,那么是不可能将所有数据载入内存的,必将导致内存泄漏,这时候我们可以用fit_generator函数来进行训练。

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

以给定数量的轮次(数据集上的迭代)训练模型。

参数

x: 训练数据的 Numpy 数组(如果模型只有一个输入), 或者是 Numpy 数组的列表(如果模型有多个输入)。 如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是 None(默认)。

y: 目标(标签)数据的 Numpy 数组(如果模型只有一个输出), 或者是 Numpy 数组的列表(如果模型有多个输出)。 如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是 None(默认)。

batch_size: 整数或 None。每次梯度更新的样本数。如果未指定,默认为 32。

epochs: 整数。训练模型迭代轮次。一个轮次是在整个 x 和 y 上的一轮迭代。 请注意,与 initial_epoch 一起,epochs 被理解为 「最终轮次」。模型并不是训练了 epochs 轮,而是到第 epochs 轮停止训练。

verbose: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。

callbacks: 一系列的 keras.callbacks.Callback 实例。一系列可以在训练时使用的回调函数。 详见 callbacks。

validation_split: 0 和 1 之间的浮点数。用作验证集的训练数据的比例。 模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。 验证数据是混洗之前 x 和y 数据的最后一部分样本中。

validation_data: 元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights), 用来评估损失,以及在每轮结束时的任何模型度量指标。 模型将不会在这个数据上进行训练。这个参数会覆盖 validation_split。

shuffle: 布尔值(是否在每轮迭代之前混洗数据)或者 字符串 (batch)。 batch 是处理 HDF5 数据限制的特殊选项,它对一个 batch 内部的数据进行混洗。 当 steps_per_epoch 非 None 时,这个参数无效。

class_weight: 可选的字典,用来映射类索引(整数)到权重(浮点)值,用于加权损失函数(仅在训练期间)。 这可能有助于告诉模型 「更多关注」来自代表性不足的类的样本。

sample_weight: 训练样本的可选 Numpy 权重数组,用于对损失函数进行加权(仅在训练期间)。 您可以传递与输入样本长度相同的平坦(1D)Numpy 数组(权重和样本之间的 1:1 映射), 或者在时序数据的情况下,可以传递尺寸为 (samples, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。 在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode=“temporal”。

initial_epoch: 整数。开始训练的轮次(有助于恢复之前的训练)。

steps_per_epoch: 整数或 None。 在声明一个轮次完成并开始下一个轮次之前的总步数(样品批次)。 使用 TensorFlow 数据张量等输入张量进行训练时,默认值 None 等于数据集中样本的数量除以 batch 的大小,如果无法确定,则为 1。

validation_steps: 只有在指定了 steps_per_epoch 时才有用。停止前要验证的总步数(批次样本)。

返回

一个 History 对象。其 History.history 属性是连续 epoch 训练损失和评估值,以及验证集损失和评估值的记录(如果适用)。

异常

fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)

使用 Python 生成器(或 Sequence 实例)逐批生成的数据,按批次训练模型。

生成器与模型并行运行,以提高效率。 例如,这可以让你在 CPU 上对图像进行实时数据增强,以在 GPU 上训练模型。

keras.utils.Sequence 的使用可以保证数据的顺序, 以及当 use_multiprocessing=True 时 ,保证每个输入在每个 epoch 只使用一次。

参数

generator: 一个生成器,或者一个 Sequence (keras.utils.Sequence) 对象的实例, 以在使用多进程时避免数据的重复。 生成器的输出应该为以下之一:

一个 (inputs, targets) 元组

一个 (inputs, targets, sample_weights) 元组。

这个元组(生成器的单个输出)组成了单个的 batch。 因此,这个元组中的所有数组长度必须相同(与这一个 batch 的大小相等)。 不同的 batch 可能大小不同。 例如,一个 epoch 的最后一个 batch 往往比其他 batch 要小, 如果数据集的尺寸不能被 batch size 整除。 生成器将无限地在数据集上循环。当运行到第 steps_per_epoch 时,记一个 epoch 结束。

steps_per_epoch: 在声明一个 epoch 完成并开始下一个 epoch 之前从 generator 产生的总步数(批次样本)。 它通常应该等于你的数据集的样本数量除以批量大小。 对于 Sequence,它是可选的:如果未指定,将使用len(generator) 作为步数。

epochs: 整数。训练模型的迭代总轮数。一个 epoch 是对所提供的整个数据的一轮迭代,如 steps_per_epoch 所定义。注意,与 initial_epoch 一起使用,epoch 应被理解为「最后一轮」。模型没有经历由 epochs 给出的多次迭代的训练,而仅仅是直到达到索引 epoch 的轮次。

verbose: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。

callbacks: keras.callbacks.Callback 实例的列表。在训练时调用的一系列回调函数。

validation_data: 它可以是以下之一:

验证数据的生成器或 Sequence 实例

一个 (inputs, targets) 元组

一个 (inputs, targets, sample_weights) 元组。

在每个 epoch 结束时评估损失和任何模型指标。该模型不会对此数据进行训练。

validation_steps: 仅当 validation_data 是一个生成器时才可用。 在停止前 generator 生成的总步数(样本批数)。 对于 Sequence,它是可选的:如果未指定,将使用 len(generator) 作为步数。

class_weight: 可选的将类索引(整数)映射到权重(浮点)值的字典,用于加权损失函数(仅在训练期间)。 这可以用来告诉模型「更多地关注」来自代表性不足的类的样本。

max_queue_size: 整数。生成器队列的最大尺寸。 如未指定,max_queue_size 将默认为 10。

workers: 整数。使用的最大进程数量,如果使用基于进程的多线程。 如未指定,workers 将默认为 1。如果为 0,将在主线程上执行生成器。

use_multiprocessing: 布尔值。如果 True,则使用基于进程的多线程。 如未指定, use_multiprocessing 将默认为 False。 请注意,由于此实现依赖于多进程,所以不应将不可传递的参数传递给生成器,因为它们不能被轻易地传递给子进程。

shuffle: 是否在每轮迭代之前打乱 batch 的顺序。 只能与 Sequence (keras.utils.Sequence) 实例同用。

initial_epoch: 开始训练的轮次(有助于恢复之前的训练)。

返回

一个 History 对象。其 History.history 属性是连续 epoch 训练损失和评估值,以及验证集损失和评估值的记录(如果适用)。

异常

ValueError: 如果生成器生成的数据格式不正确。

model.fit_generator(
  train_generator,
  steps_per_epoch=10, # 100
  validation_steps=1, # 50
  epochs=600, # 20个周期
  validation_data=validation_generator)

以上这篇Keras之fit_generator与train_on_batch用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Python实现简单多线程任务队列
Feb 27 Python
python获取list下标及其值的简单方法
Sep 12 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
python 利用opencv实现图像网络传输
Nov 12 Python
如何用python批量调整视频声音
Dec 22 Python
基于Keras的格式化输出Loss实现方式
Jun 17 #Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 #Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 #Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 #Python
Java如何基于wsimport调用wcf接口
Jun 17 #Python
使用keras内置的模型进行图片预测实例
Jun 17 #Python
Python虚拟环境库virtualenvwrapper安装及使用
Jun 17 #Python
You might like
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php函数连续调用实例分析
2015/07/30 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Prototype Number对象 学习
2009/07/19 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
wxPython之解决闪烁的问题
2018/01/15 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
Python登录系统界面实现详解
2019/06/25 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
大队委竞选演讲稿
2014/04/28 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android