虽然已经走在 torch boy 的路上了, 还是把碰到的这个坑给记录一下

  • 数据量较小时,我们可直接把整个数据集 load 到内存里,用 model.fit() 来拟合模型。
  • 当数据集过大比如几十个 G 时,内存撑不下,需要用 model.fit_generator 的方式来拟合。

model.fit_generator 一般参数的配置参考官方文档就好,其中 generator, workers, use_multiprocessing 的使用有一些坑存在。

workers=0, use_multiprocessing=False

此时 generator 用一个普通的 generator去提供数据即可,类似官方提供的这种

def generate_arrays_from_file(path):
while True:
with open(path) as f:
for line in f:
# create numpy arrays of input data
# and labels, from each line in the file
x1, x2, y = process_line(line)
yield ({'input_1': x1, 'input_2': x2}, {'output': y}) model.fit_generator(generate_arrays_from_file('/my_file.txt'),
steps_per_epoch=10000, epochs=10)

workers>0, use_multiprocessing=True

这时依然用一个 generator function 来做 generator在拟合的时候便会报错如下:

PicklingError: Can't pickle <function generator_queue.<locals>.data_generator_task at

且当 use_multiprocessing=True 时,如果你使用的是 generator function, 代码会把你的数据copy几份分给不同的worker去处理,但我们希望的是把一份数据平均分拆成几份给多个worker去处理。

怎么解决上面两个问题? keras.utils.Sequence 可以做到

很简单,继承 keras.utils.Sequence 这个类,重写自己的 len(), getitem 即可。

class SequenceData(Sequence):
def __init__(self, filePaths, batch_size):
self.filePaths = filePaths[:100].copy()
self.batch_size = batch_size
self.Y = self.getY() def __len__(self):
return len(self.Y) // self.batch_size def __getitem__(self, index):
batch_X = np.zeros((self.batch_size,) + IMG_DIMS, dtype='float32')
batch_Y_ = self.Y[index*self.batch_size: (index+1)*self.batch_size].copy()
batch_Y_.reset_index(drop=True, inplace=True)
assert batch_Y_.shape[0] == self.batch_size for index, rows in batch_Y_.iterrows():
try:
img = _load_img(rows['path'])
batch_X[index, :, :, :] = img.copy()
batch_Y_.loc[index, 'valid'] = 1
except:
batch_Y_.loc[index, 'valid'] = 0
traceback.print_exc()
batch_Y = to_categorical(batch_Y_['label'], classes_num)
return batch_X, batch_Y def __iter__(self):
for item in (self[i] for i in range(len(self))):
yield item def getY(self):
Y = pd.DataFrame(self.filePaths, columns=['path'])
Y['class'] = Y['path'].apply(lambda x: path2class(x))
Y['label'] = Y['class'].apply(lambda x: class2label[x])
Y = Y.sample(frac=1).reset_index(drop=True)
return Y

效果比较

  • 样本量:1000张图片
  • 模型: MobileNetV2
  • epochs: 5
  • CPU: 4核,3.4GHz
  • GPU: None

可能数据量过小,并行的效果不是太明显。

数据读取方式 workers use_multiprocessing 耗时/s
内存读取 0 True 1797
keras.utils.Sequence 0 False 1475
keras.utils.Sequence 4 True

参考:

keras fit_generator 并行的更多相关文章

  1. keras 入门整理 如何shuffle,如何使用fit_generator 整理合集

    keras入门参考网址: 中文文档教你快速建立model keras不同的模块-基本结构的简介-类似xmind整理 Keras的基本使用(1)--创建,编译,训练模型 Keras学习笔记(完结) ke ...

  2. (转)The AlphaGo Replication Wiki

    The AlphaGo Replication Wiki 摘自:https://github.com/Rochester-NRT/RocAlphaGo/wiki/01.-Home Contents : ...

  3. 『计算机视觉』Mask-RCNN_训练网络其三:训练Model

    Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』M ...

  4. [Tensorflow] 使用 Mask_RCNN 完成目标检测与实例分割,同时输出每个区域的 Feature Map

    Mask_RCNN-2.0 网页链接:https://github.com/matterport/Mask_RCNN/releases/tag/v2.0 Mask_RCNN-master(matter ...

  5. keras系列︱利用fit_generator最小化显存占用比率/数据Batch化

    本文主要参考两篇文献: 1.<深度学习theano/tensorflow多显卡多人使用问题集> 2.基于双向LSTM和迁移学习的seq2seq核心实体识别 运行机器学习算法时,很多人一开始 ...

  6. keras 学习笔记(一) ——— model.fit & model.fit_generator

    from keras.preprocessing.image import load_img, img_to_array a = load_img('1.jpg') b = img_to_array( ...

  7. [TensorFlow 2] [Keras] fit()、fit_generator() 和 train_on_batch() 分析与应用

    前言 是的,除了水报错文,我也来写点其他的.本文主要介绍Keras中以下三个函数的用法: fit()fit_generator()train_on_batch()当然,与上述三个函数相似的evalua ...

  8. keras训练函数fit和fit_generator对比,图像生成器ImageDataGenerator数据增强

    1. [深度学习] Keras 如何使用fit和fit_generator https://blog.csdn.net/zwqjoy/article/details/88356094 ps:解决样本数 ...

  9. Keras函数——mode.fit_generator()

    1 model.fit_generator(self,generator, steps_per_epoch, epochs=1, verbose=1, callbacks=None, validati ...

随机推荐

  1. 【Linux】rsync模板配置问题

    ------------------------------------------------------------------------------------------------- | ...

  2. 【Linux】关于CentOS系统中,文件权限第11位上是一个点的解读

    ------------------------------------------------------------------------------------------------- | ...

  3. 19.java设计模式之备忘录模式

    基本需求 游戏的角色有攻击力和防御力,在大战Boss之前保存自身的状态(攻击力和防御力),当大战Boss之后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 传统方案 一个对象,就对应一个保存对象状 ...

  4. ctfhub技能树—文件上传—00截断

    什么是00截断 相关教程:http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88 ...

  5. C# 请求被中止: 未能创建 SSL/TLS 安全通道。 设置SecurityProtocol无效

    今天为了获取一张图片,用了一段代码: ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateV ...

  6. SpringBoot 好“吃”的启动原理

    原创:西狩 编写日期 / 修订日期:2020-12-30 / 2020-12-30 版权声明:本文为博主原创文章,遵循 CC BY-SA-4.0 版权协议,转载请附上原文出处链接和本声明. 不正经的前 ...

  7. Py编程方法,尾递归优化,map函数,filter函数,reduce函数

    函数式编程 1.面向过程 把大的问题分解成流程,按照流程来编写过程 2.面向函数 面向函数编程=编程语言定义的函数+数学意义上的函数先弄出数学意义上的方程式,再用编程方法编写这个数学方程式注意面向函数 ...

  8. 使用EFCore连接Oracle数据库时出现的问题

    问题 System.TypeLoadException: Method 'Create' in type 'Oracle.EntityFrameworkCore.Infrastructure.Inte ...

  9. Python+Selenium+Unittest实现PO模式web自动化框架(5)

    1.PageObjects目录下的模块 该目录下是存放各页面功能点. 比如:login_page.py模块下就是存放登录页面上的各个功能点的.(登录功能.获取登录失败的提示信息) # --^_^-- ...

  10. nginx http模块开发入门

    导语 本文对nginx http模块开发需要掌握的一些关键点进行了提炼,同时以开发一个简单的日志模块进行讲解,让nginx的初学者也能看完之后做到心里有谱.本文只是一个用作入门的概述. 目录 背景 主 ...