借着课题机会尝试写下使用指導教程,也作为备忘
keras如何安装Keras比较简单,重点是后端的如何安装Keras(tensorflow或者theano如何安装Keras一个就好当然两个都如何安装Keras随你,用的时候只选一個作后端)
这里假设你已经熟练tensorflow的如何安装Keras并已经将它装到Ubuntu里面剩下的就是pip如何安装Keraskeras了:
借着课题机会尝试写下使用指導教程,也作为备忘
keras如何安装Keras比较简单,重点是后端的如何安装Keras(tensorflow或者theano如何安装Keras一个就好当然两个都如何安装Keras随你,用的时候只选一個作后端)
这里假设你已经熟练tensorflow的如何安装Keras并已经将它装到Ubuntu里面剩下的就是pip如何安装Keraskeras了:
之前我们简要介绍了Keras与Tensorflow的一些基夲用法主要是了解整个深度学习框架的执行,这样我们就可以复现出别人的模型拿到别人的模型就可以跑了,甚至做一些简单的改动但是,如果想有一些创新不会自定义层可谓是巧妇难为无米之炊,没有趁手的武器再高的武功也不行。
我们都知道深度学习曾经昰计算图模型,讲究的是计算节点(Node)以及计算流的结合体后来随着Keras的进一步封装,计算图模型则是以层和层之间的链接构成可以说,层是模型下面一个级别模型可以包含多个模型组成,也可以由多个层组成以现在来看,层是我们可以操作的最小逻辑单位(底层的數学变换)我们这里以为例,激活函数基本上是一个无需参数的函数变换从下文中也可以看到。
从这个简单的激活层函数中我们可鉯管中窥豹,看到这个层“麻雀虽小五脏俱全”为我们展示了一个层的基本特征:
我们常见的全连接层(Dense),卷积层(CNN)长短时记忆網络层(LSTM)等都是Keras集成好的层,和上述的激活函数一样只不过更加复杂,通过他们的代码我们可以学习到一个层该如何编写然后在下媔一节,我们将讲述如何编写自定义层
这里首先介绍一些接下来将要使用的,方便下面的讲解
@property
让类函数能像类变量一样操作
@classmothod
类函数,屬于整个类类似于C++/JAVA中的静态函数。类方法有类变量cls传入从而可以用cls做一些相关的处理。子类继承时调用该类方法时,传入的类变量cls昰子类而非父类。既可以在类内部使用self访问也可以通过实例、类名访问。
@staticmethod
将外部函数集成到类体中,既可以在类内部使用self访问也可以通过实例、类名访问。基本上等同于一个全局函数
__call__
让类的实例可以像函数一样调用,正是python的这种特性让我们可以像这样进行层之间的连接:
在上面代码中需要重点关注以下函数,我在源码中都已经标注:
可见from_config昰一个classmethod根据传入的参数,使用当前类的构造函数来生成一个实例通过子类调用时,cls是子类而不是基类Layer
卷积层就是一个加权平均的过程,具体的使用可以参考《》令人神奇的是,Keras自己并没有实现核心代码下面是Keras的卷积层的基类代码
这里可以看到,它在call里使用的是一個后端的conv1d函数而这个函数在Keras里并没有显式的给出,我们追溯了Tensorflow和CNTK等后端发现它们实现这个函数时,同样是封装好的并看不到最终源碼。不过我们也知道卷积只是局部的加权求和过程因此也能够手动实现。我们这里更想强调的是如何将公式和代码相结合以便于后来嘚自定义层的编写。
相比较CNNRNN就友善的许多,其中两个比较著名的层SimpleRNN和LSTM都有相关的代码我们下面来解析一下。
SimpleRNN就是正统的RNN它就是最简單的循环层,首先看一下图示:
再看一下其数学公式表达为:
它的当前步的输出结合了当前步的输入以及上一步的输出我们下面看一下源码是如何实现的。
门控循环神经网络(GRU)是另一个常用的循环层它比SimpleRNN稍微复杂一些,其图解如下:
我们接着看一看它的公式:
这是当湔步最后传递出的信息
这里的GRU的代码好像和公式不对应可学习变量只有2个(公式里有6个),式子也不是4个其实是对应的,不过它做了非常巧妙的运算
LSTM是最常用的循環层了它的核心在于LSTM-Cell层,首先我们看一下图示:
图里其他部分不太清楚是因为我从《》中没找到像RNN和GRU一样又完整有清晰的图,其次我們来看一下公式:
这里代码也对于原公式进行了一些修改其中2个可学习参数分别代表W和U。
操作1计算了以下公式中的Wx+b的部分:
操作2则补全叻公式中的Uh部分
通过以上几个Keras源码的解析让我们熟悉了公式和真正代码之间是如何建立起映射关系的,为我们接下来自定义层打下基础值得注意的是2件事,一、以上代码具有时效性将来会被tensorflow 2.0取代一部分;二、以上代码仅供理解和学习使用,没有进行任何CUDA的优化优化模块不是此写法。
自定义层都是为了自己的公式而实现的层从丰满程度上确实不如官方层,普适性也不高因此不会像官方层一样拖着佷多参数和判断,下面提供两个简单的层的样例当做是抛砖引玉,以后我们会介绍更多数学公式转换而来的层
这里实现的是全连接层,即y=xw+b的张量化版本相比较官方的Dense层,这个代码简单了许多当然也有很多局限性了。
这里使用自定义的RNN更清楚的表示RNN的过程而且是自帶分类的RNN。
多输入多输出层就是接受两个以上的输入,两个以上的输出其实现形式都是以列表的形式输入输出,下面昰一个示例代码:
不同于之前所说的严格意义上的层因为上面的层有着完善的结构,可以在很多信息里获得而如果只是一个变换,不需要学习参数的话例如激活函数那种,那只需要使用Lambda层即可这里算是借用了Python中的lambda的说法,但是并不是严格意义上的lambda接下来我们先介紹Python中的lambda表达式,然后我们再介绍Keras中的Lambda层,这样对于两者的区别就有一个更加直观的认识
lambda表达式在各个语言中都有出现,例如java和C#中它昰一种轻型函数,因为它只能够执行一行表达式下面是一个简单的例子。
由上式可以看到lambda表达式的样子即只有输入和用于输出的一个呴子,相当于一个函数只有return一条语句:
它能够广泛应用于轻量级的运算中例如排序算法:
总体來看它更像是一种简单的接口,可以当做一个对象来使用
首先我们来看Keras中Lambda层的样子:
function:要实现的函数,该函数仅接受一个变量即上┅层的输出
output_shape:函数应该返回的值的shape,可以是一个tuple也可以是一个根据输入shape计算输出shape的函数
arguments:可选,字典用来记录向函数中传递的其他关鍵字参数
它的实际使用方法如下,这是一个:
本章主要讲解了如何使用Keras或者Tensorflow的层并解读了一些Keras官方层的源码,加深了对于代码和公式之間联系的理解并且,我们也讲解了如何编写自己的自定义层在接下来的时间里,我们会继续讲解其他类型的层并深入探究其计算图模型的运行时的一些要点,如张量大小的变换等
当数据很多时考虑到效率和内存的问题,这时应该使用fit_generator(generator,...)来训练
具体就是构建如下函数:
当然,这样做需要自己管控batchshuffle等等,还是比较麻烦
這里有一个问题,对于batch往往不能整除那么应该如何处理呢?
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。