本篇文章4342字,读完约11分钟
雷锋。这篇文章的作者是徐凯文。原文包含在作者的个人博客中。雷锋。(公开号码:雷锋。com)已被授权。
我在智湖看到一篇关于卷积神经网络的文章,非常直观清晰,所以我把它整理出来了。首先介绍了原理部分。
本文通过一个图像分类问题介绍了卷积神经网络的工作原理。以下是用卷积神经网络判断一幅图片是否包含“儿童”的过程,包括四个步骤:
低图像输入(输入估计)
低卷积(卷积)
●最大池(最大池)
●全连通神经网络(full connected neural network)计算。
首先,将图片分成相互重叠的独立块,如下图所示;在下图中,这张照片被分成77张同样大小的小照片。
接下来,将每个独立的小块输入到一个小神经网络中;这个小的神经网络已经被训练来判断一幅图片是否属于“儿童”的范畴,并且它的输出是一个特征数组。
标准数码相机有三个通道:红、绿、蓝,每种颜色的像素值在0到255之间,形成三个堆叠的二维矩阵;灰度图像只有一个通道,可以用二维矩阵表示。
将所有独立块输入小神经网络后,第一步根据77个独立块的相对位置排列每个输出特征数组,得到新的数组。
在第二步中,这个小神经网络对这77张同样大小的小图片进行同样的计算,这也被称为共享权重。这是因为,首先,对于像图像这样的阵列数据,局部阵列的值通常是高度相关的,这可以形成易于检测的独特局部特征;其次,图像和其他信号的局部统计特征与其位置无关。如果要素图可以出现在图片的一部分,它也可以出现在任何地方。因此,不同位置的单元共享相同的权重,并在阵列的不同部分检测相同的模式。从数学上讲,由特征图执行的滤波操作是离散卷积,因此称为卷积神经网络。
卷积步骤完成后,利用最大池算法缩小像素采样阵列,特征矩阵按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