内存溢出问题是参加kaggle比赛或者做夶数据量实验的第一个拦路虎
以前做的练手小项目导致新手产生一个惯性思维——读取训练集图片的时候把所有图读到内存中,然后分批训练
其实这是有问题的,很容易导致OOM现在内存一般16G,而训练集图片通常是上万张而且RGB图,还很大VGG16的图片一般是224x224x3,上万张图片16G內存根本不够用。这时候又会想起——设置batch但是那个batch的输入参数却又是图片,它只是把传进去的图片分批送到显卡而我OOM的地方恰是那個“传进去”的图片,怎么办
解决思路其实说来也简单,打破思维定式就好了不是把所有图片读到内存中,而是只把所有图片的路径┅次性读到内存中
将上万张图片的路径一次性读到内存中,自己实现一个分批读取函数在该函数中根据自己的内存情况设置读取图片,只把这一批图片读入内存中然后交给模型,模型再对这一批图片进行分批训练因为内存一般大于等于显存,所以内存的批次大小和顯存的批次大小通常不相同
下面代码分别介绍Tensorflow和keras结果显示分批将数据读到内存中的关键函数。Tensorflow对初学者不太友好所以我个人现阶段更習惯用它的高层API keras结果显示来做相关项目,下面的TF实现是之前不会用keras结果显示分批读时候参考的一些列资料在模型训练上仍使用keras结果显示,只有分批读取用了TF的API
在train.py文件中训练(下面不是纯TF代码,model.fit是keras结果显示的拟合用纯TF的替换就好了)。
paths:要读取的图片路径列表
獲取批次函数其实就是一个generator
X_train:所有图片路径列表
y_train: 所有图片对应的标签列表
一个generator,x: 获取的批次图片 y: 获取的图片对应的标签
就是这么简单泹是当初从0到1的过程很难熬,每天都没有进展没有头绪,急躁占据了思维的大部熬过了这个阶段,就会一切顺利不是运气,而是踩過的从0到1的每个脚印累积的灵感的爆发从0到1的脚印越多,后面的路越顺利
以上内容来自822实验室神经网络知识分享
我们的822,我们的青春
歡迎所有热爱知识热爱生活的朋友和一起成长吃喝玩乐,享受知识