前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【深度学习】Tensorflow2.x入门(一)建立模型的三种模式

【深度学习】Tensorflow2.x入门(一)建立模型的三种模式

作者头像
黄博的机器学习圈子
发布于 2020-12-11 01:47:40
发布于 2020-12-11 01:47:40
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

前言

最近做实验比较焦虑,因此准备结合推荐算法梳理下Tensorflow2.x的知识。介绍Tensorflow2.x的文章有很多,但本文(系列)是按照作者构建模型的思路来展开的,因此不会从Eager Execution开始。另外,尽量摆脱小白文,加入自己的理解。 本文约2.7k字,预计阅读10分钟。

Tensorflow2.x的三种建模方式

Tensorflow2.x创建模型的方式主要有三种:

  1. Sequential API,顺序模型;
  2. Function API,函数式模型;
  3. Subclassing API,子类化模型;

其中Sequential API只适用于简单的层堆叠,很难实现复杂模型,而Function APISubclassing API各有优劣,也不必区分,因为可以进行混搭。

1. Sequential API

顺序API是layer-by-layer的方式,适用于简单的层堆栈,但对于构建多输入、多输出的模型难以实现。个人并不推荐使用这种方式构建模型,因此简单放个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = Sequential(
    [
        Input(shape=(3,)),
        Dense(2, activation='relu', name='layer1'),
        Dense(3, activation='relu', name='layer2'),
        Dense(4, name='layer3'),
    ]
)

2. Function API

函数式API能很好的处理非线性拓扑、共享层、具有多输入多输出的模型。且模型通常都是层的有向无环图(DAG),因此函数式API是构建层计算图的一种方式。

以下是Encoder-Decoder结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_models():
    encoder_input = Input(shape=(28, 28, 1), name="img")
    x = layers.Conv2D(16, 3, activation="relu")(encoder_input)
    x = layers.Conv2D(32, 3, activation="relu")(x)
    x = layers.MaxPooling2D(3)(x)
    x = layers.Conv2D(32, 3, activation="relu")(x)
    x = layers.Conv2D(16, 3, activation="relu")(x)
    encoder_output = layers.GlobalMaxPooling2D()(x)

    x = layers.Reshape((4, 4, 1))(encoder_output)
    x = layers.Conv2DTranspose(16, 3, activation="relu")(x)
    x = layers.Conv2DTranspose(32, 3, activation="relu")(x)
    x = layers.UpSampling2D(3)(x)
    x = layers.Conv2DTranspose(16, 3, activation="relu")(x)
    decoder_output = layers.Conv2DTranspose(1, 3, activation="relu")(x)
    
  autoencoder = Model(encoder_input, decoder_output, name="autoencoder")

    return encoder, autoencoder

有时候,内置的tf.keras层并不满足我们构建复杂的模型,因此需要实现Subclassing API中的自定义层。

3. Subclassing API

子类化API是通过继承tf.keras.layers.Layer类或tf.keras.Model类的自定义层和自定义模型。它们与函数式API并不冲突,特别是自定义层---创建自己的层来扩展API,很方便的与函数式API结合构建模型。

3.1 Layer类

Keras的一个中心抽象是Layer类。层封装了状态(权重)和从输入到输出的转换(层的前向传播)。

一个简单的线性层定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Linear(keras.layers.Layer):
    def __init__(self, units=32, input_dim=32, **kwargs):
        super(Linear, self).__init__(**kwargs)
        self.w = self.add_weight(
            shape=(input_dim, units), initializer="random_normal", trainable=True
        )
        self.b = self.add_weight(shape=(units,), initializer="zeros", trainable=True)

    def call(self, inputs, **kwargs):
        return tf.matmul(inputs, self.w) + self.b

有几个注意点:

  • 可以在__iniit__()方法中创建类子层(tf.keras的内置层API,或者是自定义的),并可以在call()中调用;
  • 在定义变量时,有时候会看到:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  w_init = tf.random_normal_initializer()
          self.w = tf.Variable(
              initial_value=w_init(shape=(input_dim, units), dtype="float32"),
              trainable=True,
          )

