cs231n-(5)神经网络-2:设置数据和Loss

前端之家收集整理的这篇文章主要介绍了cs231n-(5)神经网络-2:设置数据和Loss前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

数据预处理

神经网络输入的数据往往要经过预处理。假设数据X大小为[N x D],其中N表示元素个数,D表示维度。

减去均值

最长用的就是减去每个特征的均值(均值常常有训练集计算得到),减去均值的几何意义是将数据中心大致移到零点。。使用python时,可以用X-=np.mean(X,axis = 0)算得均值。如果是图像,常常减去RGB通道的均值。

正则化

正则化是指将数据各个维度归一化,即变化范围相同。一般有两种方法:1、将数据均值设为零(如减去均值),之后除以标准差:X /= np.std(X,axis=0)。2、不同维度的数据范围相差很大,且重要性相同,将其最大值和最小值分别变换为+1和-1。

下去就是原始数据,零中心化,正则化处理的效果

PCA and Whitening

PCA是用来降维,假设已经完成了零中心化和归一化,降维过程如下:
先计算协方差矩阵

# Assume input data matrix X of size [N x D]
X -= np.mean(X,axis = 0) # zero-center the data (important)
cov = np.dot(X.T,X) / X.shape[0] # get the data covariance matrix

协方差矩阵中(i,j)位的数据表示i维度和j维度数据的协方差;对角线上数据表示某一维度的方差。协方差矩阵是对称的半正定矩阵,对它进行SVD分解:

U,S,V = np.linalg.svd(cov)

得到U是特征向量矩阵,它的每一列都是一个特征向量,S是特征值向量,因为协方差矩阵是对称的半正定矩阵,所以它等于特征值平方。为了去除相关性,将已经中心化的数据映射到特征向量上

Xrot = np.dot(X,U) # decorrelate the data

其中U的每一列都是标准正交特征向量,且已经按照特征值由大到小排列(np.linalg.svg返回时已经排列)。与特征向量相乘,相当于对X的数据做一个旋转映射,映射到特征向量对应的正交基上。可以只保留前面较大特征值对应的特征向量,丢弃较小值对应的特征向量,以此来降维。这种方法叫做Principal component analysis

Xrot_reduced = np.dot(X,U[:,:100]) # Xrot_reduced becomes [N x 100]

通过这个操作,保留了前100维度数据(以方差大小为标准)。

经过PCA处理的数据,可以再经过白化Whitening处理。白化是指PCA处理后的数据,每个维度除以其特征值。几何解释就是服从多维度高斯分布的数据,经过白化处理后,服从均值为零,协方差相等的分布。

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

上面处理为白化操作,分母加上1e-5为防止分母为零。这样的操作把所有维度数据拉伸到相同范围,可能会放大噪声,实际中可以通过增大分母(加上1e-5更大的值)来平滑。

上图左边分布为原始数据。中间为PAC处理后的数据,可以看出PCA处理后,将坐标轴旋转,可以看出横轴信息量大,如果只保留一维数据,要丢弃纵轴数据。右边为白化处理后的数据,数据范围相同了

使用CIFAR-10来展示PCA和白化

上图中,最左边为原始数据,每张图片可以看做是3072的列向量。第二张为特征向量中,前144个(按照特征值排列)。第三张为经过PAC降维处理后,只保留144维特征的图片图片变模糊了,说明只保留了低频部分。最后一张为白化后的图片

注意:CNN不需要进行PCA和白化操作,这里提到只是讲解数据处理的一般方法
数据预处理,只能在训练集上应用。应该先将数据分为训练集、验证集、测试集,之后在训练集上应用数据预处理。

权重初始化

训练神经网络前,要先初始化权重。

全部初始化为零

权重最终的值我们不知道,但是根据前面数据预处理过程,大概可以猜到,权重最终应该是一般为正,一般为负。但是权重不能全部初始化为零。如果全部初始化为零,那么所有神经元输出将相同,计算得到所有梯度都相同,权重更新相同,最终得到的权重也相同。

小的随机

因为正则化,权重要比较小,但是又不能对称;那么可以用小的随机数来初始化。这样计算得到不同梯度,迭代更新权重会趋向不同。例如这样初始化。W = 0.01 * np.random.randn(D,H)randn生成零均值单位方差的高斯分布。这样初始化,每个神经权重向量是从高维高斯分布随机采样而来;也可是使用随机生成随机数。但是在实际中,这样初始化效果不好。

小的权重并不一定会得到好的效果。神经网络中,如果权重比较小,那么反向传播时,梯度就比较小。这样会减小梯度传播的信号,在深度神经网络中也是个问题。

校准方差

如果神经元输出有着相似的分布,那么收敛速度回加快。前面提到的权重初始化方法,随着输入增大,输出的方差会增大。通过除以sqrt(n),其中n是输入个数,可以将输出方差归一化到1;例如这样初始化w = np.random.randn(n) / sqrt(n)

不考虑非线性激活函数,假设输出 @H_403_207@s=niwixi

猜你在找的正则表达式相关文章