• tensorflow2.x:构建tf.keras.Model实例的几种方式


    说明

    我以前是tensorflow1.x的用户,当时tensorflow还没合并keras,很多接口比较原始,还有session和napescope等概念。最近接触了下tf2.9, 发现写法都变了,作为一个tf2.x的初学者,记录下自己刚开始的一些心得。

    我看到tf2.9的接口已经很接近pytorch了,但是还是没有pytorch好用。我看到教程里搭建模型主要就是实例化一个tf.keras.Model并对它进行各种设置,实例化一个tf.keras.Model对象竟然同时存在多种方式,这也不是“灵活”能解释的通的,感觉还是没有实现一种好用的方式达到“一招鲜”,多种方式并存的原因可能还是设计不够简单。

    使用tf.keras.Sequential

    tf.keras.models.Sequential继承自tf.keras.Model,所以实例化一个Sequential对象也可以。Sequential主要用于结构简单的层级网络,无法构建结构复杂的网络,这点从名字里也可看出来。

    接口定义:

    tf.keras.Sequential(
        layers=None, name=None
    )
    
    • 1
    • 2
    • 3

    初始化的时候可以传图两个参数,第一个是网络层的列表,第二个是名字。
    同时tf.keras.models.Sequential也是它的别名。

    方法1: 构造传参初始化

    教程里的例子:

    import tensorflow as tf
    
    model = tf.keras.models.Sequential([
      tf.keras.layers.Flatten(input_shape=(28, 28)),
      tf.keras.layers.Dense(128, activation='relu'),
      tf.keras.layers.Dropout(0.2),
      tf.keras.layers.Dense(10, activation='softmax')
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里传入了多个layers对象,组成了这个模型。这是比较简单的一种方式。

    方法2:使用add()增加layers

    构造时不传参,构造后可以使用add接口一层层往上加

    model = tf.keras.Sequential()
    model.add(tf.keras.Input(shape=(16,)))
    model.add(tf.keras.layers.Dense(8))
    model.add(tf.keras.layers.Dense(4))
    
    • 1
    • 2
    • 3
    • 4

    这里构造了一个两层全连接的网络。

    构造一个tf.keras.Model实例

    Sequential只能搭建简单的网络,如果内部有复杂的结构,就需要直接使用tf.keras.Model构造。

    方法3:继承tf.keras.Model类

    这也是最像pytorch的方式。主要就是实现call()函数,其原型:

    call(
        inputs, training=None, mask=None
    )
    
    • 1
    • 2
    • 3

    教程里的例子:

    class MyModel(tf.keras.Model):
      def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = Conv2D(32, 3, activation='relu')
        self.flatten = Flatten()
        self.d1 = Dense(128, activation='relu')
        self.d2 = Dense(10, activation='softmax')
    
      def call(self, x):
        x = self.conv1(x)
        x = self.flatten(x)
        x = self.d1(x)
        return self.d2(x)
    model = MyModel()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如果是多输入输出的话,输入用[inoput1, input2]这样的方式来传入就可以,输出用[out1,out2]的方式来返回。

    方法4:直接构造tf.keras.Model实例

    最简单的方式构造一个单输入输出的网络:

    inputs = tf.keras.layers.Input(shape=(3,))
    outputs = tf.keras.layers.Dense(2)(inputs)
    model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
    
    • 1
    • 2
    • 3

    也可构建多输入输出的网络。这里是一个两个输出的例子:

    inputs = tf.keras.layers.Input(shape=(3,))
    d = tf.keras.layers.Dense(2, name='out')
    output_1 = d(inputs)
    output_2 = d(inputs)
    model = tf.keras.models.Model(
       inputs=inputs, outputs=[output_1, output_2])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考资料

    TensorFlow官方中文教程

    tensorflow2 class多输入的操作

    Tensorflow2.0 keras 函数式多输入多输出

  • 相关阅读:
    spring boot项目自动加载引入外部bean
    milvus 结合Thowee 文本转向量 ,新建表,存储,搜索,删除
    JavaScript 对象增删改查 + 遍历对象+内置函数 + 随机对象
    一键自动化博客发布工具,用过的人都说好(oschina篇)
    大学生静态HTML网页源码——佛山旅游景点介绍网页代码 家乡旅游网页制作模板 web前端期末大作业
    差点送外卖!双非普本的我刷完P8大佬的性能调优手册,终面进阿里
    多智能体进化算法求解带时间窗的VRP问题(python)
    JUC笔记(五) --- 无锁共享模型
    5款热门可视化工具对比,老板直呼酷炫!
    基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
  • 原文地址:https://blog.csdn.net/yuanlulu/article/details/126500997