用cms做网站的缺点,厦门软件园多客宝网站开发,抖音代运营合同范本,阅读网站模板Hi#xff0c;你好。我是茶桁。
上一节课#xff0c;我们详细的学习了卷积的原理#xff0c;在这个过程中给大家讲了一个比较重要的概念#xff0c;叫做input channel#xff0c;和output channel。
当然现在不需要直接去实现, 卷积的原理PyTorch、或者TensorFlow什么的…
Hi你好。我是茶桁。
上一节课我们详细的学习了卷积的原理在这个过程中给大家讲了一个比较重要的概念叫做input channel和output channel。
当然现在不需要直接去实现, 卷积的原理PyTorch、或者TensorFlow什么的其实都实现了。但我们现在如果要用PyTorch的卷积操作它就会有一个input channel和output channel的一个写法。 这里的方法是Conv2d表示这里所应用的filter是一个2d的。那么它如何去做3d的 是将每一层的结果加在一起。
与此对应的还有一个Conv3d, 这个时候filter就是很多个不一样的。
我们一般在使用的时候应用的都是Conv2d。感觉上好像觉得Conv3d里我们每一层的值不一样其实会更好。但其实现在得到的这个filter是咱们人工写的但是我们为了提取出来大自然中非常非常多的特征其实我们会让机器自动生成、自动初始化一堆filter这些filter的结果全部都是随机的。
就是说这个filter的结果在深度学习中其实这些结果都是随机的然后通过训练和反向传播这些filter会自动地学习出来一个值。也就是说它会自动地收敛到某个数值上而这个数值在这种环境下卷积应该怎么提取特征那么我们做成2D的话所需要拟合的参数其实就少了。
假如filters前边的input channel很多、很深那么这个filters需要拟合的参数也很多如果是2D的话只需要拟合2D的这一层就可以了。这就是2D和3D的区别以及为什么一般要用2D不用3D。
如果现在要用卷积的话第一个参数就是input channel。第二个就是output channel。output channel其实就是有多少个filters。
那kernel size指的就是做卷积的时候这个卷积的大小。比方说是3 * 3的那么Kernel size就是3也可以写成(3,3)。
还有一个参数叫做stride这个stride就是步幅。那这个步幅是干什么的我们一般用filter去卷积图像的时候在矩阵上是一个单位一个单位从左到右从上到下移动的这个步幅是为了加快移动从而设置的间隔。比如[10, 9, 8, 7, 6] 那我就拿一行来举例知道意思就行了。比如这样一个数列如果filter是3列那按顺序就应该先是[10, 9, 8]然后是[9, 8, 7] 但是我设置了stride就可以跳步来执行。在[10, 9, 8]之后可以是[8, 7, 6]。stride默认为1。
下面一个参数 padding。假如是一个6 * 6的图像矩阵有一个3 * 3的filter 那么对这6 * 6的图像进行卷积会先变成一个4 * 4然后变成2 * 2。显示出来的结果就是在不断地变小代表抽象层次越来越高。
那么因为每一次window都在不断变化在进行下一轮的时候如果这中间要加一些什么操作维度发生变化会导致每一次中间要连接什么东西的时候维度都得重新去计算。
也就说维度不断的变化会导致写代码的时候计算会变得更复杂。
那第二就是我们也不希望减少的太快了。举个极端情况把1万 * 1万的图像很快就变成一个2 * 2的了。抽象层次太高信息就少了。
第三个解释起来比较复杂我们脑子里想想一下一个filter在图像上进行从左到右移动那么在依次进行卷积计算的时候最左边的一列就只计算了一次但是中间位置就会被卷入计算多次。我们希望的是边上的的数据也能被计算多次就是也能被反复的提取。
要解决这三个问题有一个很简单的方法就是padding。它的意思就是在这个图形外边加了一圈或者两圈0。如果你要加一圈0的话padding1。如果等于2的话就加两圈0。 接下来dilation。这个是在我们做图形的分割的时候用的。在图形识别的时候大家现在先不用去学习它。
我们一张图片进行卷积的时候会越来越小这个叫做下采样 down sampling。进行完下采样之后如果要做图像的切分我们要把图像里边主体部分全部给它涂黑别的地方全部涂白需要基于这个小的采样又把它给扩大慢慢恢复到原来大小这个叫做上采样。上采样时有时候会用到dilation。
重要的就是这几个参数。这几个参数给大家说完其实基本上卷积的几个重要的特性就说明白了。
池化
除了卷积之外还有一个比较重要的操作: pooling, 池化操作。
池化操作其实很简单我们给定一个图片卷积操作是选了一个window和filter做了一个f乘w然后给它做相加. sum(f*w). pooling是一个很直接的操作, 把w这里边所有的值给它取个平均值, 也有可能取个最大值。假如是它最大值那么值最大就代表着是在这个图形里边对他影响最重的这个点。
那么做了pooling之后每一次这样一个操作图形变小了但是图像基本上保持了原来的样子。就是pooling操作前后的图像是相似的它取了最重要的信息。 我们现在来思考一下如果有一个图片不管是卷积还是pooling都会让其缩小。那我们思考下 既然两个操作都会导致图像缩小那为什么会存在两个操作呢
咱们机器学习里面最头疼的事情就是所谓的过拟合过拟合就是在训练的时候效果挺好结果在实际中效果就不好了。
而控制过拟合最主要的就是能够减少参数在越少的参数能达到效果的时候我们期望参数越少越好在同样的数据量下就越能防止过拟合。
卷积里面这些值以前的时候是人来确定但现在其实是期望机器自动的去求也就是说这个参数是需要自己去求解的。而pooling并不需要去设定参数它没有参数这样会减少参数。
用了pooling之后不仅减少了参数, 还减少了接下来x的维度。所以最核心的其实是我们减少了所需要训练的参数。
之所以用pooling是因为可以减少参数可以让它的过拟合的问题减弱。但是如果你的数据量本身就很多或者说模型本身就比较好训练、好收敛那你没有这个pooling操作其实也是可以的。
权值共享和位置平移
那么这个时候就要跟大家来讲一个比较重要的概念叫做权值共享和局部不变性: Parameters Sharing and Location Invariant.这个Loction Invariant也有人把它叫做shifting Invariant。CNN的最重要的两个特点第一个特点就是它的权值共享。
我们给定一个图片就之前我那个头像假如有一个filter它是3 * 3的那么这3 * 3的这个网格它在每一个窗口上都是和这个filter做的运算。
那么大家想一下假如有一个1,000乘以1,000的一个图形我们这1,000 * 1,000的图形我们要把它写成wxb的话这个x是100万维的那么这个w也是100万维的。
那么如果我们要做训练的话就要训练100万个w。这是拟合一个线性变化那么我们如果现在是要去拟合一个卷积假如output channel是10那我们需要拟合的参数是多少
卷积核是3 * 3, 有10个。 那就是9 * 9再乘以10。不管这个地方是1,000 * 1,000还是1万 * 1万我们要拟合的都是卷积核里的这个参数。
我们做一层卷积哪怕给了10个卷积核也是九十个。如果要给它做一层线性变化得100万个这两个相差特别大。
为什么相差这么大是因为不同的位置上用的filter的值是一样的。filter的参数整个图像共享了。这就是卷积神经网络的权值共享。
那么我们现在想一下我们有了这个Parameters Sharing它的作用是什么?
减少参数量的作用是防止过拟合防止过拟合的最终体现就是我们在各种计算机视觉上的任务表现就好。除此之外还有一个特性它可以大大的提升我们的计算速度。
本来我们以前如果你有这么多参数的话要反向传播一次要进行100万个反向传播。现在我们只要进行九十个就行了。
所以权值共享其实是卷积神经网络为什么效果特别好的原因。
2012年的时候计算机视觉的测试效果一下子有了突飞猛进。当时就是因为用了卷积神经网络。
以前大家在实验室环境下在训练集上的效果都挺不错但是一拿到测试集的时候效果就很差。后来用卷积神经网络之后这个错误率一下就下降了。
权值共享这个特性因此带来了一个特点就是Loction Invariant。就是一个局部的东西我们把它信息连接在一块了。
我们分别有两张图片比如下面这张我以前画的一幅画我把构图分别改变一下。 这两个图像数据表征上是很不一样但是眼睛所在的位置经过卷积之后只要用的是同一个卷积核产生的结果是相似的。所以这个Loction Invariant指的意思是不管这个眼睛在哪我们都能提取出来。
假设我们在train的时候, 眼睛不管在哪只要把这个filter训练出来了在test数据集上就算它的位置变了我们依然能够提取出来它的特征依然能够计算出来和它相似的这个值这个就叫做Loction Invariant。
这两个特性是极其重要的。
搭建卷积神经网络这个事说实话最主要的还是要看经验。那么前人的总结就很值得借鉴下节课我们就来看看几种经典的神经网络结构。