几个概念:
Classifacation 是对输入图像做一个分类;
Retrieval是对输入图像找到一个同款;
Detection 是检测出一个物体框;
Segmentation 是对输入图像做一个大量的分割。
把图像如人脸的特征做一步步的提取,最后提取出一个向量。卷积神经网络可以检测细胞病变,可以检测出汉字、车牌。
我们可以让计算机对一副图像进行描述,告诉我们这幅图像是做什么的。计算机有时候会说的很准。
Prisma的APP。可以把自己的图像转换成已有图像的一种风格。类似于一种黑科技。
Loop:
1.Sample a batch of data
2.Forward prop it through the graph,get loss
3.Backprop to calculate the gradients
4.Updata the parameters using the gradient
(梯度传播的链式法则,在后续学习中进行整理)
找到一组最合适的数据,使之能最好地拟合我们的数据······
卷积神经网络和普通的神经网络在结构上发生了很大的变化。
input——conv——relu——pool——fc
暂且把卷积看做一个特征提取的过程,每个卷积核每次从一个小区域提取特征,得到一个数值。
所有小区域的特征组合起来,组成一幅图。我们这个filter的深度需要和输入的深度保持一致。
为了好理解,我们现在只理解二维的。最后我们一个filter找到了一个特征图。
每一个filter要从图像中找到不同的特征。我们把两个filter找到的特征图堆叠在一起,得到最后一张组合的图。
如果我们有六个“助手”,那么我们能得到六张特征图。然后我们把六个特征图叠在一起,即是我们做卷积最后的结果。
每一个卷几层后面,我们都会去连一个激活函数。第一层卷积是对输入数据,第二层是对我们提取好的特征再去提取特征。我们在原有卷积的基础上,再去卷积,再去提取特征,得到了一些高维度的特征。
最终的计算结果不要忘了加上偏置项。一次计算完毕之后,我们去滑动这个filter,stride是步长。3*3的大小在中文中我们称其为感受野。即对于一个神经元来说,它能看到的输入的大小。即一个助手能够帮我们探究的视野的大小。每个助手帮我们找到的特征图是不一样的。
计算公式:[(w-f)/s]+1,w是原来的大小,f是filter的大小,s是步长。我们在选择步长的时候,一定要保证接下来的大小是一个整数。
这样的话,我们特征图的大小是不断减小的。但是这可能并不是我们想要的结果,而不是每次卷积后我们的特征图都变得很小,不利于我们进一步增加卷积层。
这时候我们引入了pading的概念,即我们加入了一个边界,把我们的边界也加入了卷积的过程中。
zero pading。在卷积的过程中,我们更好地利用了我们原始图像的边界值。不管我们进行几层卷积,我们都可以使我们的大小保持不变。
为什么要加0,因为我们要保证我们加入的东西对输入是没有影响的。
这时候我们输入的大小应该如何计算呢?【w-f+2*p】/s+1
f=3——zero pad with 1
f=5——zero pad with 2
f=7——zero pad with 3
对于输入的大小,我们不能只说长宽,必须加上filter的个数。
需要权重参数的个数:在深度为1的特征图上,我们有32*32=1024个神经元。
对于每一个神经元,我们都需要5*5*3=75个参数。
1024*75*深度10=76800个参数······
参数越多,我们过拟合的情况出现的可能性就会越大。
所以这1024个神经元要共享一组权重参数,我们认为所有的神经元它们连接的参数是完全相同的。75*10=750个参数
加上偏置项。750+10=760.
复习整理:输入大小为w1*H1*D1
需要指定的超参数:filter个数(K),filter大小(F),步长(S),边界填充(P)
输出:w2=(w1-F+2P)/S+1
H2=(H1-F+2P)/S+1
D2=K
对于Pooling层,又叫做downsampling。我们通过pading使输入输出的大小相一致。既然卷积层不能明显地改变特征图的大小,
那我们就需要通过池化,对特征图做一个压缩。可以使我们的特征图的大小发生明显的变化。
比如224*224*64通过池化变成了112*112*64
池化的类型有很多,比如Max pooling和average pooling
eg. max pool with 2*2 filters and stride 2,这种操作类似于卷积的计算,只不过卷积是一个相乘求和的过程,而pooling是取其中的最大值或者是平均值的过程。
average pooling现在已经不再常用。因为我们要做的就是一个找特征(最大值)的过程。
2*2的pooling使整幅图的大小变为原来的1/4
一般来说stride为2,pooling一般为2*2或者是3*3
最后我们来说一下全连接层,它和神经网络的全连接层是一样的。我们在每一层卷积后,都要加一个激活函数。
Case Study:AlexNet
Full(simplified)AlexNet architecture
[227*227*3]INPUT
[55*55*96]CONV1:96 11*11 filters at stride 4,pad 0
[27*27*96]MAX POOL1:3*3 filters at stride 2
[27*27*96]NORM1:Normalization layer
[27*27*256]CONV2:256 5*5 filters at stride 1,pad 2
[13*13*256]MAX POOL2:3*3 filters at stride 2
[13*13*256]NORM2:Normalization layer
[13*13*384]CONV3:384 3*3 filters at stride 1,pad 1
[13*13*384]CONV4:384 3*3 filters at stride 1,pad 1
[13*13*256]CONV5:256 3*3 filters at stride 1,pad 1
[6*6*256]MAX POOL3: 3*3 filters at stride 2
[4096]FC6 :4096 neurons
[4096]FC7:4096 nerurons
[1000]FC8:1000 nerurons(class scores)
第一层的filter size为11,这个是比较大,可能只是比较粗略地提取输入图像的特征。
现在已经证明了NORM层是没有什么大的卵用的,所以现在基本抛弃···
第二步5*5说明我们要提取一些更细的特征,在卷积神经网络中,我们进行了一次pooling后,我们的大小发生了明显的变化。
为了使特征图的个数增加,我们要增加filter的个数,使我们的深度增加。有利于我们更好地去表达我们的特征。
pooling每次的大小基本是相同的。3*3,stride=1,pad 1已经证明输入和输出大小是一致的。
全连接是把我们的特征平铺,然后进行一个分类的操作。用softmax进行一个分类即可。
VGGNet有两种版本,16层和19层。VGGNet是一个更细密度的网络提取的过程。表达的效果更好可能是因为其深度更深了。
一个更为明显的趋势,有时深度增加反而效果降低。深度残差网络在后续中介绍。深度残差网络是一个可以达到152层甚至更高的网络。当我们堆叠更多的额网络的时候,效果应该会更好。深度残差网络应该是未来深度学习的一个趋势。
我们要学会计算每一层的参数,对应所需要的内存的大小。全连接的参数比较大,为前一层的特征图的大小再乘以神经元的个数:eg 7*7*512*4096
所以绝大多数的内存都消耗在全连接层上。一个batch能容纳多大就要看我们用的GPU或者CPU的性能了。
最核心的问题:Classifacation和Location:分类和定位
Location时我们不仅要说是否存在,还要将其框出来。接下来会研究怎样同时去完成这两个内容。FastRCNN框架的理解。
比较形象地理解一下回归的概念。最后得到一个高维度的特征,最后我们需要卷积神经网络去给我们计算出一个数值。即给出一些坐标的数值。
我们已经有一个准确的label的值了,我们需要神经网络预测出的框不断去拟合我们的输入。
我们计算Loss的过程使用L2 distance,即计算一个欧式距离。当我们越偏离的时候,这个Loss值越大。每一次通过卷积神经网络预测出一个新的框的时候,都会和原来的框进行比较。我们这个框的位置会发生不断的改变。当Loss值很低是,我们通过反向传播,梯度更新,已经达到一个很收敛的状态。这样的状态我们称为一个回顾的过程。
最后一层有一个feature map,即高维的特征,我们有两个模块,一个要做分类的任务,一个要做回归的任务。
Step1:Train(or download)a Classifacation model(AlexNet,VGG,GoogLet)我们不去做权重初始化,然后逐渐训练出一个好的模型。
我们要做的是finetune,图像数据的不足,初始化的问题等,使我们自己训练的时候可能会不收敛。我们可以参照别人的model,用于参数初始化。比较常见的权重初始化就是设置为高斯权重初始化等。因为已经有的model是很多数据训练出来的,具有良好的鲁棒性。
Step2:Attach new fully-connected“regression head” to the network
Step3:Train the regression head only with SGD and L2 loss
Step4:At test time use both heads
在测试的时候一方面得到分类值,另一方面得到框框。
Where to attach regression head?
有的是直接加在卷积层之后,有的是加在全连接层之后。要根据具体任务具体分析。我们需要实际试一下,然后进行一个准确率的对比。
其实回归的任务应用得非常广。人体姿势的辨别把关键点都连在一起,然后判断人在做什么。第一步是找到这些关键点的坐标。
我们的回归任务就
是去预测这些坐标。最后通过计算L2 distance 使得最后我们预测的点能够完全拟合真实值。
对于分类来说,最经典的就是滑动窗口。每一次得到每个窗口是一个猫的可能性(即这时是一个分类的任务)。
但是这种方法我们需要sliding window的个数很多很多。
在使用的时候我们需要对图像做一个scale变换,我们需要取大量的scale去做一个滑动窗口的计算。
我们做了scale变换后,需要在每一个做了scale变换的图形做一个滑动窗口。
Localization Error(Top 5)深度残差网络在内部加入了一些模块。今后我们做一些东西的时候,我们要做的是ResNet。