卷积的发展历程,原理和基于 TensorFlow 的实现

2022-03-04

,了解有关机器学习和深度学习的更多信息!

稀疏交互

生物学家Huber和在早期对猫视觉皮层的研究中发现,视觉皮层中存在一些对输入空间,即图像中没有影响的细胞。的子区域非常敏感,我们称之为感受野。在神经网络中,稀疏交互是下一层的节点只连接到上一层的一些节点的操作。稀疏交互可以显着减少神经网络中的参数数量。

左侧是全连接的,隐藏节点需要所有输入;右边是稀疏交互,隐藏层节点只接受一个区域节点的输入。

稀疏交互的实现

以MNIST数据集为例,实现稀疏交互,输出对应图片。

MNIST 原图:

为了执行部分连接,有两个重要的参数可供选择:

1.局部区域的大小

局部区域的大小,先以5*5的局部区域为例:

2.局部特征提取次数

可以对局部区域进行多次特征提取,可以选择局部特征提取的次数。首先以5次提取为例。

3.步长

确定局部区域大小后,可以一次平滑移动一个像素,也可以每隔N个像素移动一次。

如图:

也可以使用不同的特征提取器对同一区域提取多个特征,如图所示:

4.边缘填充

在进行部分连接的过程中,如果不进行边缘填充,图片的维度会发生变化,如图:

4*4的图片已经在本地连接了3*3,尺寸发生了变化。

边的两种处理方式:

权重分享价值分享的由来

为了减少网络中的参数数量,另一种方法是共享参数。每组参数都可以看作是一个特征提取器,即使图像有一定的偏移量,同样的一组参数仍然可以提取出对应的特征。

实现本地连接和权重共享

如下图所示:

为了演示局部连接和权重共享在特征提取中的作用,下面将使用稀疏交互中常用的一组权重进行边缘提取。

就是这个矩阵的权重:

[[-1,-1,-1],
[-1,8,-1],
[-1,-1,-1]]

使用的函数对 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数据集可以直接从网站的THE MNIST下载。

网址:

train–idx3-ubyte.gz:训练集图片

train–idx1-ubyte.gz:训练集列索引

p>

t10k–idx3-ubyte.gz: 测试集图片

t10k–idx1-ubyte.gz:测试集列索引

与加载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.使用输出作为图片

本文来自,对深度学习感兴趣的朋友,欢迎关注我们的网站!

分类:

技术要点:

相关文章:

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片