日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习入门笔记(十二):深度学习数据读取

發布時間:2023/12/14 pytorch 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习入门笔记(十二):深度学习数据读取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎關注WX公眾號:【程序員管小亮】

專欄——深度學習入門筆記

聲明

1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬于第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。

文章目錄

  • 歡迎關注WX公眾號:【程序員管小亮】
    • 專欄——深度學習入門筆記
    • 聲明
    • 深度學習入門筆記(十一):深度學習數據讀取
      • 1、Mini-batch 梯度下降
      • 2、數據讀取之 h5py
      • 3、數據讀取之 TFRecords
      • 4、六種 Python 圖像庫讀取
    • 推薦閱讀
    • 參考文章

深度學習入門筆記(十一):深度學習數據讀取

1、Mini-batch 梯度下降


機器學習的應用是一個高度依賴經驗的過程,伴隨著大量迭代的過程,需要訓練諸多模型,才能找到合適的那一個,所以,優化算法能夠幫助你快速訓練模型。

其中一個難點在于,雖然深度學習在大數據領域的效果不錯,但是如果利用一個巨大的數據集來訓練神經網絡的話,訓練速度往往很慢,比如我現在跑一次訓練,需要一天一夜。。。因此,你會發現,使用快速的、好用的優化算法,能夠大大提高你和團隊或者實驗室的效率。

那么,首先來談談 mini-batch 梯度下降法,這應該是大部分人第一個學習的數據讀取方式。

之前學過,向量化(深度學習入門筆記(四):向量化)能夠有效地對所有 mmm 個樣本進行計算,允許處理整個訓練集,而無需某個明確的公式。所以如果要把訓練樣本放大巨大的矩陣 XXX 當中去,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 的維數是 (nx,m)(n_{x},m)(nx?,m)YYY 的維數是 (1,m)(1,m)(1,m)

向量化能夠相對較快地處理所有 mmm 個樣本。但是如果 mmm 很大的話,處理速度仍然緩慢。比如,mmm 是500萬或5000萬或者更大的一個數,在對整個訓練集執行梯度下降法時,你要做的是,必須處理整個訓練集,然后才能進行一步梯度下降法,然而這個時候你需要再重新處理500萬個訓練樣本,才能進行下一步梯度下降法,所以如果在處理完整個500萬個樣本的訓練集之前,先讓梯度下降法處理一部分,算法的速度會不會更快?準確地說,這是你可以做的一些事情!

我們可以把訓練集分割為小一點的子集訓練,這些子集被取名為 mini-batch,假設每一個子集中只有1000個樣本,那么把其中的 x(1)x^{(1)}x(1)x(1000)x^{(1000)}x(1000) 取出來,將其稱為第一個子訓練集,也叫做 mini-batch,然后再取出接下來的1000個樣本,從 x(1001)x^{(1001)}x(1001)x(2000)x^{(2000)}x(2000),然后再取1000個樣本,…以此類推。

接下來把 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},等等…如果訓練樣本一共有500萬個,每個 mini-batch 都有1000個樣本,也就是說,你有5000個 mini-batch,因為5000乘以1000就是5000萬。有5000個 mini-batch,就意味著最后得到的是 X{5000}X^{\left\{ 5000 \right\}}X{5000}

YYY 也要進行相同處理,也要相應地拆分 YYY 的訓練集,所以這是 Y{1}Y^{\{1\}}Y{1},然后從 y(1001)y^{(1001)}y(1001)y(2000)y^{(2000)}y(2000),這個叫 Y{2}Y^{\{2\}}Y{2},一直到 Y{5000}Y^{\{ 5000\}}Y{5000}

mini-batch 的數量 ttt 組成了 X{t}X^{\{ t\}}X{t}Y{t}Y^{\{t\}}Y{t},這就是1000個訓練樣本,包含相應的輸入輸出對。

來一起確定一下符號,x(i)x^{(i)}x(i) 是第 iii 個訓練樣本,z[l]z^{\lbrack l\rbrack}z[l] 表示神經網絡中第 lll 層的 zzz 值,大括號 t{t}t 代表不同的 mini-batch。如果 X{1}X^{\{1\}}X{1} 是一個有1000個樣本的訓練集,或者說是1000個樣本的 xxx 值,所以維數應該是 (nx,1000)(n_{x},1000)(nx?,1000)X{2}X^{\{2\}}X{2} 的維數應該是 (nx,1000)(n_{x},1000)(nx?,1000),以此類推,所有的子集維數都是 (nx,1000)(n_{x},1000)(nx?,1000),而這些(Y{t}Y^{\{ t\}}Y{t})的維數都是 (1,1000)(1,1000)(1,1000)

其實這個詞有一點拗口,不過如果你了解了意思之后,就明白這個詞的作用了。


