本篇文章9985字,读完约25分钟

雷锋。com:宋传彪,这篇文章的作者,原文载于作者的个人博客,和雷锋。(公开号码:雷锋。com)已被授权。

1.在人工全连接神经网络中,每两个相邻层之间的每个神经元都是通过边连接的。当输入层的特征维数变得很高时,需要在全连通网络中训练的参数会增加很多,计算速度会变得很慢。例如,一张28×28的黑白手写数字图片在输入层有784个神经元,如下图所示:

如果中间只使用一个隐藏层,则有超过784×15=11760个参数w;如果输入是28×28的带颜色的rgb格式的手写数字图像,则有28×28×3=2352个输入神经元。利用全连通神经网络处理图像时,容易发现训练参数过多。

在卷积神经网络(cnn)中,卷积层中的神经元只与前一层中的一些神经元节点相连,即其神经元之间的连接是不完整的,同一层中的一些神经元之间的连接的权重w和偏移量b是共享的(即相同的),这大大减少了训练参数的数量。

卷积神经网络cnn的结构一般包括这些层:

●输入层:用于数据输入

●卷积层:利用卷积核进行特征提取和特征映射

●激发层:由于卷积也是线性运算,所以需要增加非线性映射

●汇集图层:下采样,细化要素图,减少数据计算量。

●全连接层:通常重新安装在cnn的尾部,以减少特征信息的损失

●输出层:用于输出结果

当然,也可以在中间使用其他一些功能层:

●批量标准化:cnn中特征的标准化

●分层:分别研究不同地区的一些(图片)数据

●融合层:独立进行特征学习的分支融合

第二,cnn的分层输入层:

在美国有线电视新闻网的输入层,(图片)数据输入的格式不同于完全连接的神经网络(一维向量)。cnn输入层的输入格式保留了图片本身的结构。

对于黑白28×28图片,cnn的输入是一个28×28的二维神经元,如下图所示:

对于rgb格式的28×28图片,cnn的输入是一个3×28×28的3D神经元(rgb中的每个颜色通道都有一个28×28的矩阵),如下图所示:

卷积层:

卷积层有几个重要的概念:

局部感受野(感受野)

共享重量(共享重量)

假设输入是一个28×28的二维神经元,我们定义了一个5×5的局部感受野,即隐藏层的神经元与输入层的5×5的神经元相连,这个5×5的区域称为局部感受野,如下图所示:

可以类似地看到,隐藏层中的神经元有一个固定的感觉场来感受上层的一些特征。在完全连接的神经网络中,隐藏层中神经元的感觉场足够大,可以看到上层的所有特征。

在卷积神经网络中,隐层神经元的感觉场相对较小,只能看到上次的一些特征。上层的其他特征可以通过转换感官场来获得。从同一层的其他神经元来看:

假设移动步骤为1:从左向右扫描,一次移动一个网格,扫描后向下移动一个网格,然后再从左向右扫描。

具体过程如图所示:

可以看出,卷积层中的神经元只与前一层中的一些神经元节点相连,每条相连的线对应一个权值w。

感知层有一个卷积核,我们称感知层的权矩阵为卷积核;感官视野对输入的扫描间隔称为步幅。当步长较大(步幅> 1)时,为了扫描边缘的一些特征,感知视野可能“超出界限”。此时,有必要填充边界,可以将其设置为0或其他值。步长和边界延伸值的大小由用户定义。

卷积核的大小由用户定义,即定义的感知视野的大小;卷积核的权矩阵值是卷积神经网络的参数。为了有一个偏移项,卷积核可以附加一个偏移项B,它们的初始值可以通过训练随机产生和改变。

因此,下一层神经元的值可以在感觉场扫描期间计算如下:

对于下一层的所有神经元,他们从不同的位置探测上层神经元的特征。

我们将由具有卷积核的感觉场扫描生成的下一层神经元矩阵称为特征图,下图的右侧是特征图:

因此,相同特征图上的神经元使用相同的卷积核,因此这些神经元共享卷积核中的权重和偏移量。特征映射对应于卷积核。如果我们使用三个不同的卷积核,我们可以输出三个特征图:(感官视野:5×5,布长步幅:1)

因此,在cnn的卷积层,我们需要训练的参数被大大减少到(5×5+1)×3=78。

