CS231n note

5.1 CNN_history

now:



5.2 CNN

上节课我们谈到了全连接层的概念:

对于全连接层而言,我们要做的就是在这些向量上进行操作。

例如:

但是至于卷积层,与前者截然不同的地方就是可以保持空间结构

例如下图:

一张32×32×3的图片,我们并非将它展成长向量,而是保持图片的结构。这个三维输入的结构,变成5×5×3

我们将卷积核在图片上滑动,计算出每一个空间定位时的点积结果。

首先我们采用的卷积核总是会将输入量扩展至完全,所以它们一般是很小的区域,比如这里的5×5×3

然后我们用这个卷积核,在图片和卷积核之间进行卷积运算。——我们要做的就是在图片空间区域上覆盖这个卷积核,然后进行点积运算——也就是将卷积核每个位置元素和与之对应图像区域的像素值相乘,这个区域是从图像上取出的。运算之后我们会得到一个点积结果

这个例子中,我们进行了5×5×3次运算,这个乘法运算的次数,之后我们再加上偏置项。

接下来我们的问题就是:我们如何滑动卷积核并遍历所有空间位置??

从左上角开始,一直滑动并计算

但我们要先决定:你是否按像素逐个滑动的,或者其他滑动方式。

所以:刚才的例子中,我们采用了一卷积核,然后将它在图像的整个平面进行滑移,然后我们输出它的激活映射。

它里面的值就是卷积核在每个位置求得的结果。

当我们在处理卷积层中,我们希望运用多个卷积核。因为每一个卷积核都可以得到一种特殊的模式或者概念。

所以我们会有一组卷积核。

如图:(一个蓝的一个绿的)

同样我们可以进一步:用6个卷积核

这样我们就得到一个6层的激活映射

我们来描述一下如何在卷积神经网络之中使用这些卷积层?

我们的ConvNet基本上是由多个卷积层组成的一个序列,它们依次堆叠,像是在堆叠简单的线性层一样。

之后我们将用激活函数逐一进行处理

如图:

使用多个卷积核,然后每一个卷积核都有一个激活函数

然后结果是你可以把处理好了的叠成一个ConvNet

最后就是学习好了的。

来几个例子:

这是由每个卷积核生成的一些激活函数的例子

当然我们进行了可视化:

例子2:

回到我们第一个的那个32×32×3的图。看看卷积核是如何在图片上滑动并计算的

如图,一直滑动,就像滑动窗口一样。

当然,我们也可以每次滑过2个像素点或者3个之类的。

这取决于实际要求了。

但是,如果我们采用3个像素步伐的话:

这不能匹配!

所以我们要慎重选择!

我们再看一下我们如何计算输出尺寸:可以归纳为一个公式

Output size:

(N - F) / stride + 1

注意,这个公式只有边缘没有被填充的时候才适用

例子:

显然,3的时候不能成功。

最后,我们采用0来填充边界来得到最后我们想要的大小。所以这样我们完全可以在左上角放上一个卷积核

(7 - 1) / 1 + 1 = 7

若是边缘填充了1圈的话,我们还需要一个新的输出。就变成了 9 了(从图像边缘扫描,每行比原来多扫描了2个单元)

  • 问题1: 0填补是否在角落增加了一些而外的特征?

    0填补只是我们得到一些值的一种方式,以此来处理那个图像范围的事。当然,我们也可以通过其他方式,比如扩充或者复制等等。
  • 问题2:如果我们有非方形图片,我们需要会使用横纵不同的步伐吗?

    这没什么问题,但实际上通常是相同的步伐,因为我们一般处理方形的图片。
  • 问题3:为什么我们要做0填补?

    我们做0填补的方式是保持我们之前的输入大小相同。因为我们用卷积核扫描的时候一般会得到一个尺寸比较小的,但我们又想使之全尺寸输出。

    例如在深度神经网络当中,有很多卷积核,这样操作的话会使图片的大小迅速减小,这并不是我们想要的。这会损失一些信息,来表示原始图像。同时,关于图片边角的信息也会失去很多

所以总结一下:要考虑:步长(stride),卷积核(filter),卷积核大小,步长大小,零填充

一般卷积核大小会3×3,5×5,7×7

这都是很常用的

例子:

很容易得到答案。

但是:这一层的参数有多少?

一定要记住我们还有一个偏置项!

总结:

