当前位置: 首页 > 后端技术 > Python

TensorFlow学习(三)

时间:2023-03-25 21:02:07 Python

前言一个卷积层一般分为三部分。第一部分是卷积层。卷积运算可以参考上一节的例子。它是用来提取特征的,但是这里提取的特征是线性的,不具备学习的“能力”。为了让卷积网络具备学习能力,下面有必要介绍下第二部分和第三部分的激活层和池化层。值得注意的是,本文提到的卷积层将卷积、激活和池化视为一个复杂的层。当然,在卷积神经网络中,这三层也可以看作是三个简单层。这意味着并非每一层都有权重和偏差。Activation1.概念卷积阶段输出的线性“特征”会经过一个非线性函数的处理,处理不会改变输入数据的大小。我们称这个函数为激活函数,这一步称为激活层(layer)。在生物学中,只有当前端树突传递的信号的加权和大于某个阈值时,才会激活后面的神经元。在对应的卷积神经网络中,当输入的特征值大于某个阈值时,会保留该特征,如果特征不满足阈值,则输出为0。换句话说,只有当特征强度图片中某个区域的强度达到一定标准,说明该区域的特征具有学习意义,强度较弱的区域不会影响图片的识别。换句话说,如果没有激活函数,即使特征很弱,仍然可以获得输出,并且后续层继续使用这个输出作为特征,这会对网络的学习能力产生负面影响。网络。2.激活函数激活函数有很多,sigmoid、relu、tanh、abs等,这里主要介绍常用的relu激活函数,可以说是非常常用的。其余请参考其他说明。ReLu激活函数的表达式为f(x)=max(0,x),如下图所示:ReLu函数表示特征值小于0,输出0,其余输出特征值。这种激活函数的主要优点是函数的计算量小,其次收敛速度快,效果很好,所以是目前最流行的激活函数。在tensorlow中封装了卷积层和激活层,可以直接在参数中选择激活函数,如下:#默认是nn.relu,即max(0,x)slim.conv2d(。..,activation_fn=,...)当然你也可以指定自己的激活函数,可以用来修改阈值:#Customreluthresholddeflrelu(x,coef=0.2):returntf.maximum(x,coef*x)#使用slim.conv2d(...,activation_fn=lrelu,...)pooling1.概念池化层的操作是:使用特征区域中某个位置的相邻输出来替换特征区域中网络的输出。池化操作和卷积操作一样,会改变输入数据的大小。当然也可以通过改变stride和padding来保持size不变。池化层一个很重要的性质就是平移不变性,即无论卷积网络使用什么池化函数,当输入进行少量平移时,池化都能使输入表示近似不变。具体可以参考上面结的Equivariantrepresentation。这个属性可以很好的做到我们不需要关心某个特征出现的位置,只需要关心它是否出现。当然,池化层不适合位置区分很重要的领域。同时,池化操作综合了池化区域中k个像素的统计特征,而不是单个像素,即下一层的输入相当于少了k倍的数据量,对应的数据量就少了,并且还可以提高网络的计算效率。增加和减少参数的存储要求。数据量的减少也变相的提高了网络的泛化能力,对防止网络过拟合也起到了一定的作用。2.Poolingfunction一般来说,池化层指的是最大池化和平均池化。其他的池化函数如L^2normpooling和weightedaveragepooling,可以参考其他的介绍。Maxpooling使用池化区域的最大值来表示区域的整体特征,可以更好的保留图像的纹理信息。在tensorflow中使用如下:#指定卷积核大小和步长slim.max_pool2d(inputs=,kernel_size=,stride=)andaveragepooling(均值池化)意思是用池化区域的平均值来表示区域的整体特征,可以更好的保留图像的背景信息。它在tensorflow中的使用如下:slim.avg_pool2d(inputs=,kernel_size=,stride=)总结了一个卷积层可以由卷积层、激活层和池化层组成。卷积层的作用主要是对输入数据进行“特征”提取。另外,卷积负责对输入数据进行线性运算,激活负责非线性处理,池化用于减少特征数量。最后用一张简单的流程图总结一下复杂卷积层的处理过程:【每天关注公众号DoCode、LeetCode等学习内容,利用碎片化时间】