batch 是批量的意思,mini 就是小的意思,現在再來解釋一下這個算法的名稱,batch 梯度下降法指的是之前講過的梯度下降法算法,就是同時處理整個訓練集,這個名字就是來源于能夠同時看到整個 batch 訓練集的樣本被處理,這個名字不怎么樣,但就是這樣叫它,所以記住就行。相比之下,mini-batch 梯度下降法,指的是每次同時處理的單個的 mini-batch X{t}X^{\{t\}}X{t}Y{t}Y^{\{ t\}}Y{t},而不是同時處理全部的 XXXYYY 訓練集,也就是小批量數據的梯度下降法。

那么究竟 mini-batch 梯度下降法的原理是什么?

在訓練集上運行 mini-batch 梯度下降法,你運行 for t=1……5000,因為有5000個各有1000個樣本的組,在 for 循環里要做得基本就是對 X{t}X^{\{t\}}X{t}Y{t}Y^{\{t\}}Y{t} 執行一步梯度下降法,就好比現在有一個擁有1000個樣本的訓練集,而且假設你已經很熟悉一次性處理完的方法,要用向量化去一次性處理1000個樣本,這就是其中一個過程,然后共計執行5000次,這樣就算是完成了一個 mini-batch

現在你應該大概了解了什么是 mini-batch,我們來詳細地說一下整個過程。

首先對輸入也就是 X{t}X^{\{ t\}}X{t},執行前向傳播,然后執行 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],之前只有一個數據,但是現在正在處理整個訓練集,即第一個 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],然后執行 A[1]k=g[1](Z[1])A^{[1]k} =g^{[1]}(Z^{[1]})A[1]k=g[1](Z[1]),之所以用大寫的 ZZZ 是因為這是一個向量內涵,…以此類推,直到 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]),這就是網絡的輸出,即模型的預測值。注意這里需要用到一個向量化的執行命令,是一次性處理1000個而不是500萬個數據樣本。接下來計算損失成本函數 JJJ,因為子集規模是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)),說明一下,這(L(y^(i),y(i))L(\hat y^{(i)},y^{(i)})L(y^?(i),y(i)))指的是來自于 mini-batchX{t}X^{\{ t\}}X{t}Y{t}Y^{\{t\}}Y{t} 中的樣本,這一塊一定不要弄混了,是完成一個 batch 內的數據訓練過程,即1000。

如果用到了正則化(深度學習入門筆記(十):正則化),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?,因為這是一個 mini-batch 的損失,所以將 JJJ 損失記為上角標 ttt,放在大括號里(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?)。到這里了,你應該會注意到,我們做的一切都是那么的似曾相識,其實跟之前執行梯度下降法如出一轍,除了現在的對象不是 X?X?X?Y?Y?Y?,而是 X{t}?X^{\{t\}}?X{t}?Y{t}?Y^{\{ t\}}?Y{t}?

接下來,執行反向傳播來計算 J{t}?J^{\{t\}}?J{t}? 的梯度,只是使用 X{t}?X^{\{ t\}}?X{t}?Y{t}?Y^{\{t\}}?Y{t}?,然后更新加權值,W?W?W? 實際上是 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]?,對 b?b?b? 做相同處理,b[l]:=b[l]?adb[l]?b^{[l]}:= b^{[l]} - adb^{[l]}?b[l]:=b[l]?adb[l]?。這是使用 mini-batch 梯度下降法訓練樣本的一步,寫下的代碼也可被稱為進行 一代(1 epoch) 的訓練,一代的意思是只是一次遍歷了訓練集。

使用 batch 梯度下降法,一次遍歷訓練集只能讓你做一個梯度下降,使用 mini-batch 梯度下降法,一次遍歷訓練集,能讓你做5000個梯度下降。mini-batch 梯度下降法比 batch 梯度下降法運行地更快,所以幾乎每個研習深度學習的人在訓練巨大的數據集時都會用到,希望你可以好好理解理解。

2、數據讀取之 h5py

HDF(Hierarchical Data Format)指一種為存儲和處理大容量科學數據設計的文件格式及相應庫文件。其中當前比較流行的版本是 HDF5。它擁有一系列的優異特性,使其特別適合進行大量科學數據的存儲和操作,如支持非常多的數據類型,靈活,通用,跨平臺,可擴展,高效的 I/O 性能,支持幾乎無限量(高達 EB)的單文件存儲等,詳見其官方介紹:https://support.hdfgroup.org/HDF5/ 。

HDF5 三大要素:

  • hdf5 files: 能夠存儲兩類數據對象 dataset 和 group 的容器,其操作類似 python 標準的文件操作;File 實例對象本身就是一個組,以 / 為名,是遍歷文件的入口
  • dataset(array-like): 可類比為 Numpy 數組,每個數據集都有一個名字(name)、形狀(shape) 和類型(dtype),支持切片操作
  • group(folder-like): 可以類比為 典,它是一種像文件夾一樣的容器;group 中可以存放 dataset 或者其他的 group,鍵就是組成員的名稱,值就是組成員對象本身(組或者數據集)


