我是靠谱客的博主 细腻眼神,最近开发中收集的这篇文章主要介绍Keras如何应对无法一次性读入内存的大文件?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

对于很小的数据集来说, 我们可以直接读进内存来训练模型:

model.fit(x_train, y_train)

那么如果数据量太大, 比如几十G, 该怎么办呢?

什么是generator

好在Keras的fit函数支持了generator. 我们可以分batch读取文件来进行训练, 达到节省内存的目的.
网上很多介绍generator的文章都差不多过时了, 推荐python wiki.

简单来说, 就是可以定义一个函数, 每次调用返回不会停止程序, 而是返回中间结果, 下次调用的时候会继续运行循环. 比如我们可以定义这样的一个generator:

定义generator

def file_generator(x,y,batch_size):
    while i < size(x,0)-batch_size: # 数据被读完
          x_batch=x[i:i+batch_size] # 读batch_size个数据
          y_batch=y[i:i+batch_size]
          i=i+batch_size # 索引加batch_size
    yield x_batch,y_bacth # 返回一个batch

这样一个generator就定义好了. yield是至关重要的, 因为可以保证只返回中间结果而不停止程序. 我们可以利用下面的方式来检验:

检验generator

g=file_generator(x,y,5)
g.__next__()

可以看一下是否返回的是一个batch(5)个结果. 注意这里python 3的方法是__next__(), 而不是next()

使用generator

在实际使用中, generator要根据的需要进行修改, 比如:

def file_generator(x,y,batch_size):
    获取总数据量大小
    while i < 总数据量-batch_size: # 数据被读完
          从本地存储读入数据 # 比如音频, 图片, csv文件等
          处理数据 # 改变维度, 数据增强, 数据变换等
          x_batch=x[i:i+batch_size] # 读batch_size个数据
          y_batch=y[i:i+batch_size]
          i=i+batch_size # 索引加batch_size
          if i > 总数据量:
             i = 0 # 从头开始
    yield x_batch,y_bacth # 返回一个batch

在模型训练时使用:

model.fit(file_generator(x,y,batch_size), steps_per_epoch=360)

这里的steps_per_epoch非常重要, 等于 总 数 据 量 b a t c h _ s i z e frac{总数据量}{batch_size} batch_size的大小.因为keras不知道你的数据什么时候读完一遍, 所以你要告诉它读多少个batch之后完成了一个epoch, 然后再进入下一个batch. 否则generator会无限循环数据, 根本停不下来.

最后

以上就是细腻眼神为你收集整理的Keras如何应对无法一次性读入内存的大文件?的全部内容,希望文章能够帮你解决Keras如何应对无法一次性读入内存的大文件?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部