深度学习——数据预处理篇
深度學習——數據預處理篇
文章目錄
- 深度學習——數據預處理篇
- 一、前言
- 二、常用的數據預處理方法
- 零均值化(中心化)
- 數據歸一化(normalization)
- 主成分分析(PCA、Principal Component Analysis)
- 白化(whitening)
- 三、注意事項
- 四、References
一、前言
深度學習和機器學習一個重要的區別就是在于數據量的大小。就目前的大量實驗
和工作證明,數據量的大小能夠直接影響深度學習的性能,我們都希望能夠利用
小的數據集,簡單的算法就能夠取得不錯的效果,但目前的事實是小數據集上使
用深度學習,往往效果沒那么理想,所以老師也常常說,深度學習的三駕馬車:
網絡、損失、數據,由此可見數據對深度學習的重要性。
數據預處理在眾多深度學習算法中都起著重要作用。首先數據的采集就非常的費時費力,因為這些數據需要考慮各種因素,然后有時還需對數據進行繁瑣的標注。當這些都有了后,就相當于我們有了原始的raw數據,然后就可以進行下面的數據預處理部分了。
二、常用的數據預處理方法
在這之前我們假設數據表示成矩陣為X,其中我們假定X是N×D維矩陣,N是樣本數據量,D為單張圖片的數據向量長度。假設要處理的圖像是5×5的彩色圖像,那么D即5×5×3=75(因為彩色圖像有RGB三個通道),假設N=1000,那么X就是1000×75的矩陣,即1000行圖像的信息,每一行代表一個圖像的信息。
-
零均值化(中心化)
在深度學習中,一般我們會把喂給網絡模型的訓練圖片進行預處理,使用最多的方法就是零均值化(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(像素通道的最大值)會更簡單、更方便,而且幾乎同樣有效。
-
數據歸一化(normalization)
歸一化就是要把你需要處理的數據經過處理后(通過某種算法)限制在你需要的一定范圍內。舉個容易理解的例子,在房價預測那題中,假設房價是由面積s和臥室數b決定,面積s在0200之間,臥室數b在05之間,則進行歸一化就是s=s/200,b=b/5. 就是把這兩個數據"歸到1內",所以叫歸一化。
通常我們有兩種方法來實現歸一化:
-
一個是在數據都去均值之后,每個維度上的數據都除以這個維度上數據的標準差,即
X /= np.std(X, axis = 0) -
另外一種方式是我們除以數據絕對值的最大值,以保證所有的數據歸一化后都在-1到1之間。如上述的房價例子。
如圖normalized data即為歸一化
-
-
主成分分析(PCA、Principal Component Analysis)
這是一種使用廣泛的數據降維算法,是一種無監督學習方法,主要是用來將特征的主要分成找出,并去掉基本無關的成分,從而達到降維的目的。
總結一下PCA的算法步驟:
設有n條m維數據。-
將原始數據按列組成m行n列矩陣X
-
將X的每一行(代表一個屬性字段)進行零均值化
-
求出協方差矩陣
C=1mXXTC=\frac{1}{m}XX^{T} C=m1?XXT -
求出協方差矩陣的特征值及對應的特征向量
-
將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P
-
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:
-
-
白化(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
- https://blog.csdn.net/bea_tree/article/details/51519844#commentBox
- https://blog.csdn.net/han_xiaoyang/article/details/50451460#commentBox
- http://ufldl.stanford.edu/wiki/index.php/數據預處理#PCA.2FZCA.E7.99.BD.E5.8C.96
總結
以上是生活随笔為你收集整理的深度学习——数据预处理篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目标检测——Faster R-CNN论文
- 下一篇: 深度学习——训练时碰到的超参数