Convolutional Networks

转载请注明作者:梦里风林

Github工程地址:https://github.com/ahangchen/GDLnotes

欢迎star,有问题可以到Issue区讨论

官方教程地址

视频/字幕下载

deep dive into images and convolutional models

Convnet

BackGround

  • 人眼在识别图像时,往往从局部到全局
  • 局部与局部之间联系往往不太紧密
  • 我们不需要神经网络中的每个结点都掌握全局的知识,因此可以从这里减少需要学习的参数数量

Weight share

  • 但这样参数其实还是挺多的,所以有了另一种方法:权值共享

Share Parameters across space

  • 取图片的一小块,在上面做神经网络分析,会得到一些预测

  • 将切片做好的神经网络作用于图片的每个区域,得到一系列输出

  • 可以增加切片个数提取更多特征

  • 在这个过程中,梯度的计算跟之前是一样的

Concept

  • Patch/Kernel:一个局部切片
  • Depth: 数据的深度,图像数据是三维的,长宽和RGB,神经网络的预测输出也属于一维
  • Feature Map:每层Conv网络,因为它们将前一层的feature映射到后一层(Output map)

  • Stride: 移动切片的步长,影响取样的数量
  • 在边缘上的取样影响Conv层的面积,由于移动步长不一定能整除整张图的像素宽度,不越过边缘取样会得到Valid Padding, 越过边缘取样会得到Same Padding
  • Example

  • 用一个3x3的网格在一个28x28的图像上做切片并移动
  • 移动到边缘上的时候,如果不超出边缘,3x3的中心就到不了边界
  • 因此得到的内容就会缺乏边界的一圈像素点,只能得到26x26的结果
  • 而可以越过边界的情况下,就可以让3x3的中心到达边界的像素点
  • 超出部分的矩阵补零就行

Deep Convnet

在Convnet上套Convnet,就可以一层一层综合局部得到的信息

OutPut

将一个deep and narrow的feature层作为输入,传给一个Regular神经网络

Optimization

Pooling

将不同Stride的卷积用某种方式合并起来,节省卷积层的空间复杂度。

  • Max Pooling

    在一个卷积层的输出层上取一个切片,取其中最大值代表这个切片
  • 优点
    • 不增加需要调整的参数
    • 通常比其他方法准确
  • 缺点:更多Hyper Parameter,包括要取最值的切片大小,以及去切片的步长

LENET-5, ALEXNET

  • Average Pooling

    在卷积层输出中,取切片,取平均值代表这个切片

1x1 Convolutions

在一个卷积层的输出层上,加一个1x1的卷积层,这样就形成了一个小型的神经网络。

  • cheap for deeper model
  • 结合Average Pooling食用效果更加

Inception

对同一个卷积层输出,执行各种二次计算,将各种结果堆叠到新输出的depth方向上

TensorFlow卷积神经网络实践

数据处理

  • dataset处理成四维的,label仍然作为one-hot encoding
  1. def reformat(dataset, labels, image_size, num_labels, num_channels):
  2. dataset = dataset.reshape(
  3. (-1, image_size, image_size, num_channels)).astype(np.float32)
  4. labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32)
  5. return dataset, labels
  • 将lesson2的dnn转为cnn很简单,只要把WX+b改为conv2d(X)+b即可
  • 关键在于conv2d

