论文AlexNet笔记
原文地址:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
一.网络结构
该网络有8层1,前五层为卷积层,后三层为全连接层,1、2卷积层后接Response Normalization层,每一层后加ReLU激活函数。
Response Normalization
用a^i_x,y表示通过在位置(x,y)上应用核 i 计算的一个神经元的活动。在同一个空间位置上的n个“相邻”核映射上的和,N为该层卷积核的数量。其余超参数需要验证集来定义。
二.抑制过拟合
Overlapping Pooling
s为步长,z为卷积核大小,s=z为传统池化;s<z时为重叠池化,该方法可以抑制过拟合。
数据增强
1.将256256的图片随机提取为224224,这样就可以将训练样本增加到2048倍。(但是样本间可能会有高度的依赖性)
2.第二种是改变训练样本RGBchannels的强度。对整个训练集的RGB像素值应用PCA,即
添加多个找到的主成分,其幅度与相应的特征值成正比,并要乘以一个零均值,标准差为0.1的高斯变量,对每一个RGB值 Ixy=[IxyR , IxyG , IxyB ] 要添加[p1 , p2 , p3] [α1λα1 , α2λα2 , α3λα3] ,p和λ是协方差矩阵的特征向量和特征值,α是高斯变量,该高斯变量的标准差参数也是唯一引入的外部变量
代码如下
`import numpy as np
import os
from PIL import Image, ImageOps
import random
from scipy import misc
import imageio
def PCA_Jittering(path):
img_list = os.listdir(path)
img_num = len(img_list)
for i in range(img_num):
img_path = os.path.join(path, img_list[i])
img = Image.open(img_path)
img = np.asanyarray(img, dtype = 'float32')
img = img / 255.0
img_size = img.size // 3 #转换为单通道
img1 = img.reshape(img_size, 3)
img1 = np.transpose(img1) #转置
img_cov = np.cov([img1[0], img1[1], img1[2]]) #协方差矩阵
lamda, p = np.linalg.eig(img_cov) #得到上述协方差矩阵的特征向量和特征值
#p是协方差矩阵的特征向量
p = np.transpose(p) #转置回去
#生成高斯随机数********可以修改
alpha1 = random.gauss(0,3)
alpha2 = random.gauss(0,3)
alpha3 = random.gauss(0,3)
#lamda是协方差矩阵的特征值
v = np.transpose((alpha1*lamda[0], alpha2*lamda[1], alpha3*lamda[2])) #转置
#得到主成分
add_num = np.dot(p,v)
#在原图像的基础上加上主成分
img2 = np.array([img[:,:,0]+add_num[0], img[:,:,1]+add_num[1], img[:,:,2]+add_num[2]])
#现在是BGR,要转成RBG再进行保存
img2 = np.swapaxes(img2,0,2)
img2 = np.swapaxes(img2,0,1)
save_name = 'pre'+str(i)+'.png'
save_path = os.path.join(path, save_name)
misc.imsave(save_path,img2)
#plt.imshow(img2)
#plt.show()
PCA_Jittering(‘testpic’)`
使用方法是:主函数PCA_Jitterring括号中的参数是当前路径下的一个文件夹,它会自动加载文件夹中的图片。调整该方法的唯一参数(高斯函数的标准差)是在标记了生成高斯随机数那里,改变参数会得到很不同的效果。
dropout:
结合许多不同模型的预测是减少测试误差的一个非常成功的方法。
然而,有一个非常有效的模型组合版本,在训练期间只需要花费大约2倍的成本。最近引入的dropout技术是将每个隐藏神经元的输出设置为0,概率为0.5。
以这种方式脱落的神经元不参与正向传递,也不参与反向传播。所以每次输入出现时,神经网络都会对不同的架构进行采样,但是所有这些架构都共享权重。
这种技术减少了神经元复杂的共适应,因为神经元不能依赖于特定的其他神经元的存在。因此,它被迫学习与其他神经元的许多不同随机子集一起使用的更健壮的特征。
在测试时,我们使用所有的神经元,但是将它们的输出乘以0.5,这是一个合理的近似,近似于取指数众多drop - in网络产生的预测分布的几何平均值。
学习中的细节
1.权重更新的规则
0.9为momentum,0.0005为weight_decay,且weight_decay是非常重要的,相当于L2正则化,可以减小训练误差。
2.初始化
我们初始化每一层的权值,从标准差为0.01的零均值高斯分布开始。我们用常数1初始化了第二层、第四层、第五层卷积层以及完全连通的隐层中的神经元偏差。这个初始化通过为ReLUs提供积极的输入来加速学习的早期阶段。我们用常数0初始化剩余层的神经元偏差bias。
3.学习率
·我们对所有层使用相同的学习率。
·我们采用的训练方法是,当验证错误率不再随着当前学习率的提高而提高时,将学习率除以10。
·初始化学习率为0.01,终止前降低6倍。