另一方面,我们也可以用1*1的点积

也可以在这个深度上进行计算,但是就是比较麻烦就是 了

最后,我们可以进到caffe或者torch上看看卷积核详细定义

cs231n__5.1/5.2 CNN的更多相关文章

  1. Deep learning:五十一(CNN的反向求导及练习)

    前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文 ...

  2. 卷积神经网络(CNN)学习算法之----基于LeNet网络的中文验证码识别

    由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013+Python2.7.12环境下的C ...

  3. 如何用卷积神经网络CNN识别手写数字集?

    前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...

  4. CNN车型分类总结

    最近在做一个CNN车型分类的任务,首先先简要介绍一下这个任务. 总共30个类,训练集图片为车型图片,类似监控拍摄的车型图片,训练集测试集安6:4分,训练集有22302份数据,测试集有14893份数据. ...

  5. CNN初步-2

    Pooling 为了解决convolved之后输出维度太大的问题 在convolved的特征基础上采用的不是相交的区域处理     http://www.wildml.com/2015/11/unde ...

  6. 基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法

    基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法 Siamese CNN Temporally Constrained Metrics T ...

  7. [Keras] mnist with cnn

    典型的卷积神经网络. Keras傻瓜式读取数据:自动下载,自动解压,自动加载. # X_train: array([[[[ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0. ...

  8. tensorflow学习笔记五:mnist实例--卷积神经网络(CNN)

    mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的.但是CNN层数要多一些,网络模型需要自己来构建. 程序比较复杂,我就分成几个部分来叙述. 首先,下载并加载数据: import ...

  9. 使用caffe训练自己的CNN

    现在有这样的一个场景:给一张行人的小矩形框图片, 根据该行人的特征识别出性别. 分析: (1),行人的姿态各异,变化多端.很难提取图像的特定特征 (2),正常人肉眼判别行人的根据是身材比例,头发长度等 ...

  10. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

随机推荐

  1. 【原创】推流录屏软件OBS使用教程--录屏

    之前有录屏需要,写了一篇关于ffmpeg录屏的文章,反响还不错,但是直接用ffmpeg门槛有些高,今天写一篇图形界面的录屏推流工具OBS的使用教程.这次先写OBS的录屏教程 下载安装 点击 OBS官网 ...

  2. 2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化

    接上回 上一篇我们简单介绍了基于SpringBoot实现简单的Web开发,本节来看Web开发中必不可少的内容--数据持久化 先看项目结构: 1. 创建数据表 打开mysql,打开数据库 test (没 ...

  3. Linux+Wine玩GTA5指南

    如果你的系统没有Wine先装Wine和winetricks,Wine在各大发行版的源都能找到.记住32位和64位的Wine都要装 安装wget后,输入指令 sudo -s cd /opt mkdir ...

  4. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  5. TensorFlow搭建模型方式总结

    引言 TensorFlow提供了多种API,使得入门者和专家可以根据自己的需求选择不同的API搭建模型. 基于Keras Sequential API搭建模型 Sequential适用于线性堆叠的方式 ...

  6. ARC144 D - AND OR Equation

    ARC144 D - AND OR Equation Solution 首先可以猜测和答案仅和每一个二进制位以及\(f(0)\)有关系,不妨把按位\(\operatorname{AND}\)和按位\( ...

  7. 『现学现忘』Git分支 — 38、Git分支介绍

    目录 1.Git分支简介 2.Git分支与SVN分支的区别 3.工作中为什么要使用分支 4.Git分支管理的好处 1.Git分支简介 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着,你可 ...

  8. Vue中组件化编码使用(实战练习一)

    Vue中组件化编码的大致流程(初接触).组件之间的参数传递(最基础的形式).组件之间的配合完成一个需求 1.在Vue中进行组件化编码 1.1.组件化编码流程: (1).拆分静态组件:组件要按照功能点拆 ...

  9. 在vue中_this和this的区别

    _this只是一个变量名,this代表父函数,如果在子函数还用this,this的指 向就变成子函数了,_this就是用来存储指向的 普通函数中的this表示调用此函数时的对象,箭头函数里面的this ...

  10. 5.@pytest.mark.parametrize()数据驱动

    简介: pytest.mark.parametrize 是 pytest 的内置装饰器,它允许你在 function 或者 class 上定义多组参数和 fixture 来实现数据驱动. @pytes ...