Deep Learning

Posted bairuiworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Deep Learning相关的知识,希望对你有一定的参考价值。

Deep Learning

一、Framework

1. MobileNet

将标准卷积拆分成两部,第一次卷积不进行channel间卷积(逐层卷积:depthwise convolution),即一个输入channel对应一个卷积滤波器;第二次只进行channel间卷积,即使用1x1卷积核。如图,原来的参数个数为,现在变为,参数个数整体减少N倍。

MobileNet
MobileNet

2. ShuffleNet

以前Inception网络group时,各个通道之间都是独立的,现在将各个通道打乱,增强通道间的交互信息。

ShuffleNet
ShuffleNet

ShuffleNet使用类似MobileNet的网络,就是增加了通道间的shuffle,去掉了ReLU。先1x1 pointwise conv, 然后shuffle, 再进行3x3 Detpthwise conv,作者说1x1, 3x3的顺序不重要。

ShuffleNet Unit
ShuffleNet Unit

实验结果:

performance
performance

相对于MobileNet,ShuffleNet的前向计算量不仅有效地得到了减少,而且分类错误率也有明显提升,验证了网络的可行性。

3. Network in Network

利用 Mlpconv 和 全局平均 pooling 建立了 Network in Network 网络结构。

Mlpconv: mlpcon 指的是: multilayer perceptron + convolution;

mlpconv
mlpconv

过程如下:
假设上面的第三个图中的输入为2*(4 4), 输出为2 * (33)时:

  1. 第一层的卷积核大小为2*2, 步长为1, 输入为2*(4 *4), 输出为 4*(3*3);
  2. 第二层的卷积核大小为1*1, 步长为1, 输入为4*(3 *3), 输出为 3*(3*3);
  3. 第三层的卷积核大小为1*1, 步长为1, 输入为3*(3 *3), 输出为 2*(3*3);

后面两层的卷积核大小为1x1,意味着每个卷积核只进行不同通道间的累加,而不进行同一个Feature Map上的卷积,保证Feature Map大小不变。整个mlpconv的效果就相当于使用了第一层的卷积核大小,第三层的通道数的一层卷积。但好处是复杂的结构增加了网络的非线性,使网络表征非线性能力增强。文中也说明了 NIN比 maxout networks 更 non-linearity;

mlpconv
mlpconv

全局平均池化:即每个feature map平均池化成一个值,如果有m个通道,就会生成一个m维的向量(传统方法使用全连接层生成固定维度向量,但全连接层需要参数多,容易过拟合,dropout可以缓解这个问题),然后使用softmax分类:

global average pooling
global average pooling

http://blog.csdn.net/diamonjoy_zone/article/details/70229148
https://www.cnblogs.com/yinheyi/p/6978223.html

4. Mask RCNN(ICCV 2017 Best paper)

Mask RCNN architecutre
Mask RCNN architecutre

原来的分割都是对整张图片的所有目标进行多分类,输入一张图片,会输出一张整体的mask,如下图左边。

作者现在用分类框来辅导分割,那么现在在分类框内做分割只需要做二分类,减少其它的干扰。同时,作者将分类工作与分割工作进行解耦,分类和分割是两个过程,先分类,在对每个分类框进行分割。如下图左边所示。

mask rcnn
mask rcnn

http://blog.csdn.net/linolzhang/article/details/71774168

5. GoogleNet Inception

使用了1×1,3×3,5×5的卷积核,又因为pooling也是CNN成功的原因之一,所以把pooling也算到了里面,然后将结果在拼起来。

Inception
Inception

发展:
Inception V1, V2, V3, V4
Inception-Resnet V1, V2

Inception V1——构建了1x1、3x3、5x5的 conv 和3x3的 pooling 的分支网络,同时使用 MLPConv 和全局平均池化,扩宽卷积层网络宽度,增加了网络对尺度的适应性;

Inception V2——提出了 Batch Normalization,代替 Dropout 和 LRN,其正则化的效果让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高,同时学习 VGG 使用两个3´3的卷积核代替5´5的卷积核,在降低参数量同时提高网络学习能力;

Inception V3——引入了 Factorization,将一个较大的二维卷积拆成两个较小的一维卷积,比如将3x3卷积拆成1x3卷积和3x1卷积,一方面节约了大量参数,加速运算并减轻了过拟合,同时增加了一层非线性扩展模型表达能力,除了在 Inception Module 中使用分支,还在分支中使用了分支(Network In Network In Network);

Inception V4——设计了一个更深更优化的 Inception v4 模型。另外研究了 Inception Module 结合 ResNet,inception-resnet-v1, inception-resnet-v2 可以极大地加速训练,同时极大提升性能。而Inception v4可以达到和inception-resnet-v2 相媲美的性能。

http://blog.csdn.net/stdcoutzyx/article/details/51052847
http://blog.csdn.net/yuanchheneducn/article/details/53045551

