Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干货 | TensorFlow 2.0 模型:Keras 训练流程及自定义组件

干货 | TensorFlow 2.0 模型:Keras 训练流程及自定义组件

作者头像
AI研习社
发布于 2019-10-22 12:06:26
发布于 2019-10-22 12:06:26
3.3K00
代码可运行
举报
文章被收录于专栏:AI研习社AI研习社
运行总次数:0
代码可运行

文 / 李锡涵,Google Developers Expert

本文节选自《简单粗暴 TensorFlow 2.0》

在上一篇文章中,我们介绍了循环神经网络的建立方式。本来接下来应该介绍 TensorFlow 中的深度强化学习的,奈何笔者有点咕,到现在还没写完,所以就让我们先来了解一下 Keras 内置的模型训练 API 和自定义组件的方法吧!本文介绍以下内容:

  • 使用 Keras 内置的 API 快速建立和训练模型,几行代码创建和训练一个模型不是梦;
  • 自定义 Keras 中的层、损失函数和评估指标,创建更加个性化的模型。

Keras Pipeline *

在之前的文章中,我们均使用了 Keras 的 Subclassing API 建立模型,即对 tf.keras.Model 类进行扩展以定义自己的新模型,同时手工编写了训练和评估模型的流程。

这种方式灵活度高,且与其他流行的深度学习框架(如 PyTorch、Chainer)共通,是本手册所推荐的方法。不过在很多时候,我们只需要建立一个结构相对简单和典型的神经网络(比如上文中的 MLP 和 CNN),并使用常规的手段进行训练。这时,Keras 也给我们提供了另一套更为简单高效的内置方法来建立、训练和评估模型。

Keras Sequential/Functional API 模式建立模型

最典型和常用的神经网络结构是将一堆层按特定顺序叠加起来,那么,我们是不是只需要提供一个层的列表,就能由 Keras 将它们自动首尾相连,形成模型呢?Keras 的 Sequential API 正是如此。通过向 tf.keras.models.Sequential() 提供一个层的列表,就能快速地建立一个 tf.keras.Model 模型并返回:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1      model = tf.keras.models.Sequential([
2            tf.keras.layers.Flatten(),
3            tf.keras.layers.Dense(100, activation=tf.nn.relu),
4            tf.keras.layers.Dense(10),
5            tf.keras.layers.Softmax()
6        ])

不过,这种层叠结构并不能表示任意的神经网络结构。为此,Keras 提供了 Functional API,帮助我们建立更为复杂的模型,例如多输入 / 输出或存在参数共享的模型。其使用方法是将层作为可调用的对象并返回张量(这点与之前章节的使用方法一致),并将输入向量和输出向量提供给 tf.keras.Modelinputsoutputs 参数,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1       inputs = tf.keras.Input(shape=(28, 28, 1))
2        x = tf.keras.layers.Flatten()(inputs)
3        x = tf.keras.layers.Dense(units=100, activation=tf.nn.relu)(x)
4        x = tf.keras.layers.Dense(units=10)(x)
5        outputs = tf.keras.layers.Softmax()(x)
6        model = tf.keras.Model(inputs=inputs, outputs=outputs)

使用 Keras 的内置 API 训练和评估模型

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1   model.compile(
2        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
3        loss=tf.keras.losses.sparse_categorical_crossentropy,
4        metrics=[tf.keras.metrics.sparse_categorical_accuracy]
5    )

tf.keras.Model.compile 接受 3 个重要的参数:

  • oplimizer :优化器,可从 tf.keras.optimizers 中选择;
  • loss :损失函数,可从 tf.keras.losses 中选择;
  • metrics :评估指标,可从 tf.keras.metrics 中选择。

接下来,可以使用 tf.keras.Modelfit 方法训练模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1   model.fit(data_loader.train_data, data_loader.train_label, epochs=num_epochs, batch_size=batch_size)

tf.keras.Model.fit 接受 5 个重要的参数:

  • x :训练数据;
  • y :目标数据(数据标签);
  • epochs :将训练数据迭代多少遍;
  • batch_size :批次的大小;
  • validation_data :验证数据,可用于在训练过程中监控模型的性能。

Keras 支持使用 tf.data.Dataset 进行训练,详见 tf.data

注:tf.data 链接

https://tf.wiki/zh/basic/tools.html#tfdata

最后,使用 tf.keras.Model.evaluate 评估训练效果,提供测试数据及标签即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1   print(model.evaluate(data_loader.test_data, data_loader.test_label))

自定义层、损失函数和评估指标 *

