博主接触CNN已有一段时间,写这篇博客一方面是为了加深自己的理解及记忆,另一方面是给初学者以启发,同时也便于大家一起交流学习。
简单来说,CNN经过以下的发展史:
1.CNN的起源 1980年代末-1999年 ConvNet、LeNet-5
2.CNN停滞不前 2000年初 性能很难改进、SVM流行、反向传播无法有效收敛到最佳点
3.CNN的复兴 2006年-2011年 贪婪逐层预训练方法、GPU、ImageNet
4.CNN的崛起 2012年-2014年 AlexNet、VGG、GoogleNet、R-CNN
5.CNN结构创新和应用迅速发展 2015年至今 ResNet、DenseNet、ResNext、Fast R-CNN、 Faster R-CNN、Mask R-CNN
为了更好的理解卷积层,在这里先举个“栗子”:假设有张图片,大小为8*8,图片中数字代表像素值,像素值越大,颜色越亮,图中两个颜色的分界线就是我们要检测的边界。
设计一个滤波器(filter,也叫kernel),大小为3*3,然后,我们用这个filter,往我们的图片上“盖”,覆盖一块跟filter一样大的区域之后,对应元素相乘,然后求和。计算一个区域之后,就向其他区域挪动,接着计算,直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积”。
可以看到边界被检测到了,这就是卷积的神奇之处:
卷积的具体细节如下图所示,简单明了。
池化,即下采样,主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。主要有:Max Pooling:最大池化;Average Pooling:平均池化。
全连接层通常在网络末端用于分类任务。与卷积和池化不同,它是全局操作,它从前一层获取输入,并全局分析所有前一层的输出。
这里需要说明的是,在经过数次卷积和池化之后,我们最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。
1.权值共享
CNN中每一层由多个map(特征图)组成,每个map由多个神经单元组成,同一个map所有的神经单元共用一个卷积核(即权重),卷积核跟上一层图像卷积往往得到图像的一个特征,权值共享策略减少了需要训练的参数,使得训练出来的模型的泛化能力更强。
权值共享也实现了特征与位置无关性,图像的一部分的统计特性与其他部分是一样的。意味着在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,都能使用同样的学习特征。
2.局部连接
所谓局部连接,就是卷积层的节点仅仅和其前一层的部分节点相连接,只用来学习局部特征。局部感知结构的构思理念来源于动物视觉的皮层结构,其指的是动物视觉的神经元在感知外界物体的过程中起作用的只有一部分神经元。在计算机视觉中,图像中的某一块区域中,像素之间的相关性与像素之间的距离同样相关,距离较近的像素间相关性强,距离较远则相关性就比较弱,由此可见局部相关性理论也适用于计算机视觉的图像处理领域。
如下图,卷积核大小为22, 隐藏层有9个神经元,即经过卷积后输出为33的特征图,可以看到每个隐藏层只与4个输入输入神经元相连,这就是局部连接;而权值共享体现在每个隐藏层神经元与输入层神经元连接的权值是一样的,这样就做到了权值共享,减少参数。
1.图像分类、检索
2.目标定位检测
3.目标分割
4.步态识别
基于keras的LeNet-5模型可视化、网络特征可视化及kernel可视化
深度学习一直被人们称为“黑盒子”,即内部算法不可见。但是,卷积神经网络(CNN)却能够被可视化,通过可视化,人们能够了解CNN识别图像的过程。
1.卷积核输出的可视化(Visualizing intermediate convnet outputs (intermediate activations),即可视化卷积核经过激活之后的结果。能够看到图像经过卷积之后结果,帮助理解卷积核的作用。
2.卷积核的可视化(Visualizing convnets filters),帮助我们理解卷积核是如何感受图像的。
3.热度图可视化(Visualizing heatmaps of class activation in an image),通过热度图,了解图像分类问题中图像哪些部分起到了关键作用,同时可以定位图像中物体的位置。
model = Sequential()
model.add(Conv2D(6,(5,5),strides=(1,1),input_shape=(28,28,1),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(16,(5,5),strides=(1,1),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(120,activation='relu'))
model.add(Dense(84,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])
model.summary()
大家阅读到这里就要结束了,感谢大家的阅读,有什么问题欢迎大家评论,最后转载请注明出处。
最后附上代码链接://download.csdn.net/download/qq_35874169/12062372,无积分的可私信博主发邮箱,谢谢!