6. SqueezeNet

作者提出了一个类似inception的网络单元结构,取名为fire module。使用这个模块代替原始的3x3卷积,一个fire module 包含一个squeeze 卷积层(只包含1x1卷积核)和一个expand卷积层(包含1x1和3x3卷积核)。其中,squeeze层借鉴了inception的思想,利用1x1卷积核来降低输入到expand层中3x3卷积核的输入通道数。

Squeeze
Squeeze

相比传统的压缩方法,SqueezeNet能在保证精度不损(甚至略有提升)的情况下,达到最大的压缩率,将原始AlexNet从240MB压缩至4.8MB,而结合Deep Compression后更能达到0.47MB,完全满足了移动端的部署和低带宽网络的传输。

perormance
perormance

7. Deep Compression

《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》

进行权重文件压缩:

流程
流程

1、Pruning(权值剪枝)
2、Quantization (权值量化) codebook
3、Huffman encoding(霍夫曼编码)

http://blog.csdn.net/QcloudCommunity/article/details/77719498

8. MoblieNet-SSD

SSD的MobileNet实现,caffemodel大小只有22.1M左右。

9. RetinaNet, Focol Loss (ICCV 2017 Best Student paper)

深度学习目标检测主要有两种方法:

  • 两步检测,如RCNN、Faster RCNN,这样的检测效果好,但速度慢
  • 一步检测,如YOLO、SSD,这样的检测速度快,但效果稍差。

作者改进了损失函数,使得在效果、速度上都取得了较好的效果。

二分类问题的原始交叉熵损失函数:

cross entropy
cross entropy

作者做了两方面改进,一个是针对样本不均衡的问题,如果一个类别样本少,它的权重就要大一些。作者用来调节样本少的类,用一类的调节参数即为

class imbanlance
class imbanlance

作者另一方面在分类错误度上进行惩罚,分类偏离越大,惩罚的权重也应该越大。

classify factor
classify factor

虽然cross_entroy在设计上对分类偏离越大的样本给予越大的损失,但作者想加入一个调节因子可以加大调节力度。如果分类概率为0.2, 那么结果为,可以看见当分类正确概率越低,前面的调节因子可以起到加大这种loss的作用;当分类正确概率接近1的时候,前面的调节因子就会很小,导致最后的损失函数变小,这正是想要的结果:惩罚大的分类误差。

最后,作者结合两者,给出了最后的损失函数形式:

final expression
final expression

tensorflow实现:

  1. import tensorflow as tf 
  2. from tensorflow.python.ops import array_ops 
  3.  
  4. def focal_loss(prediction_tensor, target_tensor, weights=None, alpha=0.25, gamma=2): 
  5. r"""Compute focal loss for predictions. 
  6. Multi-labels Focal loss formula: 
  7. FL = -alpha * (z-p)^gamma * log(p) -(1-alpha) * p^gamma * log(1-p) 
  8. ,which alpha = 0.25, gamma = 2, p = sigmoid(x), z = target_tensor. 
  9. Args: 
  10. prediction_tensor: A float tensor of shape [batch_size, num_anchors, 
  11. num_classes] representing the predicted logits for each class 
  12. target_tensor: A float tensor of shape [batch_size, num_anchors, 
  13. num_classes] representing one-hot encoded classification targets 
  14. weights: A float tensor of shape [batch_size, num_anchors] 
  15. alpha: A scalar tensor for focal loss alpha hyper-parameter 
  16. gamma: A scalar tensor for focal loss gamma hyper-parameter 
  17. Returns: 
  18. loss: A (scalar) tensor representing the value of the loss function 
  19. """ 
  20. sigmoid_p = tf.nn.sigmoid(prediction_tensor) 
  21. zeros = array_ops.zeros_like(sigmoid_p, dtype=sigmoid_p.dtype) 
  22.  
  23. # For poitive prediction, only need consider front part loss, back part is 0; 
  24. # target_tensor > zeros <=> z=1, so poitive coefficient = z - p. 
  25. pos_p_sub = array_ops.where(target_tensor > zeros, target_tensor - sigmoid_p, zeros) 
  26.  
  27. # For negative prediction, only need consider back part loss, front part is 0; 
  28. # target_tensor > zeros <=> z=1, so negative coefficient = 0. 
  29. neg_p_sub = array_ops.where(target_tensor > zeros, zeros, sigmoid_p) 
  30. per_entry_cross_ent = - alpha * (pos_p_sub ** gamma) * tf.log(tf.clip_by_value(sigmoid_p, 1e-8, 1.0)) \\ 
    /deep/和;;;和::v-deep

    >>>和/deep/和::v-deep

    >>>和/deep/和::v-deep

    >>>和/deep/和::v-deep

    集智学院 “Deep X:Deep Learning with Deep Knowledge”的公开讲座---总结

    reinforcement learning和deep learning的区别