• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 深度學習——數據預處理篇

    深度學習——數據預處理篇

    一、前言

    深度學習和機器學習一個重要的區別就是在于數據量的大小。就目前的大量實驗
    和工作證明,數據量的大小能夠直接影響深度學習的性能,我們都希望能夠利用
    小的數據集,簡單的算法就能夠取得不錯的效果,但目前的事實是小數據集上使
    用深度學習,往往效果沒那么理想,所以老師也常常說,深度學習的三駕馬車:
    網絡、損失、數據,由此可見數據對深度學習的重要性。

    數據預處理在眾多深度學習算法中都起著重要作用。首先數據的采集就非常的費時費力,因為這些數據需要考慮各種因素,然后有時還需對數據進行繁瑣的標注。當這些都有了后,就相當于我們有了原始的raw數據,然后就可以進行下面的數據預處理部分了。

    二、常用的數據預處理方法

    在這之前我們假設數據表示成矩陣為X,其中我們假定X是N×D維矩陣,N是樣本數據量,D為單張圖片的數據向量長度。假設要處理的圖像是5×5的彩色圖像,那么D即5×5×3=75(因為彩色圖像有RGB三個通道),假設N=1000,那么X就是1000×75的矩陣,即1000行圖像的信息,每一行代表一個圖像的信息。

    1. 零均值化(中心化)

      在深度學習中,一般我們會把喂給網絡模型的訓練圖片進行預處理,使用最多的方法就是零均值化(zero-mean) / 中心化,簡單說來,它做的事情就是,對待訓練的每一張圖片的特征,都減去全部訓練集圖片的特征均值,這么做的直觀意義就是,我們把輸入數據各個維度的數據都中心化到0了。幾何上的展現是可以將數據的中心移到坐標原點。如下圖中zero-centered data(當然,其實這里也有不同的做法:我們可以直接求出所有像素的均值,然后每個像素點都減掉這個相同的值;稍微優化一下,我們可以在RGB三個顏色通道分別做這件事)

      零均值化的代碼為:

      X -= np.mean(X, axis = 0)# axis=0,計算每一列的均值,壓縮行
      
      # 舉個例子,假設訓練圖片有5000張,圖片大小為32*32,通道數為3,則用python表示如下:
      x_train = load_data(img_dir)  # 讀取圖片數據 x_train的shape為(5000,32,32,3)
      x_train = np.reshape(x_train, (x_train.shape[0], -1))  # 將圖片從二維展開為一維,x_train 變為(5000,3072)
      mean_image = np.mean(x_train, axis=0)  # 求出所有圖片每個像素位置上的平均值 mean_image為(1, 3072)
      x_train -= mean_image  # 減去均值圖像,實現零均值化
      
      # 即讓所有訓練圖片中每個位置的像素均值為0,使得像素值范圍變為[-128,127],以0為中心。
      


      例如在吳恩達的作業中就有說到,機器學習中一個常見的預處理步驟是對數據集進行集中和標準化,這意味著從每個示例中減去整個numpy數組的平均值,然后將每個示例除以整個numpy數組的標準差。但是對于圖片數據集來說,將數據集的每一行除以255(像素通道的最大值)會更簡單、更方便,而且幾乎同樣有效。

    2. 數據歸一化(normalization)

      歸一化就是要把你需要處理的數據經過處理后(通過某種算法)限制在你需要的一定范圍內。舉個容易理解的例子,在房價預測那題中,假設房價是由面積s和臥室數b決定,面積s在0200之間,臥室數b在05之間,則進行歸一化就是s=s/200,b=b/5. 就是把這兩個數據"歸到1內",所以叫歸一化。

      通常我們有兩種方法來實現歸一化:

      • 一個是在數據都去均值之后,每個維度上的數據都除以這個維度上數據的標準差,即

        X /= np.std(X, axis = 0)
        
      • 另外一種方式是我們除以數據絕對值的最大值,以保證所有的數據歸一化后都在-1到1之間。如上述的房價例子。

      如圖normalized data即為歸一化

    3. 主成分分析(PCA、Principal Component Analysis)

      這是一種使用廣泛的數據降維算法,是一種無監督學習方法,主要是用來將特征的主要分成找出,并去掉基本無關的成分,從而達到降維的目的。

      總結一下PCA的算法步驟:
      設有n條m維數據。

      1. 將原始數據按列組成m行n列矩陣X

      2. 將X的每一行(代表一個屬性字段)進行零均值化

      3. 求出協方差矩陣
        C=1mXXT C=\frac{1}{m}XX^{T}

      4. 求出協方差矩陣的特征值及對應的特征向量

      5. 將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P

      6. Y=P×X即為降維到k維后的數據

      代碼如下:

      # 假定輸入數據矩陣X是[N*D]維的
      X -= np.mean(X, axis = 0) # 去均值
      cov = np.dot(X.T, X) / X.shape[0] # 計算協方差
      U,S,V = np.linalg.svd(cov)
      Xrot = np.dot(X, U) # decorrelate the data
      Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced becomes [N x 100]
      
      

      PCA處理結果如圖中的decorrelated data:

    4. 白化(whitening)

      就是把各個特征軸上的數據除以對應特征值,從而達到在每個特征軸上都歸一化幅度的結果。也就是在PCA的基礎上再除以每一個特征的標準差,以使其normalization,其標準差就是奇異值的平方根:

      # whiten the data:
      # divide by the eigenvalues (which are square roots of the singular values)
      Xwhite = Xrot / np.sqrt(S + 1e-5)
      

      但是白化因為將數據都處理到同一個范圍內了,所以如果原始數據有原本影響不大的噪聲,它原本小幅的噪聲也會放大到與全局相同的范圍內了。
      另外我們為了防止出現除以0的情況在分母處多加了0.00001,如果增大他會使噪聲減小。
      白化之后得到是一個多元高斯分布,如下圖whitened所示:

      可以看出經過PCA的去相關操作,將原始數據的坐標旋轉,并且可以看出x方向的信息量比較大,如果只選一個特征,那么就選橫軸方向的特征,經過白化之后數據進入了相同的范圍。

    三、注意事項

    以上只是總結數據預處理的方法而已,并不是說每次都會用這么多方法,相反,在圖像數據處理或者CNN中,一般只需要進行去均值和歸一化,不需要PCA和白化

    代碼如下:

    X -= np.mean(X, axis = 0) # 減去均值,使得以0為中心
    X /= np.std(X, axis = 0) # 歸一化
    

    常見陷阱:在進行數據的預處理時(比如計算數據均值),我們只能在訓練數據上進行,然后應用到驗證/測試數據上。如果我們對整個數據集-整個數據集的均值,然后再進行訓練/驗證/測試數據的分割的話,這樣是不對的。正確做法是計算訓練數據的均值,然后分別把它從訓練/驗證/測試數據中減去。

    四、References

    版權聲明:本文為LLyj_原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/LLyj_/article/details/87606704

    智能推薦

    深度學習數據預處理——批標準化(Batch Normalization)

    數據預處理最常見的方法就是中心化和標準化,中心化相當于修正數據的中心位置,實現方法非常簡單,就是在每個特征維度上減去對應的均值,最后得到 0 均值的特征。標準化也非常簡單,在數據變成 0 均值之后,為了使得不同的特征維度有著相同的規模,可以除以標準差近似為一個標準正態分布,也可以依據最大值和最小值將其轉化為 -1 ~ 1 之間。 2015 年一篇論文提出了這個方法,批標準化,簡而言之,就是對于每一...

    深度學習數據預處理的一些問題

    本人也在初學階段,將自己遇到的一些小問題記錄如下,如果有誤歡迎大佬們評論指正Orz Orz Orz 1.csv讀取 此處獲得的train_y數據為包含列索引和行索引,類似一個excel表格的DataFrame類型數據,并非numpy類型數據,因此此時是無法進行reshape等常規操作的,因此需要用 將其中的數據取出變為數組,官方對于values的解釋如下: 官方樣例如下: 2.訓練標簽字母轉數值 ...

    hive 導出數據之一列多行,轉為一行多列

    需求:提取數據 說明:原數據是一列多行,需要轉化為一行多列 待查詢表為:temp_05 待查詢數據為: 待查詢數據如圖: 需要提取的數據表頭如下: 預定日期 昨日價格 前天價格 2018-02-01 2018-02-02 2018-02-03 2018-02-04 可用提數 SQL 數據如圖: 以下為嘗試過程 數據如圖: 數據如圖: 數據如圖: 數據如圖:...

    asp.net做一個簡易的聊天室

    要求: 結果: 關鍵代碼: Default.aspx Default.aspx.cs Default2.aspx Default2.aspx.cs Default3.aspx Default3.aspx.cs Default4.aspx...

    動態SQL和多表關聯-筆記

    《動態SQL與多表關聯》筆記 學習目標 能夠使用動態SQL完成SQL拼接 能夠使用resultMap完成多表查詢 能夠使用一對一查詢 能夠使用一對多查詢 (注:多對多其實就是兩個一個多) 映射文件:為什么要resultMap 目標 定義結果映射 使用結果映射 回顧 在mybatis中有2種配置文件: 核心配置文件,如:sqlMapConfig.xml 實體類映射文件,如:UserMapper.xm...

    猜你喜歡

    【OpenGL C++ UE4】獲取模型頂點及面索引數據,并優化存儲結構供UE4繪制

    目錄 一、功能需求 二、成果 三、環境配置 四、詳細步驟 4.1 Max制作三棱錐并處理 4.2 核心代碼 4.2.1 傳入結構體數據 4.2.2 頂點去重、更新索引 4.2.3 輸出本地CSV文件 4.3 UE4繪制 一、功能需求 想必你肯定會問我一個問題,UE4直接導入模型不好么? 哈哈,前提是在做畢設時,導師提供的只有頂點與面索引數據,沒有模型。 下文詳細介紹了畢設開發中的難點,涉...

    解決Pyinstaller打包numpy和pandas庫文件過大問題

    解決Pyinstaller壓縮numpy和pandas庫文件過大問題 文件包類型和網上的方法 Windows下docker的安裝 在docker下實現打包     今天是2021年的第一天,先祝各位小伙伴現年快樂哈。最近因為做了一個項目,需要打包文件,文件中包含了numpy和pandas庫,結果打包出來幾百行的代碼居然要900m,人都傻了,翻遍了全網找解決方...

    【混沌工程】基于ChaosBlade實現網絡故障模擬

    一、前言 很久之前曾基于linux內核自帶的TC和netem模擬一些公網中遇到的極端情況(延遲、丟包、重復、損壞和亂序等),驗證了我們傳輸程序的健壯性! 具體細節可見這篇老博客: https://blog.csdn.net/u013128262/article/details/84784663 最近在復現kafka生產端一個timeout異常場景時,發現之前方案時因為內核和OS版本問題有些差異而無...

    使用FileZilla連接時超時,無法連接到服務器

    用FileZilla連接服務器時,顯示錯誤: 解決方法: 檢查基本的內容 主機是否寫錯 端口是否自定義,默認21 檢查用戶名和密碼是否錯誤 如果連接的是公司內網 使用ping命令,測試一下是否能收到數據 收不到則需要開啟VPN,再ping,看是否能接收數據(請老鐵們用自己最合適的方法解決) 如果開啟VPN后能接收數據,則可以連接一下服務器,如果不行(怎么可能不行),則跳轉3并依次嘗試 開啟VPN后...

    精品国产乱码久久久久久蜜桃不卡