add_weight()方法相同,但上述需要先定义初始化,再构造变量,而add_weight()可以在定义变量的同时进行初始化,推荐add_weight()方法;

  • 有时候变量会定义在build(self, input_shape)方法中,一种是因为书写习惯,另一种更重要的原因是「有时候事先并不知道输入的大小(即没有input_dim),希望在对层实例化后的某个时间再延迟创建权重」
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def build(self, input_shape):
          self.w = self.add_weight(
              shape=(input_shape[-1], self.units),
              initializer="random_normal",
              trainable=True,
          )
          self.b = self.add_weight(
              shape=(self.units,), initializer="random_normal", trainable=True
          )

其中input_shape代表输入的形状;

  • call(self, inputs, **kwargs),其中inputs是张量或张量的嵌套结构(多输入,张量列表),**kwargs是非张量参数。更一般的,call()方法应该为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  call(self, inputs, training=None, mask=None, **kwargs):

trainingmaskcall()方法中的特权参数,training针对BatchNormalizationDropout层在训练和推断期间具有不同的行为,mask则是当先前层生成了掩码时,Keras会自动将正确的mask传递给__call__(),具体可见下文。

3.2 Model类

Layer类通常是来定义内部的计算模块,例如一个FMself-attention等,Model类则是用来定义整个外部模型,例如DeepFMSASRec等。

Model类与Layer具有相同的API,但有以下区别:

  • Model会公开内置训练fit()、评估evaluate()、预测predict()
  • model.layers属性会公开其内部层的列表;
  • 会公开保存和序列化API(save()save_weights());

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyModel(keras.Model):
  def __init__(self, units=32, **kwargs):
    super(MyModel, self).__init(**kwrags)
    self.units = units
    self.linear = Linear(self.units)  # 去除input_dim
    
 def call(self, inputs, **kwargs):
    outputs = self.linear(inputs)
    return outputs
  

model = MyModel(32)
# model.compile(...)
# model.fit(...)
3.3 call()方法

上述提到,call()中包含两个特权参数,trainingmask

「training」

模型中,BatchNormalizationDropout层,在训练和推断期间具有不同的行为(简单说一下「推断」的含义,模型经过训练后,可以高效的从新的数据推断各种结论,即「预测」)。我们简单来看一下DropoutBatchNormalizationAPI中的描述:

❝Dropout: Note that the Dropout layer only applies when training is set to True such that no values are dropped during inference. When using model.fit, training will be appropriately set to True automatically, and in other contexts, you can set the kwarg explicitly to True when calling the layer. ❞

简单来说,当traning=True时,dropout不会在推理(inference)中起作用。在训练时,自动默认为True

❝BatchNormalization: training: Python boolean indicating whether the layer should behave in training mode or in inference mode.

  • training=True: The layer will normalize its inputs using the mean and variance of the current batch of inputs.
  • training=False: The layer will normalize its inputs using the mean and variance of its moving statistics, learned during training.

call()方法中,当training=True时,使用当前batch的输入平均值和方差对输入进行归一化,training=False则是使用在「训练期间」学习到的移动统计数据的均值与方差做归一化。

所以training是一个布尔参数,call()方法通过公开它,用来控制模型在哪个模式下运行(训练或推断)。

【注】对于Dropout层,默认即可,而BatchNormalization则需要自己考量,另外trainingtrainable是不同的,trainable=False是来冻结该层的,具体的可以看API。「当然可以不指定training,因为在fit()时,模型会根据相应的阶段(训练、推断)决定使用training值。」

「mask」

对于mask参数,当我们构建Attention机制或者序列模型时会使用到。如果先前的层生成了掩码,这里特别指的是tf.keras.layers.Embedding层,它包含了mask_zero参数,如果指定为True,那么Keras会自动将正确的mask参数传递给__call__()【函数式 API中 ,掩码会自动传播】。