可能你还会问,如果现有的这些层无法满足我的要求,我需要定义自己的层怎么办?事实上,我们不仅可以如 前文的介绍 一样继承 tf.keras.Model 编写自己的模型类,也可以继承 tf.keras.layers.Layer 编写自己的层。

自定义层

自定义层需要继承 tf.keras.layers.Layer 类,并重写 __init__buildcall 三个方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1class MyLayer(tf.keras.layers.Layer):
 2    def __init__(self):
 3        super().__init__()
 4        # 初始化代码
 5
 6    def build(self, input_shape):     # input_shape 是一个 TensorShape 类型对象,提供输入的形状
 7        # 在第一次使用该层的时候调用该部分代码,在这里创建变量可以使得变量的形状自适应输入的形状
 8        # 而不需要使用者额外指定变量形状。
 9        # 如果已经可以完全确定变量的形状,也可以在__init__部分创建变量
10        self.variable_0 = self.add_weight(...)
11        self.variable_1 = self.add_weight(...)
12
13    def call(self, inputs):
14        # 模型调用的代码(处理输入并返回输出)
15        return output

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1class LinearLayer(tf.keras.layers.Layer):
 2    def __init__(self, units):
 3        super().__init__()
 4        self.units = units
 5
 6    def build(self, input_shape):     # 这里 input_shape 是第一次运行call()时参数inputs的形状
 7        self.w = self.add_variable(name='w',
 8            shape=[input_shape[-1], self.units], initializer=tf.zeros_initializer())
 9        self.b = self.add_variable(name='b',
10            shape=[self.units], initializer=tf.zeros_initializer())
11
12    def call(self, inputs):
13        y_pred = tf.matmul(inputs, self.w) + self.b
14        return y_pred

在定义模型的时候,我们便可以如同 Keras 中的其他层一样,调用我们自定义的层 LinearLayer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1class LinearModel(tf.keras.Model):
2    def __init__(self):
3        super().__init__()
4        self.layer = LinearLayer(units=1)
5
6    def call(self, inputs):
7        output = self.layer(inputs)
8        return output

自定义损失函数和评估指标

自定义损失函数需要继承 tf.keras.losses.Loss 类,重写 call 方法即可,输入真实值 y_true 和模型预测值 y_pred ,输出模型预测值和真实值之间通过自定义的损失函数计算出的损失值。下面的示例为均方差损失函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1class MeanSquaredError(tf.keras.losses.Loss):
2    def call(self, y_true, y_pred):
3        return tf.reduce_mean(tf.square(y_pred - y_true))

自定义评估指标需要继承 tf.keras.metrics.Metric 类,并重写 __init__update_stateresult 三个方法。下面的示例对前面用到的 SparseCategoricalAccuracy 评估指标类做了一个简单的重实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1class SparseCategoricalAccuracy(tf.keras.metrics.Metric):
 2    def __init__(self):
 3        super().__init__()
 4        self.total = self.add_weight(name='total', dtype=tf.int32, initializer=tf.zeros_initializer())
 5        self.count = self.add_weight(name='count', dtype=tf.int32, initializer=tf.zeros_initializer())
 6
 7    def update_state(self, y_true, y_pred, sample_weight=None):
 8        values = tf.cast(tf.equal(y_true, tf.argmax(y_pred, axis=-1, output_type=tf.int32)), tf.int32)
 9        self.total.assign_add(tf.shape(y_true)[0])
10        self.count.assign_add(tf.reduce_sum(values))
11
12    def result(self):
13        return self.count / self.total

福利 | 问答环节

我们知道在入门一项新的技术时有许多挑战与困难需要克服。如果您有关于 TensorFlow 的相关问题,可在本文后留言,我们的工程师和 GDE 将挑选其中具有代表性的问题在下一期进行回答~

在上一篇文章《TensorFlow 2.0 模型:循环神经网络》中,我们对于部分具有代表性的问题回答如下:

Q1:mirrorstrategy 在 1.13.1 这个版本里几乎没有任何加速效果。是在 2.0 做了修复吗? A:建议使用 2.0 的新版本试试看。在我们的测试中效果是非常显著的,可以参考下面文章进行尝试。

  • https://tf.wiki/zh/appendix/distributed.html#mirroredstrategy

Q2:能不能支持一下 mac a 卡 gpu? A:目前,AMD 的显卡也开始对 TensorFlow 提供支持,可访问博客文章查看详情。

  • https://medium.com/tensorflow/amd-rocm-gpu-support-for-tensorflow-33c78cc6a6cf

Q3:可以展示一下使用 TF2.0 建立 LSTM 回归预测模型吗?

A:可以参考示例,该示例使用了 Keras 和 LSTM 在天气数据集上进行了时间序列预测。

  • https://tensorflow.google.cn/tutorials/structured_data/time_series

