卷积的发展历程,原理和基于 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 ...
随机推荐
- 【简单版】hexo博客搭建流程梳理
前言 本文章会为你梳理一个搭建hexo博客的流程 相关网址: Docs: https://hexo.io/docs/ Themes: https://hexo.io/themes/ 安装hexo 准备 ...
- C++扬帆远航——6(三色球)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanseqiu.cpp * 作者:常轩 * 完成日期:2016 ...
- 文件传送协议FTP
文件传送协议FTP 1.1.概述 文件传送协议 FTP (File Transfer Protocol) 是因特网上使用得最广泛的文件传送协议. FTP 提供交互式的访问,允许客户指明文件的类型与格式 ...
- Python:turtle库的使用及图形绘制
目录 一.绘制一个八边形 二.绘制一个八角图形 三.简述问题 四.循环程序设计 五.绘制一个自己喜欢的图形 一.绘制一个八边形 使用turtle库,绘制一个八边形 代码: from turtle im ...
- 压力测试(九)-Jmeter压测课程总结和架构浅析
安装常见问题 1.问题 [root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServer ...
- 浅谈Java开发三层架构
三层架构,一般来说就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了“高内聚,低耦合”的思想. 概念简介 1.表现层(UI):简单来说,就是展现 ...
- 轻量级MVC框架(自行开发)
源码及demo: https://github.com/killallspree/myFrame/
- git的日常使用(补课)
使用git的一些反响 如果在github上做一个仓库来使用的话... 首先手动在github上创建一个空的仓库,默认没有任何东西的 使用git的命令 git pull 创建的github仓库地址 能把 ...
- python基础学习day7
基础数据类型的补充:编码的进阶 str capitalize() 首字母(第一个单词)大写,其余变小写 s1 = 'I LIVE YOU' print(s1.capitalize()) >> ...
- Asp.Net Core 中IdentityServer4 授权原理及刷新Token的应用
一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...