Mitchy
今日もキラキラしていこう♪

如果你知道你的数据具体是什么内容(图片,一系列东西),能把模型训练得比一般普适的模型要好得多。

比如说在做数字、字母识别的时候,我们知道识别只和形状有关和颜色无关,我们就可以不用RGB的参数而只用灰度输入。

又比如在做图像识别的时候,猫片被识别为猫和猫在图片的哪里并没有关系(translation invariance)。(CNN)

再比如做文本处理的时候,同一个单词的意思(小猫)大概率是同一个意思(同一个实体),所以我们希望模型能记住这个东西的意思而不是见到一次就又学习一次。(RNN)

-> weight sharing

 

CNN (COVNETS):在空间层面上共享参数的神经网络

输入的图片有长,宽【feature map】还有高【depth】(这里高指颜色,灰度就是1,RGB就是3),用一个小窗【filter】一步步【stride】一点点扫过整个图片,每次只处理一个小窗大小的图片【patch/kernel】,得到一个更小更厚的输出就是卷积,如果层数很多的话得到的输出就越细长,然后这个输出就可以作为正常神经网络classifier的输入了。

valid padding:小窗扫过图片的时候边上不好扫的就不管了

same padding:小窗超过图片边界,超过的部分标为0,输出图和输入图的大小会保持一致

CNN的层级:

  最低一级找到基本的线和颜色块

  再往上一级找更复杂的形状(线的组合)

  最终组成我们想要识别的图像整体

CNN网络会自己学习自己提取特征,不需要人教,非常鹅妹子嘤!

CNN的精髓:把距离相近的像素点看做一个整体,这些像素挨得近是有它的原因的,所以CNN利用这点来学习图片中的形状和物体。

小窗【filter】可以不只有一个,每个小窗的关注点可以各不相同,比如特定颜色,特定形状等。小窗的数量叫做filter depth。

小窗连接的节点数?下一层输出的深度,这个深度代表了有多少特征我们希望提取,所以我们希望保证所有重要的特征都被提取出来。

 

回到这个问题,猫片被识别为猫和猫在图片的哪里并没有关系(translation invariance),我们只需要把权重和偏差值在每个地方都设置得一样就行了。但是层与层之间的w和b还是不会共享的。

并且权重和偏差的共享可以避免每次学习很多新w与b,使模型更小,适应性更好。

下一层输出的宽度 = 【(上一层宽度 - filter宽度 + 2 * padding)/ stride】+ 1

注意在TensorFlow里面下一层的大小不是这么计算的,具体可以查看官方文档:https://www.tensorflow.org/api_guides/python/nn#Convolution

总结一下就是SAME Padding:下一层输出的宽度 = ceil(上一层宽度 )/ stride

      VALID Padding:下一层输出的宽度 = ceil(上一层宽度 - filter宽度 + 1)/ stride】

函数:tf.nn.conv2d(input, weight, strides=[batch, input_height, input_width, input_channels], padding='SAME'), tf.nn.bias_add(conv_layer, bias), tf.nn.relu(conv_layer)

上面strides参数中1,4项一般为1,主要调整输入长宽的步长。

如果没有parameter sharing的话每个输出层的节点都要连接filter的每个节点加上一个bias节点,参数就会很多很多;

如果有parameter sharing的话参数数量就是filter中节点数加上一个bias节点再乘以输出层的channel(高)

 

视觉化CNN

CNN是在ImageNet上训练的,放个链接看看能不能点开:https://www.matthewzeiler.com/pubs/arxive2013/eccv2014.pdf

再来一个:https://www.youtube.com/watch?v=ghEmQSxT6tw

CNN学习、认出的东西:

第一层:非常简单的东西,比如对角线和绿色的色块等

第二层:稍微复杂点的东西,比如圆圈和条纹,还有直角

第三层:第二层中东西的复杂组合,比如网格,蜂巢,轮胎,甚至人脸

第四层:类似第三层,跳过

第五层:CNN最后一层,输出最后需要被识别的东西,比如狗,鸟和自行车

 

COVNET-OLOGY进阶

1. Pooling

如max pooling,做一个点周围的卷积取最大值

优点:减少输入大小,让神经网络关注最重要的东西。不会增加参数,会更精确,计算强度变大,需要调整pooling size和pooling stride

conv_layer = tf.nn.max_pool(conv_layer, ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

ksize和strides的四个参数分别代表[batch, height, width, channels],一般batch和channels都设为1。

还有average pooling,取平均值,好像得到了一个分辨率更低的模糊图

2. 1*1 convolutions

在普通的CNN中间加一层1*1的中间层,将只有线性分类计算的CNN变得更复杂又不会增加很多计算负担,像有了一个小型神经网络

3. Inception modules

把之前提到的各种方法组合起来,能拥有比较好的结果同时需要调整的参数也不会很多

 

扩展阅读:

https://cs231n.github.io/

http://neuralnetworksanddeeplearning.com/

http://www.deeplearningbook.org/

posted on 2020-09-03 22:59  Mitchy  阅读(151)  评论(0编辑  收藏  举报