最近遇到這個問題,上網查+問同學,基本解決方法: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
解決思路其實說來也簡單,打破思維定式就好了,不是把所有圖片讀到內存中,而是只把所有圖片的路徑一次性讀到內存中。
大致的解決思路為:
將上萬張圖片的路徑一次性讀到內存中,自己實現一個分批讀取函數,在該函數中根據自己的內存情況設置讀取圖片,只把這一批圖片讀入內存中,然后交給模型,模型再對這一批圖片進行分批訓練,因為內存一般大於等於顯存,所以內存的批次大小和顯存的批次大小通常不相同。