欢迎大家关注我们的网站和系列教程: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 的实现的更多相关文章

  1. DQN(Deep Reiforcement Learning) 发展历程(三)

    目录 不基于模型(Model-free)的预测 蒙特卡罗方法 时序差分方法 多步的时序差分方法 参考 DQN发展历程(一) DQN发展历程(二) DQN发展历程(三) DQN发展历程(四) DQN发展 ...

  2. DQN(Deep Reiforcement Learning) 发展历程(四)

    目录 不基于模型的控制 选取动作的方法 在策略上的学习(on-policy) 不在策略上的学习(off-policy) 参考 DQN发展历程(一) DQN发展历程(二) DQN发展历程(三) DQN发 ...

  3. Chinese-Text-Classification,用卷积神经网络基于 Tensorflow 实现的中文文本分类。

    用卷积神经网络基于 Tensorflow 实现的中文文本分类 项目地址: https://github.com/fendouai/Chinese-Text-Classification 欢迎提问:ht ...

  4. 基于jQuery发展历程时间轴特效代码

    分享一款基于jQuery发展历程时间轴特效代码,带左右箭头,数字时间轴选项卡切换特效下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="time ...

  5. 基于TensorFlow解决手写数字识别的Softmax方法、多层卷积网络方法和前馈神经网络方法

    一.基于TensorFlow的softmax回归模型解决手写字母识别问题 详细步骤如下: 1.加载MNIST数据: input_data.read_data_sets('MNIST_data',one ...

  6. web技术发展历程--读《大型网站技术架构_核心原理与案例分析》

    1 早期的web服务 2 CGI程序的出现.发展.凋零到MVC的兴起 CGI:通用网关接口技术. 随着CGI技术的出现,web服务端可以通过不同的用户请求产生动态页面内容. web服务器将请求数据交给 ...

  7. 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 ...

  8. C#与C++的发展历程第一 - 由C#3.0起

    俗话说学以致用,本系列的出发点就在于总结C#和C++的一些新特性,并给出实例说明这些新特性的使用场景.前几篇文章将以C#的新特性为纲领,并同时介绍C++中相似的功能的新特性,最后一篇文章将总结之前几篇 ...

  9. Java起源、发展历程、环境变量、第一个Java程序等【1】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...

随机推荐

  1. js中的函数应用

    js中的函数应用 什么是函数,函数的概念 函数就像一个黑匣子,里面的东西你都不知道,但是你提供一些材料放进去,他可以制造出你需要的东西; 可以让多个一样的功能封装组合起来,然后想执行几次就执行几次 函 ...

  2. 对象深拷贝deepCopy

    function type(obj){ return Object.prototype.toString.call(obj).slice(8,-1); } function deepCopy(targ ...

  3. 从0开始学Git——Git的常用配置

    配置user信息 配置user.name和user.email git config --global user.name 'admin' #设置用户名 git config --global use ...

  4. windows下tensorflow/objectdetection API环境搭建(基于tensorflow1.14和python3.6)

    此前就听闻室友说tensorflow在windows下坑很多,这次终于亲身领会到了.以下是参考网上大佬的教程以及自己的踩坑史总结出的有效步骤(亲测有效) 1.下载objectdetection所在的m ...

  5. 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qYepNv 可交互视频教程 此视频 ...

  6. Windows安装python包出现PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问的问题解决方案

    在python中安装sqlalchemy时,总是提示(当安装依赖有vs的python包时,可能会出现以下错误:) PermissionError: [WinError 32] 另一个程序正在使用此文件 ...

  7. TensorFlow入门知识

    Tensorflow基本操作 Tensorflow是一种计算图模型,即用图的形式来表示运算过程的一种模型.Tensorflow程序一般分为图的构建和图的执行两个阶段.图的构建阶段也称为图的定义阶段,该 ...

  8. 负载均衡框架 ribbon 二

    Ribbon 负载均衡机制 官方文档地址:https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers 1. Ribbon 内置 ...

  9. java算法--循环队列

    循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...

  10. 使用python3编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。

    代码如下: import random n = 0 sum = 0 while n < 10: num = random.randint(1, 100) sum = sum + num n += ...