Python 中有一系列的工具可以操作和使用 HDF5 數據,其中最常用的是 h5py 和 PyTables。目前比較火熱的pytorch就可以使用 h5py 進行數據的讀取,這樣相較于 minibatch 也會更好。

入門的建議博客是這個——深度學習之10分鐘入門h5py,如果你比較迷惑的話,就把它當成是一個存儲數據的工具即可,可以類比于Excel表格存儲數據一樣。

3、數據讀取之 TFRecords

關于 TensorFlow 讀取數據的方法,官網給出了三種方法:

  • 供給數據: 在 TensorFlow 程序運行的每一步,讓 Python 代碼來供給數據
  • 從文件讀取數據: 在 TensorFlow 圖的起始,建立一個輸入管線從文件中讀取數據。
  • 預加載數據: 在 TensorFlow 圖中定義常量或變量來保存所有數據(僅適用于數據量比較小的情況)。

輸入數據集一般被存儲在各種類型的文件系統中,根據文件系統類型和輸入數據集大小,有兩種不同的數據讀取方法:

  • 大數據集(如 ImageNet )一般由大量數據文件構成,因為數據規模太大,所以無法一次性全部加載到內存中,因為太耗內存,這個時候最好使用 TensorFlow 提供的隊列 queue ,也就是第二種方法從文件讀取數據
  • 小數據集(如 MNIST )可能僅包含一個文件,因此用戶可以在模型訓練開始前一次性地將其加載到內存處理,然后再分batch 輸入網絡進行訓練,也就是第三種方法預加載數據

小數據集時多采用 minibatch,而大數據集時則多采用 TFRecords 格式。

入門的建議是這個博客——TensorFlow學習筆記之30分鐘學會 TFRecords 格式高效處理數據,如果你還是很迷糊的話,只要記得 TFRecords 格式和 h5py 格式是類似的效用即可。

4、六種 Python 圖像庫讀取

主流Python圖像庫有:

  • opencv——cv2.imread
    OpenCV 作為最常用的圖像處理庫,實現了圖像處理和計算機視覺方面的很多通用算法,可以說是很全面和強大了。如果你只想掌握一個圖像庫的話,OpenCV 是你的最佳選擇。

  • PIL——PIL.Image.open
    PIL 即 Python Imaging Library,也即為我們所稱的 Pillow,已經是 python 平臺事實上的圖像處理標準庫了。PIL 功能非常強大,但 API 卻非常簡單易用。它比 OpenCV 更為輕巧,正因如此,它深受大眾的喜愛。

  • matplotlib——matplotlib.image.imread
    Matplotlib 是 python 的 2D 繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環境生成出版質量級別的圖形。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。

  • scipy.misc——scipy.misc.imread
    Scipy 是一個 python 中用于進行科學計算的工具集,有很多功能,如計算機統計學分布、信號處理、計算線性代數方程等。

  • skimage——skimage.io.imread
    skimage 對 scipy.ndimage 進行了擴展,提供了更多的圖片處理功能,是基于 python 腳本語言開發的數字圖片處理包。

  • Tensorflow——tf.image.decode
    tf.image.decode 函數可以對圖像進行很多操作,如放大縮小,旋轉,平移,等等。

  • 詳細的實例和代碼可以看這個博客——你不能不知道的六種 Python 圖像庫的圖片讀取方法總結。

    推薦閱讀

    • 深度學習入門筆記(一):深度學習引言
    • 深度學習入門筆記(二):神經網絡基礎
    • 深度學習入門筆記(三):求導和計算圖
    • 深度學習入門筆記(四):向量化
    • 深度學習入門筆記(五):神經網絡的編程基礎
    • 深度學習入門筆記(六):淺層神經網絡
    • 深度學習入門筆記(七):深層神經網絡
    • 深度學習入門筆記(八):深層網絡的原理
    • 深度學習入門筆記(九):深度學習數據處理
    • 深度學習入門筆記(十):正則化
    • 深度學習入門筆記(十一):權重初始化
    • 深度學習入門筆記(十二):深度學習數據讀取
    • 深度學習入門筆記(十三):批歸一化(Batch Normalization)
    • 深度學習入門筆記(十四):Softmax
    • 深度學習入門筆記(十五):深度學習框架(TensorFlow和Pytorch之爭)
    • 深度學習入門筆記(十六):計算機視覺之邊緣檢測
    • 深度學習入門筆記(十七):深度學習的極限在哪?
    • 深度學習入門筆記(十八):卷積神經網絡(一)
    • 深度學習入門筆記(十九):卷積神經網絡(二)
    • 深度學習入門筆記(二十):經典神經網絡(LeNet-5、AlexNet和VGGNet)

    參考文章

    • 吳恩達——《神經網絡和深度學習》視頻課程

    總結

    以上是生活随笔為你收集整理的深度学习入门笔记(十二):深度学习数据读取的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。