科研:
1.数据预处理(归一化)
去均值,这是最常见的图片数据预处理,简单说来,它做的事情就是,对待训练的每一张图片的特征,都减去全部训练集图片的特征均值,这么做的直观意义就是,我们把输入数据各个维度的数据都中心化到0了。
归一化,归一化的直观理解含义是,我们做一些工作去保证所有的维度上数据都在一个变化幅度上。通常我们有两种方法来实现归一化。一个是在数据都去均值之后,每个维度上的数据都除以这个维度上数据的标准差(X /= np.std(X, axis = 0))。另外一种方式是我们除以数据绝对值最大值,以保证所有的数据归一化后都在-1到1之间。多说一句,其实在任何你觉得各维度幅度变化非常大的数据集上,你都可以考虑归一化处理。不过对于图像而言,其实这一步反倒可做可不做,因为大家都知道,像素的值变化区间都在[0,255]之间,所以其实图像输入数据天生幅度就是一致的。
2.权重初始化(很重要)
如果初始化选的不好,很可能找到的是局部最优解;如果初始化很好,可能一下子就找到了全局最优解,就非常好。所以,权重的初始化很重要。
错误的想法:全部初始化为0
有些同学说,那既然要训练和收敛嘛,初始值就随便设定,简单一点就全设为0好了。亲,这样是绝对不行的!!!为啥呢?我们在神经网络训练完成之前,是不可能预知神经网络最后的权重具体结果的,但是根据我们归一化后的数据,我们可以假定,大概有半数左右的权重是正数,而另外的半数是负数。但设定全部初始权重都为0的结果是,网络中每个神经元都计算出一样的结果,然后在反向传播中有一样的梯度结果,因此迭代之后的变化情况也都一样,这意味着这个神经网络的权重没有办法差异化,也就没有办法学习到东西。
很小的随机数
其实我们依旧希望初始的权重是较小的数,趋于0,但是就像我们刚刚讨论过的一样,不要真的是0。综合上述想法,在实际场景中,我们通常会把初始权重设定为非常小的数字,然后正负尽量一半一半。这样,初始的时候权重都是不一样的很小随机数,然后迭代过程中不会再出现迭代一致的情况。举个例子,我们可能可以这样初始化一个权重矩阵W=0.0001*np.random.randn(D,H)。这个初始化的过程,使得每个神经元的权重向量初始化为多维高斯中的随机采样向量,所以神经元的初始权重值指向空间中的随机方向。
3.论文《Deep Residual Learning for Image Recognition》(清华大佬 何凯明 偶像aaaaa)
@1The depth of representations is of central importance for many visual recognition tasks.
@2An obstacle(障碍) to answering this question was the notorious problem of vanishing/exploding gradients(梯度弥撒/爆炸)
@3文章主要思想(基本结构单元)
x:inputs to the first layer.
H(x):an underlying map to be fit by a few stacked layers(即如图的2or3层结构)
F(x)=H(x)-x:residual
我们不对H(x)直接拟合,而是对F(x)这个残差进行拟合。
@4 需要注意的是,x 和F(x)必须维度一致,如果不一致,有两种解决方法:一是
,Ws只是用来使维度相等的;二是extra zero entries padded for increasing dimensions(填充0)。
@5 function F in the article has two or three layers,while more layers are possible.But if F has only a single layer,the equal(1) is similar to a linear layer.