假设输入是一幅28×28的rgb图像,即一个3×28×28的二维神经元。这时,卷积核的大小不仅用长度和宽度来表示,而且用深度来表示,而感知视场也相应于深度,如下图所示:

从图中可以看出,知觉视野为3×2×2;卷积核:3×2×2,深度3;下一层神经元的值为:b+∑2d=0∑1i=0∑1j=0wdijxdij。卷积核的深度与感官场的深度相同,是由输入数据决定的。长度和宽度可以自己设定,数量也可以自己设定。卷积核仍然对应于特征映射。

注:“步幅=1”表示移动间隔的长度和宽度均为1,即步幅=1,步幅=1

激发层:

激励层主要对卷积层的输出进行非线性映射,因为卷积层的计算是线性计算。使用的激励函数通常是relu函数:

f(x)=最大值(x,0)

褶合层和激发层通常结合在一起,称为“褶合层”。

汇集层:

当输入经过卷积层时,如果感知的视野相对较小,步长相对较小,并且获得的特征图仍然相对较大,则可以通过汇集层对每个特征图进行降维操作,并且输出深度仍然与特征图的数量相同。

池图层还有一个“池视野”,用于扫描要素地图矩阵并计算“池视野”中的矩阵值。通常有两种计算方法:

最大池:取池视图矩阵中的最大值

平均池:取池视图矩阵中的平均值

在扫描过程中,扫描布的长度步幅也会以同样的方式被涉及。扫描方式与褶层相同,先从左向右扫描,最后沿布料长度向下移动,然后从左向右移动。如下例所示:

其中“池视图”过滤器:2×2;布长步幅:2。(注:“泳池愿景”是一个人的名字)

最后,可以对三个24×24的特征图进行下采样,以获得三个24×24的特征矩阵:

标准化层:

1.批量标准化

批量归一化实现了神经网络中间层的预处理操作,即上层输入归一化后进入网络的下一层,可以有效防止“梯度分散”,加快网络训练。

批量归一化算法如下图所示:

在每次训练中,都会抽取一个批量样本进行训练。在bn层中,神经元被视为一个特征,批量样本在某一特征维中具有批量值。然后,在每个神经元的xi维数中对这些样本进行均值和方差分析,通过公式得到xi∧,然后通过参数γ和β的线性映射得到每个神经元对应的输出yi。在bn层中,可以看出在每个神经元的维数上都有一个参数γ和β,可以通过训练如加权w来优化

从理论到实践,手把手教你如何用 TensorFlow 实现 CNN

当在卷积神经网络中执行批量归一化时,未被relu激活的特征映射通常被批量归一化,然后作为激励层的输入输出,激励层可以调整激励函数的偏导数。

一种方法是将特征图中的神经元作为特征维数,参数γ和β的个数之和等于2×fmapwidth×fmaplength×fmapnum,因此参数的个数会变得很多;

另一种方法是将要素地图视为要素维度。特征图上的神经元共享特征图的参数γ和β,参数γ和β之和等于2×fmapnum。均值和方差是基于每个特征映射维度中批量训练样本的均值和方差来计算的。

注意:fmapnum指样本中特征图的数量,特征图像神经元一样有一定的排列顺序。

批量归一化算法的训练过程和测试过程的区别;

在训练过程中,我们每次都将批量的训练样本放入cnn网络中进行训练,自然可以得到计算bn层输出所需的均值和方差;

在测试过程中,我们通常只向cnn网络输入一个测试样本,这意味着在bn层计算的均值和方差将为0。由于只有一个样本输入,bn层的输入会有很大的问题,这将导致cnn网络输出的误差。因此,在测试过程中,当bn层被归一化时,我们需要在每个维度上使用训练集中所有样本的均值和方差。当然,为了便于计算,我们可以在batch_num训练过程中每次对bn层进行归一化时,在每个维度上加上均值和方差,最后再找到均值。

从理论到实践,手把手教你如何用 TensorFlow 实现 CNN

2.局部响应标准化

局部响应归一化方法主要发生在不同相邻卷积核的输出之间(在relu之后),也就是说,输入在relu之后出现在不同的特征映射中。

lrn的公式如下:

其中:

A(i,x,y)表示在第I卷积核的输出(通过relu层)的特征图上(x,y)位置的值。

B(i,x,y)表示lrn后a(i,x,y)的输出。

n表示卷积核的数量,即输入特征映射的数量。

n代表邻居的卷积核(或特征映射)的数量,由自己决定。

