本篇文章4342字,读完约11分钟

雷锋。这篇文章的作者是徐凯文。原文包含在作者的个人博客中。雷锋。(公开号码:雷锋。com)已被授权。

我在智湖看到一篇关于卷积神经网络的文章,非常直观清晰,所以我把它整理出来了。首先介绍了原理部分。

本文通过一个图像分类问题介绍了卷积神经网络的工作原理。以下是用卷积神经网络判断一幅图片是否包含“儿童”的过程,包括四个步骤:

低图像输入(输入估计)

低卷积(卷积)

●最大池(最大池)

●全连通神经网络(full connected neural network)计算。

首先,将图片分成相互重叠的独立块,如下图所示;在下图中,这张照片被分成77张同样大小的小照片。

接下来,将每个独立的小块输入到一个小神经网络中;这个小的神经网络已经被训练来判断一幅图片是否属于“儿童”的范畴,并且它的输出是一个特征数组。

标准数码相机有三个通道:红、绿、蓝,每种颜色的像素值在0到255之间,形成三个堆叠的二维矩阵;灰度图像只有一个通道,可以用二维矩阵表示。

将所有独立块输入小神经网络后,第一步根据77个独立块的相对位置排列每个输出特征数组,得到新的数组。

在第二步中,这个小神经网络对这77张同样大小的小图片进行同样的计算,这也被称为共享权重。这是因为,首先,对于像图像这样的阵列数据,局部阵列的值通常是高度相关的,这可以形成易于检测的独特局部特征;其次,图像和其他信号的局部统计特征与其位置无关。如果要素图可以出现在图片的一部分,它也可以出现在任何地方。因此,不同位置的单元共享相同的权重,并在阵列的不同部分检测相同的模式。从数学上讲,由特征图执行的滤波操作是离散卷积,因此称为卷积神经网络。

手把手教你用 TensorFlow 实现卷积神经网络(附代码)

卷积步骤完成后,利用最大池算法缩小像素采样阵列,特征矩阵按2×2划分。每个划分的网格中只保留最大数组,其他数组被丢弃以获得最大池数组。

接下来,最大池阵列被作为另一个神经网络的输入,并且这个完全连接的神经网络将最终计算该图是否满足预期的判断。

在实际应用中,卷积、最大汇集和全连通神经网络计算可以重复多次。总的想法是连续压缩大图片,直到输出一个单一的值。通过更多的卷积步骤,神经网络可以处理和学习更多的特征。

下面是代码,添加了详细的注释:

来自tensorflow . examples . tutorials . mnist导入输入数据

将张量流作为tf导入

MNIST =输入数据。读取数据集(“MNIST数据/”,一个热=真)#读取图片数据集

Sess = tf.interactivesession()#创建会话

# 1。功能声明部分

def weight_variable(形状):

#正态分布,标准偏差为0.1,默认最大值为1,最小值为-1,平均值为0

initial = TF . truncated _ normal(shape,stddev=0.1)

返回tf.variable(初始)

def bias_variable(形状):

#用形状结构创建一个矩阵,也可以说是一个数组形状来声明它的行和列,并将所有值初始化为0.1

初始= tf .常数(0.1,形状=形状)

返回tf.variable(初始)

def conv2d(x,w):

#卷积遍历的每个方向的步数都是1,相同:自动在边缘外填充0,并遍历和相乘

返回tf.nn.conv2d(x,w,跨步=[1,1,1,1],填充=相同)

def max_pool_2x2(x):

#池卷积结果(conv2d)池层采用2*2的内核大小,步数也是2,周围填充0,取最大值。数据量减少了4倍

返回tf.nn.max_pool(x,ksize=[1,2,2,1],跨步=[1,2,2,1],填充=相同)

# 2,定义输入和输出结构

#声明一个占位符,无表示输入图片的数量不确定,分辨率为28*28图片

xs = tf.placeholder(tf.float32,[none,28*28])

#类别为0-9,共10个类别,对应输出分类结果

ys = tf.placeholder(tf.float32,[none,10])

keep _ prob = TF . placeholder(TF . float 32)

# x_image将xs整形为28*28*1的形状。因为它是一个灰色的图片,频道是1。作为训练期间的输入,-1意味着图片的数量是不确定的

x _ image = TF . resform(xs,[-1,28,28,1])

#第三,建立网络并定义算法公式,这是向前移动时的计算

# # 1级卷积运算# #

#前两个参数是卷积核的大小,即面片,第三个参数是图像通道的数量,第四个参数是卷积核的数量,表示将出现多少卷积特征图像;

w_conv1 =重量变量([5,5,1,32])

#每个卷积核都有相应的偏移量。

b_conv1 = bias_variable([32])

