卷积的发展历程,原理和基于 TensorFlow 的实现
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识!
稀疏交互
在生物学家休博尔和维瑟尔早期关于猫视觉皮层的研究中发现,视觉皮层中存在一些细胞对输入空间也就是图像中的子区域非常敏感,我们称为感受野。在神经网络中,稀疏交互就是下一层节点只和上一层中的部分节点进行连接的操作。稀疏交互可以显著的降低神经网络中参数的数量。
左边是全连接方式,隐藏节点都需要所有的输入;右边是稀疏交互,隐藏层节点只接受一个区域内的节点输入。
稀疏交互的实现
以 MNIST 数据集为例,来实现稀疏交互,并输出结果对应的图片。
MNIST 原始图片:
为了进行局部连接,有两个重要的参数需要选择:
1.局部区域的大小
局部区域的大小,首先以 5 * 5 的局部区域为例:
2.局部特征的抽取次数
针对局部区域可以进行多次特征抽取,可以选择局部特征抽取的次数,首先以抽取 5 次为例。
3.步长
在确定局部区域大小之后,可以平滑的每次移动一个像素,也可以间隔 N 个像素进行移动。
如图:
也可以使用不同的特征提取器对同一片区域,进行多次特征提取,如图所示:
4.边缘填充
在进行一次局部连接的过程中,如果不进行边缘填充,图像的维度将会发生变化,如图所示:
4 * 4 的图像,进行了 3 * 3 的局部连接,维度发生了变化。
对于边缘的两种处理方法:
权值共享
权值共享的由来
降低网络中参数的个数,还有一个方法就是共享参数。每一组参数都可以认为是一个特征提取器,即使图像有一定的偏移,还是可以将相应的特征用同一组参数提取出来。
TensorFlow 实现局部连接和权值共享
如下图所示:
为了演示局部连接和权值共享在特征提取方面的作用,接下来将使用在稀疏交互中一种很常用的一组权值,它的作用是边缘提取。
就是这个矩阵组成的权值:
[[-1,-1,-1],
[-1,8,-1],
[-1,-1,-1]]
使用 TensorFlow 的 convolution 函数对 MNIST 数据集做卷积操作。因为这部分代码涉及到维度相关的操作比较多,在稍后卷积网络部分会有详细说明。这段代码单独实现了卷积功能:
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
#引入 MNIST 数据集
mnist = input_data.read_data_sets("/tmp/data/", one_hot=False)
#选取训练集中的第 1 个图像的矩阵
mnist_one=mnist.train.images[0]
plt.subplot(121)
plt.imshow(mnist_one.reshape((28,28)), cmap=plt.cm.gray)
#输出图片的维度,结果是:(784,)
print(mnist_one.shape)
#因为原始的数据是长度是 784 向量,需要转换成 1*28*28*1 的矩阵。
mnist_one_image=mnist_one.reshape((1,28,28,1))
#输出矩阵的维度
print(mnist_one_image.shape)
#滤波器参数
filter_array=np.asarray([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
#滤波器维度
print(filter_array.shape)
#调整滤波器维度
filter_tensor=filter_array.reshape((3,3,1,1))
#卷机操作
conv_image_tensor=tf.nn.convolution(mnist_one_image,filter=tf.to_float(filter_tensor),padding="SAME")
#返回的张量维度
print(conv_image_tensor.shape)
#调整为二维图片
conv_image=tf.reshape(conv_image_tensor,[28,28])
with tf.Session() as sess:
#获得张量的值
conv_image=sess.run(conv_image)
plt.subplot(122)
#使用 matplotlib 输出为图片
plt.imshow(conv_image, cmap=plt.cm.gray)
plt.show()
池化介绍
池化
除了之前的两种方式,在数据量很大,类比现实生活中事情纷繁复杂的时候,我们总是想抓住重点,在图像中,可以在一个区域选取一个重要的点。
一般是选择值最大的点,作为这一个区域的代表:
如图所示:
这个池化选取的是 2 * 2 的区域,留下值最大点,步长为 2。原来 4 * 4 的图片矩阵池化之后变成了 2 * 2 的图片矩阵。
手写数字识别
接下来将会以 MNIST 数据集为例,使用卷积层和池化层,实现一个卷积神经网络来进行手写数字识别,并输出卷积和池化效果。
数据准备
- MNIST 数据集下载
MNIST 数据集可以从 THE MNIST DATABASE of handwritten digits 的网站直接下载。
网址:http://yann.lecun.com/exdb/mnist/
train-images-idx3-ubyte.gz: 训练集图片
train-labels-idx1-ubyte.gz: 训练集列标
t10k-images-idx3-ubyte.gz: 测试集图片
t10k-labels-idx1-ubyte.gz: 测试集列标
TensorFlow 有加载 MNIST 数据库相关的模块,可以在程序运行时直接加载。
代码如下:
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as pyplot
#引入 MNIST 数据集
mnist = input_data.read_data_sets("/tmp/data/", one_hot=False)
#选取训练集中的第 1 个图像的矩阵
mnist_one=mnist.train.images[0]
#输出图片的维度,结果是:(784,)
print(mnist_one.shape)
#因为原始的数据是长度是 784 向量,需要转换成 28*28 的矩阵。
mnist_one_image=mnist_one.reshape((28,28))
#输出矩阵的维度
print(mnist_one_image.shape)
#使用 matplotlib 输出为图片
pyplot.imshow(mnist_one_image)
pyplot.show()
代码的输出依次是:
1.单个手写数字图片的维度:
(784,)
2.转化为二维矩阵之后的打印结果:
(28, 28)
3.使用 matplotlib 输出为图片
本篇文章出自http://www.tensorflownews.com,对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!
卷积的发展历程,原理和基于 TensorFlow 的实现的更多相关文章
- DQN(Deep Reiforcement Learning) 发展历程(三)
目录 不基于模型(Model-free)的预测 蒙特卡罗方法 时序差分方法 多步的时序差分方法 参考 DQN发展历程(一) DQN发展历程(二) DQN发展历程(三) DQN发展历程(四) DQN发展 ...
- DQN(Deep Reiforcement Learning) 发展历程(四)
目录 不基于模型的控制 选取动作的方法 在策略上的学习(on-policy) 不在策略上的学习(off-policy) 参考 DQN发展历程(一) DQN发展历程(二) DQN发展历程(三) DQN发 ...
- Chinese-Text-Classification,用卷积神经网络基于 Tensorflow 实现的中文文本分类。
用卷积神经网络基于 Tensorflow 实现的中文文本分类 项目地址: https://github.com/fendouai/Chinese-Text-Classification 欢迎提问:ht ...
- 基于jQuery发展历程时间轴特效代码
分享一款基于jQuery发展历程时间轴特效代码,带左右箭头,数字时间轴选项卡切换特效下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div id="time ...
- 基于TensorFlow解决手写数字识别的Softmax方法、多层卷积网络方法和前馈神经网络方法
一.基于TensorFlow的softmax回归模型解决手写字母识别问题 详细步骤如下: 1.加载MNIST数据: input_data.read_data_sets('MNIST_data',one ...
- web技术发展历程--读《大型网站技术架构_核心原理与案例分析》
1 早期的web服务 2 CGI程序的出现.发展.凋零到MVC的兴起 CGI:通用网关接口技术. 随着CGI技术的出现,web服务端可以通过不同的用户请求产生动态页面内容. web服务器将请求数据交给 ...
- C#与C++的发展历程第三 - C#5.0异步编程巅峰
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...
- C#与C++的发展历程第一 - 由C#3.0起
俗话说学以致用,本系列的出发点就在于总结C#和C++的一些新特性,并给出实例说明这些新特性的使用场景.前几篇文章将以C#的新特性为纲领,并同时介绍C++中相似的功能的新特性,最后一篇文章将总结之前几篇 ...
- Java起源、发展历程、环境变量、第一个Java程序等【1】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...
随机推荐
- PHP 解决对文件操作的高并发问题
解决方案: 对文件进行加锁时,设置一个超时时间.超时设置为1ms,如果这段时间内没有获得锁,就反复获得,直到获得对文件的操作权为止.如果超市限制已到,就必须马上退出,让出锁让其他进程进行操作. ...
- Ajax&Json案例
案例: * 校验用户名是否存在 1. 服务器响应的数据,在客户端使用时,要想当做json数据格式使用.有两种解决方案: 1. $.get(type):将最后一个参数type指定为"json& ...
- python fake_useragent模块 user-agent的获取
1. UserAgent 模块使用 from fake_useragent import UserAgent ua = UserAgent() # 实例化,实例化时需要联网但是网站不太稳定 print ...
- SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
一.创建项目 (1)进入到https://aistudio.baidu.com/aistudio/projectoverview/public (2)创建项目 点击添加数据集:找到这两个 然后创建即可 ...
- SpringBoot一些基础配置
定制banner Spring Boot项目在启动的时候会有一个默认的启动图案: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( ...
- WEB渗透 - XSS
听说这个时间点是人类这种生物很重要的一个节点 cross-site scripting 跨站脚本漏洞 类型 存储型(持久) 反射型(非持久) DOM型 利用 先检测,看我们输入的内容是否有返回以及有无 ...
- 树莓派3b+ 交叉编译 及升级 kernel
安装 gcc pkg 等工具sudo apt-get install build-essential git 官方介绍 https://www.raspberrypi.org/documentatio ...
- golang 学习之路 string转换为其他类型 其他类型转换为string
将其他值转换为string 一般常用fmt.Sprintf(格式,转换的值) // 使用fmt.Sprintf 转换所有的类型为string 使用 这是第一种 // 注意在sprintf使用中需要注意 ...
- 网络|N1盒子做旁路由刷OpenWRT系统(小白专用)
N1盒子做旁路由刷OpenWRT系统(小白专用) 为什么要用N1盒子 现如今新上市的路由器,市面上能买到的300元以内的路由器大多数都是双频(5G Hz和2.4G Hz)和几年前相比无论是速度还是性能 ...