k,α,β是超参数,由用户自己调整或决定。

与bn: bn的区别是基于小批量的数据,只需自行决定,bn训练中有学习参数;Bn归一化主要发生在不同样本之间,而lrn归一化主要发生在不同卷积核的输出之间。

切割成层:

在某些应用中,有必要剪切图片并独立学习某个区域。这样,我们可以通过调整感知视野来更有力地学习特定部分。

融合层:

融合层可以融合切线层和不同大小的卷积核学习到的特征。

例如,在谷歌地图中,使用多分辨率卷积核学习目标特征,通过填充使每个特征图的长度和宽度一致,然后将多个特征图深度拼接在一起:

有几种融合方法,一种是特征矩阵的拼接,另一种是特征矩阵的运算(+,-,x,max,conv)。

全连接层和输出层

全连接层主要是重新匹配特征以减少特征信息的丢失;输出层主要准备输出最终的目标结果。例如,vgg的结构图如下图所示:

3.典型的卷积神经网络lenet-5模型

第一个卷积神经网络模型成功应用于数字识别(卷积层有自己的激励函数,下同):

卷积层的卷积核边长均为5,步长均为1。汇集层的窗口边长和步长均为2。

Alexnet模型

具体结构图:

从alexnet的结构中,我们可以发现经典的卷积神经网络结构通常如下:

输入层→(卷积层+→汇集层?)+→全连接层+→输出层

alexnet卷积层的卷积核边长为5或3,汇集层的窗口边长为3。具体参数如图所示:

Vggnet模型

vggnet模型和alexnet模型的结构变化不大,在卷积层中增加了几个卷积层。下图显示了alexnet(顶部)和vggnet(底部)对:

具体参数如图:conv3-64:表示卷积核的长度和宽度为3,数字为64;池2:这意味着池窗口的长度和宽度都是2,其他的是相似的。

Googlenet模型

使用多个不同分辨率的卷积核,最后将它们得到的特征图按深度融合在一起,结构如下:

其中,有一些主要模块称为初始模块,如:

在初始模块中使用了许多1×1卷积核。当步长为1时,输入特征图和输出特征图的长度和宽度不变,但可以通过改变1×1卷积核的个数来减小特征图的厚度,从而减少一些训练参数。

Googlenet的另一个特点是其全卷积结构(fcn),它不使用网络末端的全连接层。一方面,它可以减少参数的数量并且不容易过度拟合,另一方面,它也带来了一些空.之间的信息损失全局平均池(gap)的方法取代了完全连接的层。其思想是为每个类别输出一个要素图,然后将每个要素图上的平均值作为最终softmax图层的输入。

Resnet模型

在以前的有线电视新闻网模型中,输入是逐层向下传递的(图中左侧)。当层次较深时,模型没有得到很好的训练。在resnet模型中,它将在较低层次上学习的特征与在较高层次上学习的特征(加法运算,右图)相融合,从而可以更快地传递导数并减少梯度分散现象。

注意:f(x)的形状需要等于x的形状,这样才能添加。

四、张量流代码主要功能描述:

卷积层:

tf.nn.conv2d(输入、滤波、跨步、填充、use _ cudnn _ on _ gpu =无、data _ format =无、name =无)

参数描述:

● data_format:表示输入格式,有“nhwc”和“nchw”两种类型,默认值为“nhwc”

●输入:输入是一个4维(图像)数据,数据的形状由data_format决定:当data_format为“nhwc”时,输入数据的形状表示为[batch,in _ height,in _ width,in _ channels],分别表示训练时一个批次的图片数、高度、宽度和图像通道数。当数据格式为“nhwc”时,输入数据的形状表示为[批次、通道、高度、宽度]

●过滤:卷积核是一种四维数据格式:形状表示为[高度、宽度、输入通道、输出通道],分别表示卷积核的高度、宽度和深度(应与输入输入通道相同)和输出特征图的数量(即卷积核的数量)。

●步长:表示步长:一个长度为4的一维列表,每个元素对应一个data_format,表示data_format每个维度的移动步长。当输入的默认格式为“nhwc”时,步长=[批处理,高度,宽度,通道]。其中批次和in _ channels必须为1,即它们只能在样本的一个通道上的特征图上移动,in _ height和in _ width表示卷积核在特征图上的高度和宽度上移动的长度,即条纹宽度和条纹宽度。