#图片乘以卷积核,然后加上偏执狂的数量。卷积结果是28x28x32

h _ conv 1 = TF . nn . relu(conv 2d(x _ image,w_conv1) + b_conv1)

#集合结果14x14x32卷积结果乘以集合卷积核

h_pool1 = max_pool_2x2(h_conv1)

# #第2层卷积运算# #

# 32通道卷积,卷积出64个特征

w_conv2 =重量变量([5,5,32,64])

# 64偏执数据

b_conv2 = bias_variable(# #第3层全连接操作# #)

#注意,h_pool1是前一层的池化结果,#卷积结果是14x14x64

h _ conv 2 = TF . nn . relu(conv 2d(h _ pool 1,w_conv2)+b_conv2)

7x7x64池化结果

h_pool2 = max_pool_2x2(h_conv2)

#原始图像大小为28*28,第一轮中有32幅图像缩小到14*14,第二轮后有64幅图像缩小到7*7。

[64]

#二维张量,即第一个参数为7*7*64的补片,也可以被视为只有一行7*7*64数据的卷积,而第二个参数代表总共1024个卷积

w_fc1 =重量变量([7*7*64,1024])

# 1024偏执数据

b_fc1 =偏置变量([1024])

#将第二层的卷积汇集结果重新整形为仅一行7*7*64数据# [N _ samples,7,7,64]->[N _ samples,7 * 7 * 64]

h _ pool 2 _ flat = TF . resform(h _ pool 2,[-1,7*7*64])

#卷积运算,结果是1*1*1024,单行乘以单列等于1*1矩阵,matmul实现了最基本的矩阵乘法,不同于tf.nn.conv2d的遍历乘法,并自动被认为是前向向量和后向列向量

h _ fc1 = TF . nn . relu(TF . mat mul(h _ pool 2 _ flat,w_fc1) + b_fc1)

# dropout operation,reducing over-fit,实际上是减少前一层中一些输入的权重,甚至将其设置为0,并增加一些输入的权重,甚至将其设置为2,以防止评估曲线振荡,并且有必要让个人感觉样本很少。

#使用占位符,退出可以自动确定比例,或者您可以自定义它,如0.5。根据张量流文件,程序中实际使用的值是1/0.5=2,也就是说,一些输入乘以2,而一些输入乘以0。

keep _ prob = TF . placeholder(TF . float 32)

h _ fc1 _ drop = TF . nn . drop(f _ fc1,keep _ prob) #对卷积结果执行drop运算

# # 4级输出操作# #

#二维张量,1*1024矩阵卷积,总共10个卷积,对应于我们的初始ys长度10

w_fc2 =重量变量([1024,10])

b_fc2 =偏置变量([10])

#最终分类,结果是1*1*10 softmax和sigmoid都是基于logistic分类算法,一个是多分类,另一个是双分类

y _ conv = TF . nn . soft max(TF . matmul(h _ fc1 _ drop,w_fc2) + b_fc2)

# 4,定义损失(最小错误概率),选择优化和优化损失,

交叉熵=-tf。reduce _ sum (ys * tf。log(y _ conv)#将交叉熵定义为损失函数

训练步长= TF。train . dradientsentetimizer(0.5)。最小化(交叉熵)#调用优化器进行优化,事实上,它通过提供数据来努力最小化交叉熵

# 5。开始数据培训和评估

正确_预测= tf.equal(tf.argmax(y_conv,1),tf.argmax(ys,1))

精确度= tf.reduce_mean(tf.cast(正确预测,tf.float32))

TF . global _ variables _ initializer()。运行()

对于范围内的I(20000):

batch = mnist . train . next _ batch(50)

如果i%100 == 0:

train _ accuracy = accuracy . eval(feed _ dict = { x:batch[0],ys: batch[1],keep_prob: 1.0})

打印(“步骤%d,训练精度% g”%(I,训练精度))

train _ step . run(feed _ dict = { x:batch[0],ys: batch[1],keep_prob: 0.5})

打印(“测试准确度% g“%准确度.评估(feed_dict={x: mnist.test.images,ys: mnist.test.labels,keep_prob: 1.0})”

——————————————————————

人工智能神经网络专业培训班

20年来,清华大学神经网络讲师将带你系统地学习人工智能的神经网络!

一站式深入了解深度学习的发展现状、基本原则和主要方法。

课程链接:mooc.ai/course/65

雷锋。(公开号码:雷锋。相关阅读:

基于弱监督学习的神经网络在图像分割中的应用

在过去的三年里,cnn在图像分割领域经历了哪些技术变革?

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

来源:搜狐微门户

标题:手把手教你用 TensorFlow 实现卷积神经网络(附代码)

地址:http://www.shwmhw.com/shxw/61554.html