概述
对于很小的数据集来说, 我们可以直接读进内存来训练模型:
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如何应对无法一次性读入内存的大文件?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复