CNN一般结构

卷积层作用:

  1. 提取不同维度的特征,组合不同维度特征,其本质是卷积核,因此,学习一个有效的总卷积核是训练卷积层主要工作

    2)寻找不同位置,不同大小的特征

  2. 根据卷积核参数计算上下层blob之前维度关系
input => conv => output:
out = (W-F+2*P)/S + 1
W:input的尺寸
F:kernel的尺寸
S:步长
P:padding的数量

非线性层

控制对不同特征特征信号所应当作出的反应

如,RELU:

\[f(x)=max(0,x)
\]

  1. 对低强度特征信息不做反应,超过阈值后,强度越大,反应相应越大
  2. 阈值一般为0,因此样本数据与特征也尽量零均值,这可能是训练数据归一化及batchnormalization的原因

池化层

  1. 降采样:将高维特征稀疏为低维特征

    2)可以增强模型对特征畸变的鲁棒性,如手写数字笔记不工整

dropout:

打破网络的对称性,使网络结构不断重构,防止网络过拟合;

具体实现直接看源码dropout_layer.cppdropout_layer.hpp

前传过程中,bottom计算出的部分特征不参与前传过程的计算

void DropoutLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
const Dtype* bottom_data = bottom[0]->cpu_data();
Dtype* top_data = top[0]->mutable_cpu_data();
unsigned int* mask = rand_vec_.mutable_cpu_data(); //从cpu中取一段可读写的内存,返回指针mask
const int count = bottom[0]->count(); //mutable_cpu_data表示可读写的内存,而cpu_data表示只读内存
if (this->phase_ == TRAIN) {
// Create random numbers
caffe_rng_bernoulli(count, 1. - threshold_, mask); //将mask内容部分以伯努利概率置为0,置0的概率与threshold有关
for (int i = 0; i < count; ++i) {
top_data[i] = bottom_data[i] * mask[i] * scale_; //用mask掩码将bottom_data中部分特征设为死结点,不参与前传中loss的计算
}
} else {
caffe_copy(bottom[0]->count(), bottom_data, top_data);
}
}

在反传过程中,上层梯度回传时至下层时,同样会一部分被mask屏蔽,而且这个maskg前传一致,保证了前传与反传过程看到的网络结构是一致的

template <typename Dtype>
void DropoutLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {
if (propagate_down[0]) {
const Dtype* top_diff = top[0]->cpu_diff();
Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
if (this->phase_ == TRAIN) {
const unsigned int* mask = rand_vec_.cpu_data(); //将前传时写入mask内容重新赋值mask指针
const int count = bottom[0]->count();
for (int i = 0; i < count; ++i) {
bottom_diff[i] = top_diff[i] * mask[i] * scale_; //同样,反传过程也屏蔽了部分梯度,这样在一次前传与反传过程中所看见的网络结构实际就相同了,
} //得到bottom梯度后会给cpu或gpu进行solver的update
} else {
caffe_copy(top[0]->count(), top_diff, bottom_diff);
}
}
}

其中,mask初始化用到了一个 caffe_rng_bernoulli,在这篇文章中提到,其实它主要调用了boost::bernoulli_distribution,将向量初始化为一定比例的1其余为0

参考

dropout_layer

CNN基础的更多相关文章

  1. CNN基础框架简介

    卷积神经网络简介 卷积神经网络是多层感知机的变种,由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来.视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,我们称之为感受野 ...

  2. 卷积神经网络(CNN)基础介绍

    本文是对卷积神经网络的基础进行介绍,主要内容包含卷积神经网络概念.卷积神经网络结构.卷积神经网络求解.卷积神经网络LeNet-5结构分析.卷积神经网络注意事项. 一.卷积神经网络概念 上世纪60年代. ...

  3. CNN基础一:从头开始训练CNN进行图像分类(猫狗大战为例)

    本文旨在总结一次从头开始训练CNN进行图像分类的完整过程(猫狗大战为例,使用Keras框架),免得经常遗忘.流程包括: 从Kaggle下载猫狗数据集: 利用python的os.shutil库,制作训练 ...

  4. CNN基础四:监测并控制训练过程的法宝——Keras回调函数和TensorBoard

    训练模型时,很多事情一开始都无法预测.比如之前我们为了找出迭代多少轮才能得到最佳验证损失,可能会先迭代100次,迭代完成后画出运行结果,发现在中间就开始过拟合了,于是又重新开始训练. 类似的情况很多, ...

  5. CNN基础三:预训练模型的微调

    上一节中,我们利用了预训练的VGG网络卷积基,来简单的提取了图像的特征,并用这些特征作为输入,训练了一个小分类器. 这种方法好处在于简单粗暴,特征提取部分的卷积基不需要训练.但缺点在于,一是别人的模型 ...

  6. CNN基础二:使用预训练网络提取图像特征

    上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始 ...

  7. 深度学习笔记之CNN(卷积神经网络)基础

    不多说,直接上干货! 卷积神经网络(ConvolutionalNeural Networks,简称CNN)提出于20世纪60年代,由Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经 ...

  8. AndrewNG Deep learning课程笔记 - CNN

    参考, An Intuitive Explanation of Convolutional Neural Networks http://www.hackcv.com/index.php/archiv ...

  9. Paper/ Overview | CNN(未完待续)

    目录 I. 基础知识 II. 早期尝试 1. Neocognitron, 1980 2. LeCun, 1989 A. 概况 B. Feature maps & Weight sharing ...

随机推荐

  1. 【linux】/dev/null与/dev/zero详解

    引用别人的资源,收藏: http://www.cnblogs.com/xianghang123/archive/2012/03/23/2413381.html

  2. Python相关资料收集

    读写Excel: http://blog.csdn.net/five3/article/details/7034826http://tech.ddvip.com/2012-10/13515777031 ...

  3. 洛谷P1943 LocalMaxima_NOI导刊2009提高(1)(分段打表)

    显然只需要算出每个数比前面所有数大的期望然后全部加起来就好了,一个数的期望怎么算呢? 对于一个数我们需要考虑比它大的数,因为比它小的数放它前面放它后面都可以,但是比它大的数只能放它后面.考虑大于等于它 ...

  4. python基础----模块、包

    一 模块                                                                                                 ...

  5. ORACLE 中如何截取到时间的年月日中的年、月、日

    在Oracle中,要获得日期中的年份,例如把sysdate中的年份取出来,并不是一件难事.常用的方法是:Select to_number(to_char(sysdate,'yyyy')) from d ...

  6. bzoj 4347 [POI2016]Nim z utrudnieniem DP

    4347: [POI2016]Nim z utrudnieniem Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 733  Solved: 281[Su ...

  7. isNaN与parseInt/parseFloat

    isNaN 返回一个 Boolean 值,指明提供的值是否是保留值 NaN (不是数字). NaN 即 Not a Number isNaN(numValue) 必选项 numvalue 参数为要检查 ...

  8. (转)JAVA 十六个常用工具类

    一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在finally块 toString ...

  9. 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情

    [测试代码] HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. Productivity tips, tricks and hacks for academics (2015 edition)

    Productivity tips, tricks and hacks for academics (2015 edition) Contents Jump to: My philosophy: Op ...