深度学习入门笔记(十二):深度学习数据读取
歡迎關(guān)注WX公眾號(hào):【程序員管小亮】
專欄——深度學(xué)習(xí)入門筆記
聲明
1)該文章整理自網(wǎng)上的大牛和機(jī)器學(xué)習(xí)專家無(wú)私奉獻(xiàn)的資料,具體引用的資料請(qǐng)看參考文獻(xiàn)。
2)本文僅供學(xué)術(shù)交流,非商用。所以每一部分具體的參考資料并沒(méi)有詳細(xì)對(duì)應(yīng)。如果某部分不小心侵犯了大家的利益,還望海涵,并聯(lián)系博主刪除。
3)博主才疏學(xué)淺,文中如有不當(dāng)之處,請(qǐng)各位指出,共同進(jìn)步,謝謝。
4)此屬于第一版本,若有錯(cuò)誤,還需繼續(xù)修正與增刪。還望大家多多指點(diǎn)。大家都共享一點(diǎn)點(diǎn),一起為祖國(guó)科研的推進(jìn)添磚加瓦。
文章目錄
- 歡迎關(guān)注WX公眾號(hào):【程序員管小亮】
- 專欄——深度學(xué)習(xí)入門筆記
- 聲明
- 深度學(xué)習(xí)入門筆記(十一):深度學(xué)習(xí)數(shù)據(jù)讀取
- 1、Mini-batch 梯度下降
- 2、數(shù)據(jù)讀取之 h5py
- 3、數(shù)據(jù)讀取之 TFRecords
- 4、六種 Python 圖像庫(kù)讀取
- 推薦閱讀
- 參考文章
深度學(xué)習(xí)入門筆記(十一):深度學(xué)習(xí)數(shù)據(jù)讀取
1、Mini-batch 梯度下降
機(jī)器學(xué)習(xí)的應(yīng)用是一個(gè)高度依賴經(jīng)驗(yàn)的過(guò)程,伴隨著大量迭代的過(guò)程,需要訓(xùn)練諸多模型,才能找到合適的那一個(gè),所以,優(yōu)化算法能夠幫助你快速訓(xùn)練模型。
其中一個(gè)難點(diǎn)在于,雖然深度學(xué)習(xí)在大數(shù)據(jù)領(lǐng)域的效果不錯(cuò),但是如果利用一個(gè)巨大的數(shù)據(jù)集來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)的話,訓(xùn)練速度往往很慢,比如我現(xiàn)在跑一次訓(xùn)練,需要一天一夜。。。因此,你會(huì)發(fā)現(xiàn),使用快速的、好用的優(yōu)化算法,能夠大大提高你和團(tuán)隊(duì)或者實(shí)驗(yàn)室的效率。
那么,首先來(lái)談?wù)?mini-batch 梯度下降法,這應(yīng)該是大部分人第一個(gè)學(xué)習(xí)的數(shù)據(jù)讀取方式。
之前學(xué)過(guò),向量化(深度學(xué)習(xí)入門筆記(四):向量化)能夠有效地對(duì)所有 mmm 個(gè)樣本進(jìn)行計(jì)算,允許處理整個(gè)訓(xùn)練集,而無(wú)需某個(gè)明確的公式。所以如果要把訓(xùn)練樣本放大巨大的矩陣 XXX 當(dāng)中去,X=[x(1)x(2)x(3)……x(m)]X= \lbrack x^{(1)}\ x^{(2)}\ x^{(3)}\ldots\ldots x^{(m)}\rbrackX=[x(1)?x(2)?x(3)……x(m)],YYY 也是如此,Y=[y(1)y(2)y(3)……y(m)]Y= \lbrack y^{(1)}\ y^{(2)}\ y^{(3)}\ldots \ldots y^{(m)}\rbrackY=[y(1)?y(2)?y(3)……y(m)],所以 XXX 的維數(shù)是 (nx,m)(n_{x},m)(nx?,m),YYY 的維數(shù)是 (1,m)(1,m)(1,m)。
向量化能夠相對(duì)較快地處理所有 mmm 個(gè)樣本。但是如果 mmm 很大的話,處理速度仍然緩慢。比如,mmm 是500萬(wàn)或5000萬(wàn)或者更大的一個(gè)數(shù),在對(duì)整個(gè)訓(xùn)練集執(zhí)行梯度下降法時(shí),你要做的是,必須處理整個(gè)訓(xùn)練集,然后才能進(jìn)行一步梯度下降法,然而這個(gè)時(shí)候你需要再重新處理500萬(wàn)個(gè)訓(xùn)練樣本,才能進(jìn)行下一步梯度下降法,所以如果在處理完整個(gè)500萬(wàn)個(gè)樣本的訓(xùn)練集之前,先讓梯度下降法處理一部分,算法的速度會(huì)不會(huì)更快?準(zhǔn)確地說(shuō),這是你可以做的一些事情!
我們可以把訓(xùn)練集分割為小一點(diǎn)的子集訓(xùn)練,這些子集被取名為 mini-batch,假設(shè)每一個(gè)子集中只有1000個(gè)樣本,那么把其中的 x(1)x^{(1)}x(1) 到 x(1000)x^{(1000)}x(1000) 取出來(lái),將其稱為第一個(gè)子訓(xùn)練集,也叫做 mini-batch,然后再取出接下來(lái)的1000個(gè)樣本,從 x(1001)x^{(1001)}x(1001) 到 x(2000)x^{(2000)}x(2000),然后再取1000個(gè)樣本,…以此類推。
接下來(lái)把 x(1)x^{(1)}x(1) 到 x(1000)x^{(1000)}x(1000) 稱為 X{1}X^{\{1\}}X{1},x(1001)x^{(1001)}x(1001) 到 x(2000)x^{(2000)}x(2000) 稱為 X{2}X^{\{2\}}X{2},等等…如果訓(xùn)練樣本一共有500萬(wàn)個(gè),每個(gè) mini-batch 都有1000個(gè)樣本,也就是說(shuō),你有5000個(gè) mini-batch,因?yàn)?000乘以1000就是5000萬(wàn)。有5000個(gè) mini-batch,就意味著最后得到的是 X{5000}X^{\left\{ 5000 \right\}}X{5000}。
對(duì) YYY 也要進(jìn)行相同處理,也要相應(yīng)地拆分 YYY 的訓(xùn)練集,所以這是 Y{1}Y^{\{1\}}Y{1},然后從 y(1001)y^{(1001)}y(1001) 到 y(2000)y^{(2000)}y(2000),這個(gè)叫 Y{2}Y^{\{2\}}Y{2},一直到 Y{5000}Y^{\{ 5000\}}Y{5000}。
mini-batch 的數(shù)量 ttt 組成了 X{t}X^{\{ t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t},這就是1000個(gè)訓(xùn)練樣本,包含相應(yīng)的輸入輸出對(duì)。
來(lái)一起確定一下符號(hào),x(i)x^{(i)}x(i) 是第 iii 個(gè)訓(xùn)練樣本,z[l]z^{\lbrack l\rbrack}z[l] 表示神經(jīng)網(wǎng)絡(luò)中第 lll 層的 zzz 值,大括號(hào) t{t}t 代表不同的 mini-batch。如果 X{1}X^{\{1\}}X{1} 是一個(gè)有1000個(gè)樣本的訓(xùn)練集,或者說(shuō)是1000個(gè)樣本的 xxx 值,所以維數(shù)應(yīng)該是 (nx,1000)(n_{x},1000)(nx?,1000),X{2}X^{\{2\}}X{2} 的維數(shù)應(yīng)該是 (nx,1000)(n_{x},1000)(nx?,1000),以此類推,所有的子集維數(shù)都是 (nx,1000)(n_{x},1000)(nx?,1000),而這些(Y{t}Y^{\{ t\}}Y{t})的維數(shù)都是 (1,1000)(1,1000)(1,1000)。
其實(shí)這個(gè)詞有一點(diǎn)拗口,不過(guò)如果你了解了意思之后,就明白這個(gè)詞的作用了。
batch 是批量的意思,mini 就是小的意思,現(xiàn)在再來(lái)解釋一下這個(gè)算法的名稱,batch 梯度下降法指的是之前講過(guò)的梯度下降法算法,就是同時(shí)處理整個(gè)訓(xùn)練集,這個(gè)名字就是來(lái)源于能夠同時(shí)看到整個(gè) batch 訓(xùn)練集的樣本被處理,這個(gè)名字不怎么樣,但就是這樣叫它,所以記住就行。相比之下,mini-batch 梯度下降法,指的是每次同時(shí)處理的單個(gè)的 mini-batch X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{ t\}}Y{t},而不是同時(shí)處理全部的 XXX 和 YYY 訓(xùn)練集,也就是小批量數(shù)據(jù)的梯度下降法。
那么究竟 mini-batch 梯度下降法的原理是什么?
在訓(xùn)練集上運(yùn)行 mini-batch 梯度下降法,你運(yùn)行 for t=1……5000,因?yàn)橛?000個(gè)各有1000個(gè)樣本的組,在 for 循環(huán)里要做得基本就是對(duì) X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} 執(zhí)行一步梯度下降法,就好比現(xiàn)在有一個(gè)擁有1000個(gè)樣本的訓(xùn)練集,而且假設(shè)你已經(jīng)很熟悉一次性處理完的方法,要用向量化去一次性處理1000個(gè)樣本,這就是其中一個(gè)過(guò)程,然后共計(jì)執(zhí)行5000次,這樣就算是完成了一個(gè) mini-batch。
現(xiàn)在你應(yīng)該大概了解了什么是 mini-batch,我們來(lái)詳細(xì)地說(shuō)一下整個(gè)過(guò)程。
首先對(duì)輸入也就是 X{t}X^{\{ t\}}X{t},執(zhí)行前向傳播,然后執(zhí)行 z[1]=W[1]X+b[1]z^{\lbrack 1\rbrack} =W^{\lbrack 1\rbrack}X + b^{\lbrack 1\rbrack}z[1]=W[1]X+b[1],之前只有一個(gè)數(shù)據(jù),但是現(xiàn)在正在處理整個(gè)訓(xùn)練集,即第一個(gè) mini-batch,故 XXX 變成了 X{t}X^{\{ t\}}X{t},即 z[1]=W[1]X{t}+b[1]z^{\lbrack 1\rbrack} = W^{\lbrack 1\rbrack}X^{\{ t\}} + b^{\lbrack1\rbrack}z[1]=W[1]X{t}+b[1],然后執(zhí)行 A[1]k=g[1](Z[1])A^{[1]k} =g^{[1]}(Z^{[1]})A[1]k=g[1](Z[1]),之所以用大寫的 ZZZ 是因?yàn)檫@是一個(gè)向量?jī)?nèi)涵,…以此類推,直到 A[L]=g[L](Z[L])A^{\lbrack L\rbrack} = g^{\left\lbrack L \right\rbrack}(Z^{\lbrack L\rbrack})A[L]=g[L](Z[L]),這就是網(wǎng)絡(luò)的輸出,即模型的預(yù)測(cè)值。注意這里需要用到一個(gè)向量化的執(zhí)行命令,是一次性處理1000個(gè)而不是500萬(wàn)個(gè)數(shù)據(jù)樣本。接下來(lái)計(jì)算損失成本函數(shù) JJJ,因?yàn)樽蛹?guī)模是1000,J=11000∑i=1lL(y^(i),y(i))J= \frac{1}{1000}\sum_{i = 1}^{l}{L(\hat y^{(i)},y^{(i)})}J=10001?∑i=1l?L(y^?(i),y(i)),說(shuō)明一下,這(L(y^(i),y(i))L(\hat y^{(i)},y^{(i)})L(y^?(i),y(i)))指的是來(lái)自于 mini-batchX{t}X^{\{ t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} 中的樣本,這一塊一定不要弄混了,是完成一個(gè) batch 內(nèi)的數(shù)據(jù)訓(xùn)練過(guò)程,即1000。
如果用到了正則化(深度學(xué)習(xí)入門筆記(十):正則化),J=11000∑i=1lL(y^(i),y(i))+λ21000∑l∣∣w[l]∣∣F2J =\frac{1}{1000}\sum_{i = 1}^{l}{L(\hat y^{(i)},y^{(i)})} +\frac{\lambda}{2 1000}\sum_{l}^{}{||w^{[l]}||}_{F}^{2}J=10001?∑i=1l?L(y^?(i),y(i))+21000λ?∑l?∣∣w[l]∣∣F2?,因?yàn)檫@是一個(gè) mini-batch 的損失,所以將 JJJ 損失記為上角標(biāo) ttt,放在大括號(hào)里(J{t}=11000∑i=1lL(y^(i),y(i))+λ21000∑l∣∣w[l]∣∣F2J^{\{t\}} = \frac{1}{1000}\sum_{i = 1}^{l}{L(\hat y^{(i)},y^{(i)})} +\frac{\lambda}{2 1000}\sum_{l}^{}{||w^{[l]}||}_{F}^{2}J{t}=10001?∑i=1l?L(y^?(i),y(i))+21000λ?∑l?∣∣w[l]∣∣F2?)。到這里了,你應(yīng)該會(huì)注意到,我們做的一切都是那么的似曾相識(shí),其實(shí)跟之前執(zhí)行梯度下降法如出一轍,除了現(xiàn)在的對(duì)象不是 X?X?X?,Y?Y?Y?,而是 X{t}?X^{\{t\}}?X{t}? 和 Y{t}?Y^{\{ t\}}?Y{t}?。
接下來(lái),執(zhí)行反向傳播來(lái)計(jì)算 J{t}?J^{\{t\}}?J{t}? 的梯度,只是使用 X{t}?X^{\{ t\}}?X{t}? 和 Y{t}?Y^{\{t\}}?Y{t}?,然后更新加權(quán)值,W?W?W? 實(shí)際上是 W[l]?W^{\lbrack l\rbrack}?W[l]?,更新為 W[l]:=W[l]?adW[l]?W^{[l]}:= W^{[l]} - adW^{[l]}?W[l]:=W[l]?adW[l]?,對(duì) b?b?b? 做相同處理,b[l]:=b[l]?adb[l]?b^{[l]}:= b^{[l]} - adb^{[l]}?b[l]:=b[l]?adb[l]?。這是使用 mini-batch 梯度下降法訓(xùn)練樣本的一步,寫下的代碼也可被稱為進(jìn)行 一代(1 epoch) 的訓(xùn)練,一代的意思是只是一次遍歷了訓(xùn)練集。
使用 batch 梯度下降法,一次遍歷訓(xùn)練集只能讓你做一個(gè)梯度下降,使用 mini-batch 梯度下降法,一次遍歷訓(xùn)練集,能讓你做5000個(gè)梯度下降。mini-batch 梯度下降法比 batch 梯度下降法運(yùn)行地更快,所以幾乎每個(gè)研習(xí)深度學(xué)習(xí)的人在訓(xùn)練巨大的數(shù)據(jù)集時(shí)都會(huì)用到,希望你可以好好理解理解。
2、數(shù)據(jù)讀取之 h5py
HDF(Hierarchical Data Format)指一種為存儲(chǔ)和處理大容量科學(xué)數(shù)據(jù)設(shè)計(jì)的文件格式及相應(yīng)庫(kù)文件。其中當(dāng)前比較流行的版本是 HDF5。它擁有一系列的優(yōu)異特性,使其特別適合進(jìn)行大量科學(xué)數(shù)據(jù)的存儲(chǔ)和操作,如支持非常多的數(shù)據(jù)類型,靈活,通用,跨平臺(tái),可擴(kuò)展,高效的 I/O 性能,支持幾乎無(wú)限量(高達(dá) EB)的單文件存儲(chǔ)等,詳見其官方介紹:https://support.hdfgroup.org/HDF5/ 。
HDF5 三大要素:
- hdf5 files: 能夠存儲(chǔ)兩類數(shù)據(jù)對(duì)象 dataset 和 group 的容器,其操作類似 python 標(biāo)準(zhǔn)的文件操作;File 實(shí)例對(duì)象本身就是一個(gè)組,以 / 為名,是遍歷文件的入口
- dataset(array-like): 可類比為 Numpy 數(shù)組,每個(gè)數(shù)據(jù)集都有一個(gè)名字(name)、形狀(shape) 和類型(dtype),支持切片操作
- group(folder-like): 可以類比為 字典,它是一種像文件夾一樣的容器;group 中可以存放 dataset 或者其他的 group,鍵就是組成員的名稱,值就是組成員對(duì)象本身(組或者數(shù)據(jù)集)
Python 中有一系列的工具可以操作和使用 HDF5 數(shù)據(jù),其中最常用的是 h5py 和 PyTables。目前比較火熱的pytorch就可以使用 h5py 進(jìn)行數(shù)據(jù)的讀取,這樣相較于 minibatch 也會(huì)更好。
入門的建議博客是這個(gè)——深度學(xué)習(xí)之10分鐘入門h5py,如果你比較迷惑的話,就把它當(dāng)成是一個(gè)存儲(chǔ)數(shù)據(jù)的工具即可,可以類比于Excel表格存儲(chǔ)數(shù)據(jù)一樣。
3、數(shù)據(jù)讀取之 TFRecords
關(guān)于 TensorFlow 讀取數(shù)據(jù)的方法,官網(wǎng)給出了三種方法:
- 供給數(shù)據(jù): 在 TensorFlow 程序運(yùn)行的每一步,讓 Python 代碼來(lái)供給數(shù)據(jù)。
- 從文件讀取數(shù)據(jù): 在 TensorFlow 圖的起始,建立一個(gè)輸入管線從文件中讀取數(shù)據(jù)。
- 預(yù)加載數(shù)據(jù): 在 TensorFlow 圖中定義常量或變量來(lái)保存所有數(shù)據(jù)(僅適用于數(shù)據(jù)量比較小的情況)。
輸入數(shù)據(jù)集一般被存儲(chǔ)在各種類型的文件系統(tǒng)中,根據(jù)文件系統(tǒng)類型和輸入數(shù)據(jù)集大小,有兩種不同的數(shù)據(jù)讀取方法:
- 大數(shù)據(jù)集(如 ImageNet )一般由大量數(shù)據(jù)文件構(gòu)成,因?yàn)閿?shù)據(jù)規(guī)模太大,所以無(wú)法一次性全部加載到內(nèi)存中,因?yàn)樘膬?nèi)存,這個(gè)時(shí)候最好使用 TensorFlow 提供的隊(duì)列 queue ,也就是第二種方法從文件讀取數(shù)據(jù)。
- 小數(shù)據(jù)集(如 MNIST )可能僅包含一個(gè)文件,因此用戶可以在模型訓(xùn)練開始前一次性地將其加載到內(nèi)存處理,然后再分batch 輸入網(wǎng)絡(luò)進(jìn)行訓(xùn)練,也就是第三種方法預(yù)加載數(shù)據(jù)。
小數(shù)據(jù)集時(shí)多采用 minibatch,而大數(shù)據(jù)集時(shí)則多采用 TFRecords 格式。
入門的建議是這個(gè)博客——TensorFlow學(xué)習(xí)筆記之30分鐘學(xué)會(huì) TFRecords 格式高效處理數(shù)據(jù),如果你還是很迷糊的話,只要記得 TFRecords 格式和 h5py 格式是類似的效用即可。
4、六種 Python 圖像庫(kù)讀取
主流Python圖像庫(kù)有:
opencv——cv2.imread
OpenCV 作為最常用的圖像處理庫(kù),實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法,可以說(shuō)是很全面和強(qiáng)大了。如果你只想掌握一個(gè)圖像庫(kù)的話,OpenCV 是你的最佳選擇。
PIL——PIL.Image.open
PIL 即 Python Imaging Library,也即為我們所稱的 Pillow,已經(jīng)是 python 平臺(tái)事實(shí)上的圖像處理標(biāo)準(zhǔn)庫(kù)了。PIL 功能非常強(qiáng)大,但 API 卻非常簡(jiǎn)單易用。它比 OpenCV 更為輕巧,正因如此,它深受大眾的喜愛。
matplotlib——matplotlib.image.imread
Matplotlib 是 python 的 2D 繪圖庫(kù),它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。
scipy.misc——scipy.misc.imread
Scipy 是一個(gè) python 中用于進(jìn)行科學(xué)計(jì)算的工具集,有很多功能,如計(jì)算機(jī)統(tǒng)計(jì)學(xué)分布、信號(hào)處理、計(jì)算線性代數(shù)方程等。
skimage——skimage.io.imread
skimage 對(duì) scipy.ndimage 進(jìn)行了擴(kuò)展,提供了更多的圖片處理功能,是基于 python 腳本語(yǔ)言開發(fā)的數(shù)字圖片處理包。
Tensorflow——tf.image.decode
tf.image.decode 函數(shù)可以對(duì)圖像進(jìn)行很多操作,如放大縮小,旋轉(zhuǎn),平移,等等。
詳細(xì)的實(shí)例和代碼可以看這個(gè)博客——你不能不知道的六種 Python 圖像庫(kù)的圖片讀取方法總結(jié)。
推薦閱讀
- 深度學(xué)習(xí)入門筆記(一):深度學(xué)習(xí)引言
- 深度學(xué)習(xí)入門筆記(二):神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
- 深度學(xué)習(xí)入門筆記(三):求導(dǎo)和計(jì)算圖
- 深度學(xué)習(xí)入門筆記(四):向量化
- 深度學(xué)習(xí)入門筆記(五):神經(jīng)網(wǎng)絡(luò)的編程基礎(chǔ)
- 深度學(xué)習(xí)入門筆記(六):淺層神經(jīng)網(wǎng)絡(luò)
- 深度學(xué)習(xí)入門筆記(七):深層神經(jīng)網(wǎng)絡(luò)
- 深度學(xué)習(xí)入門筆記(八):深層網(wǎng)絡(luò)的原理
- 深度學(xué)習(xí)入門筆記(九):深度學(xué)習(xí)數(shù)據(jù)處理
- 深度學(xué)習(xí)入門筆記(十):正則化
- 深度學(xué)習(xí)入門筆記(十一):權(quán)重初始化
- 深度學(xué)習(xí)入門筆記(十二):深度學(xué)習(xí)數(shù)據(jù)讀取
- 深度學(xué)習(xí)入門筆記(十三):批歸一化(Batch Normalization)
- 深度學(xué)習(xí)入門筆記(十四):Softmax
- 深度學(xué)習(xí)入門筆記(十五):深度學(xué)習(xí)框架(TensorFlow和Pytorch之爭(zhēng))
- 深度學(xué)習(xí)入門筆記(十六):計(jì)算機(jī)視覺(jué)之邊緣檢測(cè)
- 深度學(xué)習(xí)入門筆記(十七):深度學(xué)習(xí)的極限在哪?
- 深度學(xué)習(xí)入門筆記(十八):卷積神經(jīng)網(wǎng)絡(luò)(一)
- 深度學(xué)習(xí)入門筆記(十九):卷積神經(jīng)網(wǎng)絡(luò)(二)
- 深度學(xué)習(xí)入門筆記(二十):經(jīng)典神經(jīng)網(wǎng)絡(luò)(LeNet-5、AlexNet和VGGNet)
參考文章
- 吳恩達(dá)——《神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)》視頻課程
總結(jié)
以上是生活随笔為你收集整理的深度学习入门笔记(十二):深度学习数据读取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TensorFlow 2官方教程 . K
- 下一篇: 深度学习入门笔记(六):浅层神经网络