Q4:应该给个例子,dataset 怎么处理大数据集。现在数据集过小。还有 keras 怎么用 subclass 的方式。这种小 demo 没啥意义。还有导出模型,这个很难弄。这些应该多写。

A:我们会在后面的连载系列中介绍高效处理大数据集的 tf.data ,以及导出模型到 SavedModel,敬请期待!

Q5:我想用现成的网络但是又想更改结构怎么弄?比如我要用现成的inception解决回归问题而不是分类,需要修改输入层和输出层。

A:TensorFlow Hub 提供了不包含最顶端全连接层的预训练模型(Headless Model),您可以使用该类型的预训练模型并添加自己的输出层,具体请参考:

  • https://tensorflow.google.cn/tutorials/images/transfer_learning_with_hub

Q6.请问正式版支持avx2吗?

A:pip 版本为了更好的通用性,默认是不支持 avx2,但是可以自己编译。

Q7.tf 团队可以支持下微软的 python-language-server 团队吗,动态导入的包特性导致 vs code 的用户无法自动补全,tf2.0 让我可望不可即

A:请参考 https://github.com/microsoft/python-language-server/issues/818。

《简单粗暴 TensorFlow 2.0 》目录

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

本文分享自 AI研习社 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TensorFlow 2.0 - CNN / 预训练 / RNN
文章目录 1. CNN 卷积神经网络 2. 预训练模型 3. RNN 循环神经网络 学习于:简单粗暴 TensorFlow 2 1. CNN 卷积神经网络 卷积神经网络,卷积后尺寸计算 tf.keras.layers.Conv2D, tf.keras.layers.MaxPool2D # CNN 模型 class myCNN(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf
Michael阿明
2021/02/19
5250
tensorflow自定义网络结构
自定义层需要继承tf.keras.layers.Layer类,重写init,build,call
Dean0731
2020/05/11
1.1K0
TensorFlow 2.0 - 自定义模型、训练过程
文章目录 1. 自定义模型 2. 学习流程 学习于:简单粗暴 TensorFlow 2 1. 自定义模型 重载 call() 方法,pytorch 是重载 forward() 方法 import tensorflow as tf X = tf.constant([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0]]) y = tf.constant([[10.0],[20.0]]) class Linear(tf.keras.Model): def __init__(self):
Michael阿明
2021/02/19
9690
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
【TensorFlow2.0】以后我们再也离不开Keras了?
在TensorFlow2.0中,Keras是一个用于构建和训练深度学习模型的高阶 API。因此如果你正在使用TensorFow2.0,那么使用Keras构建深度学习模型是您的不二选择。在Keras API中总共有如下三大块:
用户1508658
2019/07/28
1.2K0
数值稳定性:Fixing NaN Gradients during Backpropagation in TensorFlow
大家好,我是默语,擅长全栈开发、运维和人工智能技术。在机器学习和深度学习的训练过程中,数值稳定性是一个非常重要的问题。特别是在使用TensorFlow进行模型训练时,我们常常会遇到梯度为NaN的情况,这会导致训练过程无法正常进行。本文将详细介绍如何在TensorFlow中解决反向传播过程中NaN梯度的问题,提供一些有效的方法来避免和解决这些问题。
默 语
2024/11/22
1440
小白学PyTorch | 18 TF2构建自定义模型
之前讲过了如何用tensorflow构建数据集,然后这一节课讲解如何用Tensorflow2.0来创建模型。
机器学习炼丹术
2020/10/15
9260
TensorFlow 2.0快速上手指南12条:“Keras之父”亲授 | 高赞热贴
谷歌深度学习研究员、“Keras之父”François Chollet发表推特,总结了一份TensorFlow 2.0 + Keras做深度学习研究的速成指南。
量子位
2019/04/23
1.2K0
TensorFlow 2.0快速上手指南12条:“Keras之父”亲授 | 高赞热贴
Tensorflow2.0常用基础API
tensorflow2.0改进之后已经非常像numpy形式了,不用像之前的session那样操作,一些基本的操作如下。需要注意的店以及部分数据均写在代码注释中。
Mirza Zhao
2023/06/26
8010
使用TensorFlow2预测国内疫情结束时间
国内的新冠肺炎疫情从发现至今已经持续3个多月了,这场起源于吃野味的灾难给大家的生活造成了诸多方面的影响。
lyhue1991
2020/07/20
8430
使用TensorFlow2预测国内疫情结束时间
【深度学习】Tensorflow2.x入门(一)建立模型的三种模式
最近做实验比较焦虑,因此准备结合推荐算法梳理下Tensorflow2.x的知识。介绍Tensorflow2.x的文章有很多,但本文(系列)是按照作者构建模型的思路来展开的,因此不会从Eager Execution开始。另外,尽量摆脱小白文,加入自己的理解。 本文约2.7k字,预计阅读10分钟。
黄博的机器学习圈子
2020/12/11
1.8K0
四个用于Keras的很棒的操作(含代码)
Keras是最广泛使用的深度学习框架之一。它在易于使用的同时,在性能方面也与TensorFlow,Caffe和MXNet等更复杂的库相当。除非你的应用程序需要一些非常低级别和复杂的代码,否则Keras会为你提供最好的帮助!
AiTechYun
2018/12/13
3.2K0
四个用于Keras的很棒的操作(含代码)
Tensorflow 2.0 的这些新设计,你适应好了吗?
如果说两代 Tensorflow 有什么根本不同,那应该就是 Tensorflow 2.0 更注重使用的低门槛,旨在让每个人都能应用机器学习技术。考虑到它可能会成为机器学习框架的又一个重要里程碑,本文会介绍 1.x 和 2.x 版本之间的所有(已知)差异,重点关注它们之间的思维模式变化和利弊关系。
崔庆才
2019/09/04
9840
Tensorflow 2.0 的这些新设计,你适应好了吗?
机器翻译的Attention机制
在机器翻译(Neural Machine Translation)中,Seq2Seq模型将源序列映射到目标序列,其中Encoder部分将源序列编码为Context Vector传递给Decoder,Decoder将Context Vector解码为目标语言的序列。
YoungTimes
2022/04/28
1.4K0
机器翻译的Attention机制
【tensorflow2.0】处理时间序列数据
国内的新冠肺炎疫情从发现至今已经持续3个多月了,这场起源于吃野味的灾难给大家的生活造成了诸多方面的影响。
西西嘛呦
2020/08/26
9240
【tensorflow2.0】处理时间序列数据
使用Keras构建具有自定义结构和层次图卷积神经网络(GCNN)
如何构建具有自定义结构和层次的神经网络:Keras中的图卷积神经网络(GCNN) 在生活中的某个时刻我们会发现,在Tensorflow Keras中预先定义的层已经不够了!我们想要更多的层!我们想要建
deephub
2020/07/29
2.1K0
使用Keras构建具有自定义结构和层次图卷积神经网络(GCNN)
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第12章 使用TensorFlow自定义模型并训练
目前为止,我们只是使用了TensorFlow的高级API —— tf.keras,它的功能很强大:搭建了各种神经网络架构,包括回归、分类网络、Wide & Deep 网络、自归一化网络,使用了各种方法,包括批归一化、dropout和学习率调度。事实上,你在实际案例中95%碰到的情况只需要tf.keras就足够了(和tf.data,见第13章)。现在来深入学习TensorFlow的低级Python API。当你需要实现自定义损失函数、自定义标准、层、模型、初始化器、正则器、权重约束时,就需要低级API了。甚至有时需要全面控制训练过程,例如使用特殊变换或对约束梯度时。这一章就会讨论这些问题,还会学习如何使用TensorFlow的自动图生成特征提升自定义模型和训练算法。首先,先来快速学习下TensorFlow。
SeanCheney
2019/12/13
5.4K0
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第12章 使用TensorFlow自定义模型并训练
TensorFlow之CNN
CNN 就是convolutional neural network, 也就是卷积神经网络,是一种类似于人类或动物视觉系统结构的人工神经网络,包含一个或多个卷积层(convolutional layer)、池化层(pooling layer)和全连接层(fully-connected layer),总之,这些年他很火。
Ed_Frey
2020/12/30
3970
英文教程太难啃?这里有一份TensorFlow2.0中文教程(持续更新中)
虽然,自 TensorFlow 2.0 发布以来,我们总是能够听到「TensorFlow 2.0 就是 keras」、「说的很好,但我用 PyTorch」类似的吐槽。但毋庸置疑,TensorFlow 依然是当前最主流的深度学习框架(感兴趣的读者可查看机器之心文章:2019 年,TensorFlow 被拉下马了吗?)。
机器之心
2019/05/14
1.1K0
英文教程太难啃?这里有一份TensorFlow2.0中文教程(持续更新中)
在TensorFlow 2.0中实现自动编码器
Google宣布对全球最受欢迎的开源机器学习库TensorFlow进行重大升级,承诺注重简单性和易用性,eager execution,直观的高级API以及在任何平台上灵活构建模型。
代码医生工作室
2019/06/21
3.3K2
在TensorFlow 2.0中实现自动编码器
推荐阅读
相关推荐
TensorFlow 2.0 - CNN / 预训练 / RNN
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验