2017年8月19日星期六整理第五章部分
此处给出本节的代码:https://github.com/Leechen2014/TensorFlow-for-Machine-Intelligence
相关的文件描述在github中给出。
PS:翻译来源:
http://shop.oreilly.com/product/9781939902351.do
PS: 我发现: 最近发现,短文比较好一些。 如果按照章节来上传文章,会导致文章太长。 我也没有写摘要。而且在翻译的时候我会有一些自己的想发。
于是决定:从5.3 以后的每个章节会给出自己的写的摘要,同时会以PS的方式给出自己对作者这句话的理解。文中有翻译不恰当的地方,请大家多多批评指教。另外给出我的邮箱。如果有想要一起翻译并研读机器学习的同学请发邮件给我: zhen_2016@qq.com; 多谢了
摘要:
5.3Common Layers 会 以上下两部分发布。
上部分主要涉及 tf的卷积以及 激活函数 的操作与实现
下部分 主要涉及 池化层的实现以及 Normalization 和High Level Layers
对于要被认为是CNN的神经网络架构而言,它需要至少一个卷积层(tf.nn.conv2d)。才能称为CNN。单层的CNN有着实际应用(边缘检测),而对于图像的识别和分类,通常使用的是不同类型的layer来支持卷积层的。这些layers会有助于减少过拟合、加速训练、降低对内存使用。
本章中涵盖的层次集中在CNN架构中常用的layer上。这些layer不限于仅应用于CNN,他们还可以为其他的网络架构设计的层混合使用。
Convolution Layers(tf.nn.conv2d)
tf.nn.conv2d是卷积层的一种类型,它在前面的章节中已被详细描述。但是对于高水平的用户还是有一些有用的notes。Tensorflow中的卷积层并不会做完全的卷积,详细的内容可以到Tensorflow
API 说明文档中找到。在实践中,性能是tensorflow的操作和卷积的差异。TensorFlow使用一种技术来加速所有不同类型的卷积层的卷积运算。
每种类型的卷积层都有用例,但是tf.nn.conv2d是一个很好的起点。其他类型的卷积在构建能够进行对象识别和分类的网络中是有用的但不是必需的。包括每个的简要摘要。
tf.nn.depthwise_conv2d
当需要一个卷积的输出作为另一个卷积的输入的时候,可以使用这种卷积。这里有一个使用该卷积按照inception 结构来创建网络结构的高级用例。
tf.nn.separable_conv2d
这个卷积类的作用和tf.nn.conv2d相似,但是并不可以替代tf.nn.conv2d。对于较大的模型,我们可以用它来替代tf.nn.conv2d却不牺牲精度。对于小型模型,它将会以差的精度快速收敛。
tf.nn.conv2d_transpose
这将内核应用于新功能图(特征图,feature map),其中每个部分都填充与内核相同的值。随着内核跨越新的图像,任何重叠的部分都被合并在一起。Stanford’s
CS231n Winter 2016: Lecture 13中有关于如何tf.nn.conv2d_transpose对可学习的上采样(upsampling)有何作用的例子。
Activation Functions
这些函数(function)与其他层的输出结合使用可以生成特征图(feature map)。它们可用于平滑或可微(smooth or differentiate:PS这里涉及一点点高数的知识:函数如果可导的充要条件是函数的图像是光滑的)某些操作的结果。其目的是为了将非线性引入神经网络中。非线性意味着输入的是曲线而不再是直线。(PS:如果是直线的话,我们可以近似的看做离散值或者直接映射成输入即可)。曲线能够表示更复杂的输入变化。例如,非线性输入能够描述在大多数时间内保持较小的输入,但是周期性地具有极端的单个点。在神经网络中引用非线性可以使得网络通过训练在数据中发现复杂的模式(patterns)。
TensorFlow具有多种激活函数(TensorFlowhasmultiple activation functionsavailable)。在CNN中主要使用的是tf.nn.relu,这是因为它可以通过丢失必要的信息来提升性能。当开始学的时候(When starting out),建议使用tf.nn.relu,但高级用户可能会创建自己的激活函数。这个时候需要考虑激活功能是否可用(),有几个主要的考虑因素。
这些函数(function)与其他层的输出结合使用可以生成特征图(feature map)。它们可用于平滑或可微(smooth or differentiate:PS这里涉及一点点高数的知识:函数如果可导的充要条件是函数的图像是光滑的)某些操作的结果。其目的是为了将非线性引入神经网络中。非线性意味着输入的是曲线而不再是直线。(PS:如果是直线的话,我们可以近似的看做离散值或者直接映射成输入即可)。曲线能够表示更复杂的输入变化。例如,非线性输入能够描述在大多数时间内保持较小的输入,但是周期性地具有极端的单个点。在神经网络中引用非线性可以使得网络通过训练在数据中发现复杂的模式(patterns)。
TensorFlow具有多种激活函数(TensorFlowhasmultiple activation functionsavailable)。在CNN中主要使用的是tf.nn.relu,这是因为它可以通过丢失必要的信息来提升性能。当开始学的时候(When starting out),建议使用tf.nn.relu,但高级用户可能会创建自己的激活函数。这个时候需要考虑激活功能是否可用(),有几个主要的考虑因素。
1.该函数应该是单调(monotonic)的,因此其输出应随着输入的增加而逐渐增加。这个性质可以使得梯度下降优化来搜索局部最小值。
2.该函数应该是可导(differentiable)的,所以在函数域中的任何一点必须有一个导数。这使得梯度下降优化使用此类型的激活函数的时候可以正常输出。
能满足以上条件的函数都可以考虑成为激活函数。在TensorFlow中不值得一提,毕竟是CNN架构中常见的内容。每个的简要摘要都包含在一个小示例代码中,说明其用法。
tf.nn.relu
rectifier (rectified linear unit ),在一些文档中被叫做斜坡函数(a ramp
function),当绘制时看起来像一个滑板坡道。ReLu保持输入的任何正数都是有线性的输出而设置的所有负面的数字是0。他的优点不会受到梯度消失(gradientvanishing),并且就有[ 0,正无穷]的输出范围。ReLu的缺点是当使用较大的学习率时,它可能遭受神经元饱和。
在这个示例中,代码执行的输出结果是:
在这个例子中,输入中的整数值[-2,3]之间的一个张量(向量)。tf.nn.relu函数运行的时候,输出高亮显示任何小于0的值被设置为0的值。其他输入值保持不变。
tf.sigmoid
sigmoid函数的返回值的范围在[0.0, 1.0]。传递给sigmoid函数的值越大,输出的值越靠近1.0;当输入的值越小,输出的值越靠近0.0。sigmoid可以把任何值保持在[0.0, 1.0]范围内。这种能力对于训练在[0,1]范围内的概率的网络中是有用的。然而,输出值的减小范围可能会导致输入饱和和输入变化过大的麻烦。
执行以上程序后的输出结果是:
在这个例子中,整数的范围被转换为浮点值(1变为1.0),Sigmoid函数在输入要素上运行。结果表明,当0.0的值通过S形,结果为0.5,这是类似物的域的中点。需要注意的是,0.5是S形的中点,负值可以用作S形的输入。
tf.tanh
双曲正切函数(tanh)与tf.sigmoid是比较接近,具有一些相同的优点和缺点。tf.sigmoid和tf.tanh之间的主要区别在于:tf.tanh的范围是[-1.0, 1.0]。在某些网络架构中输出负值的能力可能是有用的。
以上程序的输出结果是:
在本示例中,所有设置参数与tf.sigmoid示例相同,但输出显示了重要的区别。在tf.tanh的输出中,中点为0.0,为负值。如果网络中的下一层没有对负数或者是0.0的输入做出异常判断,则会导致程序出现故障。
tf.nn.dropout
基于可配置的概率将输出设置为0.0。这个层在有些随机性有助于训练的情况下表现良好。下面会给出一个示例性的情况:当被学习的模式与其相邻功能太紧时。这个层会对正在学习的输出增加一点噪音。
注意:该层只能在训练中使用,因为它添加的随机噪声在测试时会产生误导性的结果。
以上示例的输出结果是:
在这个例子中,输出的概率保持50%。这个层的每个执行将具有不同的输出(很有可能,它有点随机)。当输出丢弃时,其值设置为0.0。
PS:这个在实际情况中会常常用到。你还记得dropOut是什么嘛。不知道的话看看知乎:
Krizhevsky等人是怎么想到在CNN里用Dropout和ReLu的?
PS:为了更加直观的对比这几个激活函数,我在知乎上找到了这个图片,详情请见:
function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?
以及http://www.cnblogs.com/neopenx/p/4453161.html
PS: 稍后会给以下话题:
Imagesand TensorFlow
CNNImplementation
Conclusion
有点累了, 上传太费时间了。 为什么jianshu 只有android ios 的客户端呢? 我要去打球 :)
by 2017年 8月19日 晚上8点2o......