本文简要介绍了CNN神经网络的结构与工作原理。

导言1:啥是神经网络



神经元的本质就是

写成向量的形式就是

w为权值,x为输入,f为非线性函数,又称为激活函数。

激活函数用于让网络在训练中可以逼近任意非线性函数,如果不加激活函数,无论多少层网络,都可以被等效成一层线性神经元。



【图片来自https://www.sohu.com/a/335618413_617676】

全连接神经元网络就是每层的所有神经元都和其上下层的所有神经元相连,并不是所有的神经元网络都是全连接的神经元网络

导言2:啥是机器学习,啥是深度学习

机器学习就是利用已有的数据让机器自己调整模型中的参数,再使用这个模型进行预测的方法。


(机器学习)



(不怎么深的神经网络)


【图片来自https://blog.csdn.net/lichengshan523689/article/details/80274173与https://www.sohu.com/a/207583859_478315】

深度学习就一个字“深”,理论上说,只要足够大,一个隐藏层就可以逼近任意的曲线,但更深的网络可以使我们利用更少的参数而达到相同的效果。

CNN卷积神经元网络


(LeNet5网络)


【图片来源见水印】



CNN最常用的功能是用于图片分类,但不限于此,alpha go使用的也是一种深度的CNN网络,但没有加入池化层。

以LeNet识别手写字为例:

卷积层通过卷积核提取细节特征,每层可以使用多个卷积核抽取多个特征,池化将图片按比例缩小,缩小后的图片可以被抽取到更宏观的特征,最后输出的全连接层输出的是图片分类的概率。

如何在pytorch中构建一个CNN网络

  • 1.构建网络结构

    • CNN层

      • 卷积层(输入通道数、输出通道数、卷积核尺寸、步长、是否补边。。。)

      • 归一化-激活

      • 池化(核尺寸、步长、是否补边。。。)

    • 全连接层

      • 线性层(输入向量长度,输出向量长度)

      • 激活

      • Softmax(把结果转化为总和为1的概率分布,但不是必须的)

  • 2.建立前向通道

    • 输入的x如何经过各层变成输出y

训练CNN网络

  • 1.准备训练数据

    • 图片

      • CNN的输入时确定的,喂给CNN的图片需要reshape成同样的大小

      • 可以随机的翻转一些图片,避免训练后图片一翻转,机器就不认识的尴尬情况

    • 标记

      • 在监督学习中,我们要在训练时给机器正确答案
    • 训练组,测试组

      • 网络通过训练组来更新参数,测试组不会被用来更新参数,只用于评估训练后的网络

      • 深度网络提供了足够多的参数去拟合一个高维的平面或曲线,可能会造成过拟合

      • 通过训练,训练组的准确率会逐步提升,但如果发生过拟合,测试组的准确率会大大低于训练组

  • 2.训练

    • A.随机初始化网络参数(建立网络时自动完成,也可以手动初始化)

    • B.把训练集图片喂给网络,得出预测值

    • C.使用损失函数计算预测值与图片标签的差(损失)

      • L1、MSE、NLL、CrossEntropy等,分类问题中用CrossEntropy比较合适

      • 使用Pytorch的CrossEntropy时,网络不需要softmax

    • D.反向传播计算各层网络中权值的梯度

    • E.根据选择的优化器和刚才计算出的梯度,使用梯度下降法,更新网络中的权值

      • 所谓梯度下降,就是修改参数,让网络预测结果的损失更小

      • SDG、Adagrad、Adam等



  • F.回到步骤B,直到我们得到满意的网络
  • 3.验证
    • 把测试集图片喂给网络,看看损失和准确率

【图片来自https://www.jianshu.com/p/c7e642877b0e】

CNN为何会工作?

我们通常把神经网络看出一个黑盒子,只能通过训练,使它的输出更加符合我们的要求,但很难窥视到神经网络到底是如何运作的,我们可以把梯度下降法的思想用在输入图片本身上,用来判断神经网络是如何看待一张图片的。



【图片来自台大李宏毅教授机器学习课程PPT】

Lime

我们把一张图片分割成若干块,然后把某些块扣除掉,然后看我们对扣除后的图片进行预测的结果与原图片预测结果的差就能看出这些块对预测结果的影响是大还是小。



Saliency Map

梯度的大小可以看成是改变输入值对输出值影响的剧烈程度。如果我们在反向传播计算网络参数时,连同输入图片也一起计算梯度,就可以看到图片里的那些像素对预测结果的影响更大。



看看神经元在想什么

我们在Saliency Map中使用了输入图片的梯度,我们可以利用这个梯度对输入图片做梯度上升,对输入图片进行update,使某个卷积神经元的输出达到最大(可以理解为让神经元最为兴奋),我们就可以看出这个神经元对于什么样的图片以及特征最为敏感。下图是让某个卷积层的前8个神经元最兴奋的图片。



下图是让某个卷积层神经元最兴奋的图片,以及这个神经元提取出的特征。



利用这种思想,我们还能做什么?

可否对输入图片进行梯度上升,从而生成一个全新的属于某个分类的图片

可否对一张图片进行少许的修改,让这个图片经过一个训练好的网络后被识别成另一类图片



【部分图片来自台大李宏毅教授机器学习课程PPT】