最近遇到这个问题,上网查+问同学,基本解决方法:keras,Pipeline,TFrecord,批次读取训练
先看第一个,keras,可能需要改网络什么的,不太想改(先挖个坑,以后学一下keras,小白一只,勿怪)
第二个,pipeline,听起来高大上也很专业,上网搜罗了一堆资料:
https://www.cnblogs.com/zyly/p/8982335.html
https://blog.csdn.net/chenghtao/article/details/82110434
https://www.jianshu.com/go-wild?ac=2&url=http%3A%2F%2Fwiki.jikexueyuan.com%2Fproject%2Ftensorflow-zh%2Fhow_tos%2Fthreading_and_queues.html
http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/reading_data.html
https://www.jianshu.com/p/12b52e54a63c
https://blog.csdn.net/guo1988kui/article/details/83896745
https://blog.csdn.net/west_609/article/details/78608541
(但是有点复杂,难理解,先挖个坑,以后学一下)
第三个:
TFrecord
https://blog.csdn.net/chenghtao/article/details/82110434
问题描述:利用tensorflow进行神经网络训练,当数据集较小或者内存足够大时,通常的做法是将全部数据集加载到内存里,然后再将数据集分批feed给网络进行训练(一般配合yield使用效果更佳)。但是,当数据集大到内存不足以全部加载进来的时候,必须寻找新的加载数据的方法。
解决办法:
可以尝试使用tensorflow提供的队列queue,训练时从文件中分批读取数据。这里选择tensorflwo内定的标准格式TFRecord.
最后:在知乎上找到一个回答
https://zhuanlan.zhihu.com/p/35866604
解决思路其实说来也简单,打破思维定式就好了,不是把所有图片读到内存中,而是只把所有图片的路径一次性读到内存中。
大致的解决思路为:
将上万张图片的路径一次性读到内存中,自己实现一个分批读取函数,在该函数中根据自己的内存情况设置读取图片,只把这一批图片读入内存中,然后交给模型,模型再对这一批图片进行分批训练,因为内存一般大于等于显存,所以内存的批次大小和显存的批次大小通常不相同。