美文网首页
0117:tf模型建立

0117:tf模型建立

作者: 是黄小胖呀 | 来源:发表于2021-01-18 10:29 被阅读0次

    1、tf模型过程

    主要是定义模型的前向反馈过程,接下来介绍如何使用 TensorFlow 快速搭建动态模型。

    1)模型的构建: tf.keras.Model 和 tf.keras.layers

    2)模型的损失函数: tf.keras.losses

    3)模型的优化器: tf.keras.optimizer

    4)模型的评估: tf.keras.metrics

    2、Keras

    Keras 有两个重要的概念: 模型(Model) 和 层(Layer) 。层将各种计算流程和变量进行了封装(例如基本的全连接层,CNN 的卷积层、池化层等),而模型则将各种层进行组织和连接,并封装成一个整体,描述了如何将输入数据通过各种层以及运算而得到输出。在需要模型调用的时候,使用 y_pred = model(X) 的形式即可。Keras 在 tf.keras.layers 下内置了深度学习中大量常用的的预定义层,同时也允许我们自定义层。

    Keras 模型以类的形式呈现,我们可以通过继承 tf.keras.Model 这个 Python 类来定义自己的模型。在继承类中,我们需要重写 __init__() (构造函数,初始化)和 call(input) (模型调用)两个方法,同时也可以根据需要增加自定义的方法。

    classMyModel(tf.keras.Model):

         def__init__(self):

             super().__init__()

               # Python 2 下使用 super(MyModel, self).__init__()

               # 此处添加初始化代码(包含 call 方法中会用到的层),例如

               # layer1 = tf.keras.layers.BuiltInLayer(...)

               # layer2 = MyCustomLayer(...)

        defcall(self,input):

             # 此处添加模型调用的代码(处理输入并返回输出),例如

             # x = layer1(input)

             # output = layer2(x)

             # returnoutput

             # 还可以添加自定义的方法

    图示,其实说到底就两个过程啊:

    keras模型类定义示意图

    更新于20210118:

    Keras 模型以类的形式呈现,我们可以通过继承 tf.keras.Model 这个 Python 类来定义自己的模型。在继承类中,我们需要重写 __init__() (构造函数,初始化)和 call(input) (模型调用)两个方法,同时也可以根据需要增加自定义的方法。

    其中,__init__() 方法,构造器初始化模型的所有层以及最先涉及到super函数,调用父类方法。

    其中,call(input) (模型调用)方法,描述的是如何从输入经过各种层进行输出的过程。

    因此,继承 tf.keras.Model 后,我们同时可以使用父类的若干方法和属性,例如在实例化类 model = Model() 后,可以通过 model.variables 这一属性直接获得模型中的所有变量,免去我们一个个显式指定变量的麻烦。

    例如一个模型化例子:

    虽然模型没有显式建立线性变换,但建立了一个继承了 tf.keras.Model 的模型类 Linear ,这个类在初始化部分实例化了一个 全连接层 ( tf.keras.layers.Dense ),并在 call 方法中对这个层进行调用,实现了线性变换的计算。

    小问题:为什么模型类是重载 call() 方法而不是 __call__() 方法?

    在 Python 中,对类的实例 myClass 进行形如 myClass() 的调用等价于 myClass.__call__() 。

    __call__函数/方法

    那么看起来,为了使用 y_pred = model(X) 的形式调用模型类,应该重写 __call__() 方法才对呀?

    原因是 Keras 在模型调用的前后还需要有一些自己的内部操作,所以暴露出一个专门用于重载的 call() 方法。 tf.keras.Model 这一父类已经包含 __call__() 的定义。 __call__() 中主要调用了 call() 方法,同时还需要在进行一些 keras 的内部操作。这里,我们通过继承 tf.keras.Model 并重载 call() 方法,即可在保持 keras 结构的同时加入模型调用的代码。

    2、Keras Pipeline *

    首先理解Pipeline,最典型和常用的神经网络结构是将一堆层按特定顺序叠加起来,那么,我们是不是只需要提供一个层的列表,就能由 Keras 将它们自动首尾相连,形成模型呢?大概意思是一个序列的数据处理流程吧。

    然后Keras 的 Sequential API 正是如此。通过向 tf.keras.models.Sequential() 提供一个层的列表,就能快速地建立一个 tf.keras.Model 模型并返回:

    Sequential API 

    使用 Keras Model 的 compile 、 fit 和 evaluate 方法训练和评估模型 

    当模型建立完成后,通过 tf.keras.Model 的 compile 方法配置训练过程:

    Model 功能模块

    如果需要显式地声明自己的变量并使用变量进行自定义运算,或者希望了解 Keras 层的内部原理,请参考自定义层

    自定义层:

    自定义层需要继承 tf.keras.layers.Layer 类,并重写 __init__ 、 build 和 call 三个方法。

    例如,如果我们要自己实现一个本章第一节中的全连接层( tf.keras.layers.Dense ),可以按如下方式编写。此代码在 build 方法中创建两个变量,并在 call 方法中使用创建的变量进行运算:

    自定义层

    todo:

    1、动手实现自定义层

    2、动手Sequential API 

    done

    参考资料

    1、TensorFlow 模型建立与训练  https://tf.wiki/zh_hans/basic/models.html#

    2、Sequential API  Keras中的Sequential模型和Functional模型区别   https://blog.csdn.net/weixin_38740463/article/details/90479319 

    相关文章

      网友评论

          本文标题:0117:tf模型建立

          本文链接:https://www.haomeiwen.com/subject/rknaaktx.html