从理论到实践,手把手教你如何用 TensorFlow 实现 CNN

●填充:表示填充方法:“相同”表示填充方法,简单理解为用0填充边缘,但还有一个要求,即左边(顶部)要填充的零的数量等于或小于右边(底部)要填充的零的数量,“有效”表示填充方法被采用并冗余丢弃。特定公式:

“相同”:output _ space _ shape[I]=(input _ space _ shape[I]/steps[I])

“有效”:output _ space _ shape[i]=((input _ space _ shape[I]-(space _ filter _ shape[I]-1)/跨步[I])

汇集层:

tf.nn.max_pool(值,ksize,跨步,填充,data_format='nhwc ',name=none)

或者..

tf.nn.avg_pool(…)

参数描述:

●值:表示集合输入:一个四维数据,其形状由data_format决定。默认情况下,形状为[批次、高度、宽度、通道]

●其他参数和tf.nn.cov2d类型

●ksize:表示池窗口的大小:一维列表,长度为4,一般为[1,高,宽,1]。因为您不想在批处理和通道上进行池化,所以它的值被设置为1。

批量标准化层:

batch_normalization( x,均值,方差,偏移,比例,方差_ε,name=none)

●要计算的tf.nn .矩的均值和方差:

Batch _ mean,batch _ var = tf.nn .矩(x,轴= [0,1,2],keep _ dim = true),注意轴的输入。对于以要素图为维度的全局归一化,如果要素图的形状为[批次、高度、宽度、深度],则轴被指定为[0,1,2]

●x为要素图的输入四维数据,偏移和比例尺为一维张量数据,形状等于要素图的深度。

代码示例:

sklearn库中的手写数字识别是通过构造卷积神经网络来实现的,构造的卷积神经网络结构如下图所示:

将张量流作为tf导入

从sklearn.datasets导入load_digits

将numpy作为np导入

数字= load_digits()

x _ data = digits . data . as type(NP . float 32)

y _ data = digits . target . as type(NP . float 32)。重塑(-1,1)

打印x_data.shape

打印y数据. shape

(1797,64)

(1797,1)

从sklearn .预处理导入minmaxscaler

定标器=最小定标器()

x _ data = scaler . fit _ transform(x _ data)

从sklearn .预处理导入onehotencoder

Y = onehotencoder()。fit _ transform (y _ data)。todense () #热门编码

y

矩阵([[ 1。,0。,0。,...,0。,0。,0。],

[ 0。,1。,0。,...,0。,0。,0。],

[ 0。,0。,1。,...,0。,0。,0。],

...,

[ 0。,0。,0。,...,0。,1。,0。],

[ 0。,0。,0。,...,0。,0。,1。],

[ 0。,0。,0。,...,0。,1。,0。]])

#转换为图像格式(批次、高度、宽度、通道)

x = x_data .整形(-1,8,8,1)

批量= 8 #使用mbgd算法并将批量设置为8

def generatebatch(x,y,n_examples,batch_size):

对于范围内的批次I(n _ examples//batch _ size):

开始=批处理_ i *批处理_大小

结束=开始+批处理大小

batch_xs = x[start:end]

batch _ ys = y[开始:结束]

产量批次_xs,批次_ys #生成每个批次

tf.reset_default_graph()

#输入层

tf_x = tf.placeholder(tf.float32,[none,8,8,1])

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

#卷积层+激活层

conv _滤波器_w1 = tf .变量(tf.random_normal([3,3,1,10])

conv _滤波器_ B1 = TF . variable(TF . random _ normal([10])

relu _ feature _ maps 1 = TF . nn . relu (\

tf.nn.conv2d(tf_x,conv _滤波器_w1,跨距=[1,1,1,1],填充=相同)+conv _滤波器_b1)

#汇集层

max _ pool 1 = TF . nn . max _ pool(relu _ feature _ maps 1,ksize=[1,3,3,1],跨步=[1,2,2,1],填充=相同)

打印max_pool1

张量(“maxpool:0”,形状=(?,4,4,10),dtype=float32)

#卷积层

conv _滤波器_ w2 = TF . variable(TF . random _ normal([3,3,10,5])

conv _滤波器_ B2 = TF . variable(TF . random _ normal([5])

conv _ out 2 = TF . nn . conv 2d(relu _ feature _ maps 1,conv_filter_w2,跨步=[1,2,2,1],填充=相同)+ conv_filter_b2

打印conv_out2

张量(“add_4:0”,形状=(?,4,4,5),dtype=float32)

# bn标准化层+激活层

batch_mean,batch_var = tf.nn .矩(conv_out2,[0,1,2],keep _ dims =真)

shift = tf.variable(tf.zeros([5])

scale = TF . variable(TF . one([5])

ε= 1e-3

bn _ out = TF . nn . batch _ normalization(conv _ out 2,batch_mean,batch_var,shift,scale,epsilon)

打印bn_out

relu _ bn _ maps 2 = TF . nn . relu(bn _ out)

张量(“batch ORM/add _ 1:0”,形状=(?,4,4,5),dtype=float32)

#汇集层

max _ pool 2 = TF . nn . max _ pool(relu _ bn _ maps 2,ksize=[1,3,3,1],跨步=[1,2,2,1],填充=相同)

打印max_pool2

张量(“maxpool_1:0”,形状=(?,2,2,5),dtype=float32)

#展开要素地图

max _ pool 2 _ flat = TF . resform(max _ pool 2,[-1,2*2*5])

#全连接层

fc _ w1 = TF . variable(TF . random _ normal([2 * 2 * 5,50])

fc _ B1 = TF . variable(TF . random _ normal([50])

fc _ out 1 = TF . nn . relu(TF . mat mul(max _ pool 2 _ flat,fc_w1) + fc_b1)

#输出层

out _ w1 = TF . variable(TF . random _ normal([50,10])

out _ B1 = TF . variable(TF . random _ normal([10])

pred = TF . nn . soft max(TF . mat mul(fc _ out 1,out_w1)+out_b1)

损耗=-TF . reduce _ mean(TF _ y * TF . log(TF . clip _ by _ value(pred,1e-11,1.0)))

train _ step = TF . train . adamoptimizer(1e-3)。最小化(损失)

y_pred = tf.arg_max(pred,1)

bool _ pred = TF . equal(TF . arg _ max(TF _ y,1),y_pred)

精度= TF . reduce _ mean(TF . cast(bool _ pred,tf.float32)) #精度

tf.session()作为sess:

sess . run(TF . global _ variables _ initializer())

对于范围内的历元(1000): #迭代1000个周期

对于批处理_ xs,批处理_ ys在生成批处理(x,y,y .形状[0],批处理_大小):#每周期执行一次mbgd算法

sess.run(train_step,feed_dict={tf_x:batch_xs,tf_y:batch_ys})

if(纪元%100==0):

res = sess.run(精度,feed_dict={tf_x:x,tf_y:y})

打印(纪元,res)

RES _ ypred = y _ pred . eval(feed _ dict = { TF _ x:x,TF _ y: y})。flat () #只能预测一批样本,而不能预测一个样本

打印res_ypred

(0,0.36338341)

(100,0.96828049)

(200,0.99666113)

(300,0.99554813)

(400,0.99888706)

(500,0.99777406)

(600,0.9961046)

(700,0.99666113)

(800,0.99499166)

(900,0.99888706)

[0 1 2...,8 9 8]

在第100次批量迭代中,准确率很快接近收敛,这归功于批量归一化的作用!需要注意的是,该模型不能用于预测单个样本,因为当计算bn层时,单个样本的均值和方差都为0,这将得到相反的预测效果。请参见解决方案的规范化层。

从sklearn.metrics导入准确性_score

打印精度分数(y_data,RES _ ypred . resform(-1,1))

0.998887033945

张量流&神经网络算法高级应用类即将开始!从初级到高级,理论+实战,一站式深入了解张量流!

本课程旨在深入学习开发人员,并教授如何使用张量流解决特定问题,如图像识别和文本分析。为期10周的课程将从张量流的原理和基本实践技能开始,逐步教会学生如何在张量流上构建cnn、自编码、rnn、gan等模型,最终掌握一套基于张量流的深度学习和发展的专业技能。

作为思想工作的高级技术专家,童达和白华川两位教师在构建大数据平台和开发深度学习系统方面有着丰富的经验。

时间:每周二和周四晚上20: 00到21: 00

课程时长:共20小时,10周完成,每周2次,每次1小时

在线教学地址:mooc.ai/

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

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

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

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

来源:搜狐微门户

标题:从理论到实践,手把手教你如何用 TensorFlow 实现 CNN

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