對於CNN輸入的數據,常見的有三種處理方式:
1.Mean subtraction. 將數據的每一維特征都減去平均值。在numpy 中 X -= np.mean(X, axis = 0)
2.Normalization 歸一化數據,使數據在相同尺度。 在numpy 中 X /= np.std(X, axis = 0)

3. PCA and Whitening. 首先均值化數據,然后求協方差矩陣。
X -= np.mean(X, axis = 0) //求均值
cov = np.dot( X.T, X) / X.shape[0] // 求協方差矩陣
U,S,V = np.linalg.svd(cov) //奇異值分解,其中 U 為特征向量,S為奇異值分解向量為特征向量的平方
Xrot = np.dot(X, U) //去除數據相關性
Xrot_reduced = np.dot(X, U[:,:100]) 降維到 100 維
Xwhite = Xrot / np. sqrt(s + 1e-5) //白化數據 1e-5 為防止除0

可視化數據:例子為CIFAR-10 images

左邊第一張圖片為CIFAR-10 中的49張圖片(每張圖片有3072個特征),第二張圖片為3072特征向量中的前144個特征,第三張圖片為通過PCA降維降到144維,使用的是圖二中的前144維,第四張圖片為白化后的圖片。
常見的數據處理是 Mean substraction 和 Normalization.
權重的設置
陷阱:全零初始化 如果參數是全零,導致輸出的結果相同,那么通過反向傳播計算梯度也相同,那么參數也不會更新。
用較小的數隨機化: W = 0.01* np.random.randn(D,H) randn 返回的樣本滿足標准正態分布.
標准化變量 1/sqrt(n) W = np.random.randn(n) / sqrt(n) 或者 W = np.random.randn(n) / sqrt(2.0/n)
初始化偏置項
很常見的是將偏置項設置為0,ReLu 激活函數有些人會設置為 0.01, 在實際中通常設置為 W = np. random.randn(n) * sqrt(2.0/n)
Batch Normalization
發現一個講解Batch Normalization 的博客 詳見http://blog.csdn.net/hjimce/article/details/50866313
正則化
有多種方法來防止神經網絡的過擬合。
L2 范式 w = w + 1/2 λw2
L1 范式 w = w + λ|w| 向量各元素絕對值之和
L1會趨向於產生少量的特征,而其他的特征都是0,而L2會選擇更多的特征,這些特征都會接近於0
Dropout
Dropout是指在模型訓練時隨機讓網絡某些隱含層節點的權重不工作,不工作的那些節點可以暫時認為不是網絡結構的一部分,但是它的權重得保留下來(只是暫時不更新而已),因為下次樣本輸入時它可能又得工作了。如下圖所示

主要參考CS231n 課程。