当然如果不使用mask参数,对于生成掩码的层Embedding也会公开一个compute_mask(input, previous_mask)方法计算mask

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyLayer(layers.Layer):
    def __init__(self, **kwargs):
        super(MyLayer, self).__init__(**kwargs)
        self.embedding = layers.Embedding(input_dim=5000, output_dim=16, mask_zero=True)
        self.lstm = layers.LSTM(32)

    def call(self, inputs):
        x = self.embedding(inputs)
        # Note that you could also prepare a `mask` tensor manually.
        # It only needs to be a boolean tensor
        # with the right shape, i.e. (batch_size, timesteps).
        mask = self.embedding.compute_mask(inputs)
        output = self.lstm(x, mask=mask)  # The layer will ignore the masked values
        return output

【注】当然也可以自己通过inputs或者其它方式,自己计算mask

4. 源码学习

建议阅读Tensorflow中的Transformer源码加深对Function APISubclassing API的理解。 地址(点击原文):https://www.tensorflow.org/tutorials/text/transformer

当然也可以参考下我的github(广告):https://github.com/ZiyaoGeng/Recommender-System-with-TF2.0

总结

上述是个人对Tensorflow2.x构建模型方式的总结,自己偏好使用子类化模型(Java的习惯),当然函数式API也有很多的优点,开源项目deepctr就是采用函数式API。关于add_lossadd_metric方法,放在自定义损失中进行讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习初学者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度推荐模型——DCN [KDD 17][Google]
视频讲解:https://www.yuque.com/chudi/tzqav9/ny150b#aalY8
小爷毛毛_卓寿杰
2021/03/22
3540
深度推荐模型——DCN [KDD 17][Google]
TensorFlow 2.0快速上手指南12条:“Keras之父”亲授 | 高赞热贴
谷歌深度学习研究员、“Keras之父”François Chollet发表推特,总结了一份TensorFlow 2.0 + Keras做深度学习研究的速成指南。
量子位
2019/04/23
1.2K0
TensorFlow 2.0快速上手指南12条:“Keras之父”亲授 | 高赞热贴
干货 | TensorFlow 2.0 模型:Keras 训练流程及自定义组件
在上一篇文章中,我们介绍了循环神经网络的建立方式。本来接下来应该介绍 TensorFlow 中的深度强化学习的,奈何笔者有点咕,到现在还没写完,所以就让我们先来了解一下 Keras 内置的模型训练 API 和自定义组件的方法吧!本文介绍以下内容:
AI研习社
2019/10/22
3.3K0
深度推荐模型——AFM [IJCAI 17][浙大、新加坡国立大学]
视频讲解:https://www.yuque.com/chudi/tzqav9/ny150b#2XiWP
小爷毛毛_卓寿杰
2021/03/20
5660
TensorFlow快餐教程:程序员快速入门深度学习五步法
作者简介:刘子瑛,阿里巴巴操作系统框架专家;CSDN 博客专家。工作十余年,一直对数学与人工智能算法相关、新编程语言、新开发方法等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术进步。 作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。 我们可以用 5 步 + 4 种基本元素 + 9 种基本层结构,这 5-4-9 模型来总结。 5步法: 1. 构造网络模型 2. 编译模型 3. 训练模型 4. 评估模型 5. 使用模型进行预测 4种基本元素:
用户1737318
2018/07/20
5040
卷积自编码器中注意机制和使用线性模型进行超参数分析
新神经网络架构设计的最新进展之一是注意力模块的引入。首次出现在在NLP 上的注意力背后的主要思想是为数据的重要部分添加权重。在卷积神经网络的情况下,第一个注意机制是在卷积块注意模型中提出的。其中注意机制分为两个部分:通道注意模块和空间注意模块。
deephub
2022/03/12
3960
卷积自编码器中注意机制和使用线性模型进行超参数分析
图注意力网络(GAT) TensorFlow实现
图注意力网络来自 Graph Attention Networks,ICLR 2018.   https://arxiv.org/abs/1710.10903
里克贝斯
2021/05/21
1.3K0
图注意力网络(GAT) TensorFlow实现
【TensorFlow2.0】如何搭建网络模型?
我们知道在不考虑输入层的情况下,一个典型的卷积神经网络通常由若干个卷积层、激活层、池化层及全连接层组成,无论是最经典的LeNet5,还是前两天刚出现的MobileNet V3,无一不都包含这些层。今天就带大家学习下如何使用TensorFlow2.0搭建卷积神经网络模型。
用户1508658
2019/07/23
1.2K0
小白学PyTorch | 18 TF2构建自定义模型
之前讲过了如何用tensorflow构建数据集,然后这一节课讲解如何用Tensorflow2.0来创建模型。
机器学习炼丹术
2020/10/15
9260
keras系列︱Sequential与Model模型、keras基本结构功能(一)
中文文档:http://keras-cn.readthedocs.io/en/latest/ 官方文档:https://keras.io/ 文档主要是以keras2.0。
全栈程序员站长
2022/11/03
1.8K0
Tensorflow2.0常用基础API
tensorflow2.0改进之后已经非常像numpy形式了,不用像之前的session那样操作,一些基本的操作如下。需要注意的店以及部分数据均写在代码注释中。
Mirza Zhao
2023/06/26
8000
Python 深度学习第二版(GPT 重译)(三)
您现在对 Keras 有了一些经验——您熟悉 Sequential 模型、Dense 层以及用于训练、评估和推断的内置 API——compile()、fit()、evaluate() 和 predict()。您甚至在第三章中学习了如何从 Layer 类继承以创建自定义层,以及如何使用 TensorFlow 的 GradientTape 实现逐步训练循环。
ApacheCN_飞龙
2024/03/21
3640
Python 深度学习第二版(GPT 重译)(三)
【从零开始学Mask RCNN】三,Mask RCNN网络架构解析及TensorFlow和Keras的交互
上一节把握了一下Mask RCNN项目的整体逻辑,这一节主要从TensorFlow和Keras的交互以及Mask RCNN的网络结构入手来分析一下。
BBuf
2020/07/02
1.7K0
TensorFlow v2.x使用说明[2]-模型构建
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
锦小年
2019/10/22
4890
TensorFlow v2.x使用说明[2]-模型构建
TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric
文章目录 1. Keras Sequential / Functional API 2. 自定义 layer 3. 自定义 loss 4. 自定义 评估方法 学习于:简单粗暴 TensorFlow 2 1. Keras Sequential / Functional API tf.keras.models.Sequential([layers...]),但是它不能表示更复杂的模型 mymodel = tf.keras.models.Sequential([ tf.keras.layers.Flat
Michael阿明
2021/02/19
1K0
keras系列︱Sequential与Model模型、keras基本结构功能(一)
该文章介绍了在深度学习模型中,不同的层对输入进行计算,从而影响模型的性能。文章详细讨论了卷积层、池化层、全连接层和LSTM层的特点和作用,以及如何使用这些层来构建高性能的模型。此外,文章还探讨了如何通过冻结层和重新训练层来提高模型的性能。
悟乙己
2018/01/02
10.3K0
keras系列︱Sequential与Model模型、keras基本结构功能(一)
TensorFlow2.X学习笔记(6)--TensorFlow中阶API之特征列、激活函数、模型层
特征列通常用于对结构化数据实施特征工程时候使用,图像或者文本数据一般不会用到特征列。使用特征列可以将类别特征转换为one-hot编码特征,将连续特征构建分桶特征,以及对多个特征生成交叉特征等等。
MiChong
2020/09/24
2.2K0
TensorFlow2.X学习笔记(6)--TensorFlow中阶API之特征列、激活函数、模型层
深度推荐算法——DeepFM [IJCAI 17][Huawei]
视频讲解:https://www.yuque.com/chudi/tzqav9/ny150b#aalY8
小爷毛毛_卓寿杰
2021/03/20
5220
TensorFlow快餐教程:程序员快速入门深度学习五步法
作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。
AI科技大本营
2018/07/23
4230
TensorFlow快餐教程:程序员快速入门深度学习五步法
深度学习(六)keras常用函数学习 2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA失败 导入ten
原文链接:https://www.cnblogs.com/DOMLX/p/9769301.html
徐飞机
2018/10/11
2.2K0
推荐阅读
相关推荐
深度推荐模型——DCN [KDD 17][Google]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档