`conv2d

  1. tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

给定四维的inputfilter tensor,计算一个二维卷积

Args:
  • input: A Tensor. type必须是以下几种类型之一: half, float32, float64.
  • filter: A Tensor. type和input必须相同
  • strides: A list of ints.一维,长度4, 在input上切片采样时,每个方向上的滑窗步长,必须和format指定的维度同阶
  • padding: A string from: "SAME", "VALID". padding 算法的类型
  • use_cudnn_on_gpu: An optional bool. Defaults to True.
  • data_format: An optional string from: "NHWC", "NCHW", 默认为"NHWC"

    指定输入输出数据格式,默认格式为"NHWC", 数据按这样的顺序存储:

    [batch, in_height, in_width, in_channels]

    也可以用这种方式:"NCHW", 数据按这样的顺序存储:

    [batch, in_channels, in_height, in_width]
  • name: 操作名,可选.
Returns:

A Tensor. type与input相同

Given an input tensor of shape [batch, in_height, in_width, in_channels]

and a filter / kernel tensor of shape

[filter_height, filter_width, in_channels, out_channels]

conv2d实际上执行了以下操作:

  1. 将filter转为二维矩阵,shape为

    [filter_height * filter_width * in_channels, output_channels].
  2. 从input tensor中提取image patches,每个patch是一个virtual tensor,shape[batch, out_height, out_width, filter_height * filter_width * in_channels].
  3. 将每个filter矩阵和image patch向量相乘

具体来讲,当data_format为NHWC时:

  1. output[b, i, j, k] =
  2. sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
  3. filter[di, dj, q, k]

input 中的每个patch都作用于filter,每个patch都能获得其他patch对filter的训练

需要满足strides[0] = strides[3] = 1. 大多数水平步长和垂直步长相同的情况下:strides = [1, stride, stride, 1].


  • 然后再接一个WX+b连Relu连WX+b的全连接神经网络即可

Max Pooling

在tf.nn.conv2d后面接tf.nn.max_pool,将卷积层输出减小,从而减少要调整的参数

max_pool

  1. tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)

Performs the max pooling on the input.

Args:
  • value: A 4-D Tensor with shape [batch, height, width, channels] and

    type tf.float32.
  • ksize: A list of ints that has length >= 4. 要执行取最值的切片在各个维度上的尺寸
  • strides: A list of ints that has length >= 4. 取切片的步长
  • padding: A string, either 'VALID' or 'SAME'. padding算法
  • data_format: A string. 'NHWC' and 'NCHW' are supported.
  • name: 操作名,可选
Returns:

A Tensor with type tf.float32. The max pooled output tensor.


优化

仿照lesson2,添加learning rate decay 和 drop out,可以将准确率提高到90.6%

参考链接

觉得我的文章对您有帮助的话,给个star可好?

土豪可以打赏支持,一分也是爱:

TensorFlow 深度学习笔记 卷积神经网络的更多相关文章

  1. TensorFlow深度学习笔记 循环神经网络实践

    转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程地址 视频/字幕下载 加 ...

  2. 深度学习之卷积神经网络CNN及tensorflow代码实例

    深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...

  3. 深度学习之卷积神经网络CNN及tensorflow代码实现示例

    深度学习之卷积神经网络CNN及tensorflow代码实现示例 2017年05月01日 13:28:21 cxmscb 阅读数 151413更多 分类专栏: 机器学习 深度学习 机器学习   版权声明 ...

  4. 深度学习之卷积神经网络(CNN)的应用-验证码的生成与识别

    验证码的生成与识别 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10755361.html 目录 1.验证码的制 ...

  5. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

  6. Google TensorFlow深度学习笔记

    Google Deep Learning Notes Google 深度学习笔记 由于谷歌机器学习教程更新太慢,所以一边学习Deep Learning教程,经常总结是个好习惯,笔记目录奉上. Gith ...

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

    卷积神经网络(CNN)因为在图像识别任务中大放异彩,而广为人知,近几年卷积神经网络在文本处理中也有了比较好的应用.我用TextCnn来做文本分类的任务,相比TextRnn,训练速度要快非常多,准确性也 ...

  8. 深度学习之卷积神经网络(CNN)详解与代码实现(二)

    用Tensorflow实现卷积神经网络(CNN) 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10737065. ...

  9. 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...

随机推荐

  1. gcc编译通过,运行却显示“段错误”的解决方法

    ​第一次在Liunx上(liunx mint 17)使用gcc编译c文件,竟然提示“找不到stdio.h",经过google后发现执行 sudo apt-get install build- ...

  2. linux多线程编程之互斥锁

    多线程并行运行,共享同一种互斥资源时,需要上互斥锁来运行,主要是用到pthread_mutex_lock函数和pthread_mutex_unlock函数对线程进行上锁和解锁 下面是一个例子: #in ...

  3. 观点:哪些人适合做FPGA开发?(转)

    原文:http://xilinx.eetrend.com/blog/561 FPGA目前非常火,各个高校也开了FPGA的课程,但是FPGA并不是每个人都适合,FPGA讲究的是一个入道,入什么道,入电子 ...

  4. 认识元数据和IL(下)<第五篇>

    书接上回: 第二十四回:认识元数据和IL(上) , 第二十五回:认识元数据和IL(中) 我们继续. 终于到了,说说元数据和IL在JIT编译时的角色了,虽然两个回合的铺垫未免铺张,但是却丝毫不为过,因为 ...

  5. java实现文件编码监测

    java实现文件编码监测 最近在做一个文档的翻译项目,可文档的编码不知道,听头疼的.尝试了很多方法最后发现JCharDet这个工具可以轻松解决这个问题.于是作此笔记希望日后提醒自己以及帮助又需要的人. ...

  6. scheme递归

    主要参考: http://www.shido.info/lisp/scheme7_e.html Function fact that calculates factorials. (define (f ...

  7. 【Android】项目中每个文件夹的作用

    1. src:存放所有的*.java源程序. 2. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3. assets:可以存放项目一些较大的资源文件,例如: ...

  8. [Redux] Generating Containers with connect() from React Redux (AddTodo)

    Code to be refacted: const AddTodo = (props, { store }) => { let input; return ( <div> < ...

  9. 在apache2.4版本之前做客户端访问控制,是用Allow Deny Order指令做访问控制的,

    在apache2.4版本之前做客户端访问控制,是用Allow Deny Order指令做访问控制的,而在2.4的版本上是用的用法跟之前的版本大不相同,如下 ###################### ...

  10. H5 视频直播相关技术

    一.移动视频直播发展 大家首先来看下面这张图: 可以看到,直播从 PC 到一直发展到移动端,越来越多的直播类 App 上线,同时移动直播进入了前所未有的爆发阶段,但是对于大多数移动直播来说,还是要以 ...