TensorFlow2.0教程-使用tf.function和AutoGraph提高代码性能

本文是TensorFlow2.0教程的一部分,重点介绍如何使用tf.function和AutoGraph提高代码性能。tf.function可以构建图以实现更好的性能和可部署性,而AutoGraph则能将Python代码转换为等效的张量操作。文章讨论了跟踪和多态性、何时回溯、Python参数与Tensor参数的使用、副作用以及如何处理Python状态等问题。此外,还介绍了如何在tf.function中安全地使用控制流和变量。
摘要由CSDN通过智能技术生成

TensorFlow2.0教程-使用tf.function和AutoGraph提高代码性能

原文地址:https://doit-space.blog.csdn.net/article/details/95041177

最全Tensorflow 2.0 入门教程持续更新:https://blog.csdn.net/qq_31456593/article/details/88606284

完整tensorflow2.0教程代码请看 https://github.com/czy36mengfei/tensorflow2_tutorials_chinese (欢迎star)

本教程主要由tensorflow2.0官方教程的个人学习复现笔记整理而来,中文讲解,方便喜欢阅读中文教程的朋友,官方教程:https://www.tensorflow.org

在TensorFlow 2.0中,默认情况下启用了急切执行。 对于用户而言直观且灵活(运行一次性操作更容易,更快),但这可能会牺牲性能和可部署性。

要获得最佳性能并使模型可在任何地方部署,可以优先使用tf.function从程序中构建图。 因为有AutoGraph,可以使用tf.function构建高效性能的Python代码,但仍有一些陷阱需要警惕。

今天我们就来介绍一下tensorflow2.0中的TF fuction和AutoGraph。

下面的辅助程序代码,用于演示可能遇到的各种错误。

import contextlib

# 构建包含上下文管理器的函数,使其可以在with中使用
@contextlib.contextmanager
def assert_raises(error_class):
    try:
        yield
    except error_class as e:
        print('Caught expected exception \n  {}: {}'.format(error_class, e))
    except Exception as e:
        print('Got unexpected exception \n  {}: {}'.format(type(e), e))
    else:
        raise Exception('Expected {} to be raised but no error was raised!'.format(
            error_class))

tf.function

一个tf.function定义就像是一个核心TensorFlow操作:可以急切地执行它; 也可以在静态图中使用它; 且它具有梯度。

# 类似一个tensorflow操作
@tf.function
def add(a, b):
    return a+b

add(tf.ones([2,2]), tf.ones([2,2]))
<tf.Tensor: id=14, shape=(2, 2), dtype=float32, numpy=
array([[2., 2.],
       [2., 2.]], dtype=float32)>
# tf.function操作可以计算梯度
@tf.function
def add(a, b):
    return a+b
v = tf.Variable(2.0)
with tf.GradientTape() as tape:
    res = add(v, 1.0)

tape.gradient(res, v) 
<tf.Tensor: id=40, shape=(), dtype=float32, numpy=1.0>
# 可以内嵌调用tf.function
@tf.function
def dense_layer(x, w, b):
    return add(tf.matmul(x, w), b)

dense_layer(tf.ones([3, 2]), tf.ones([2, 2]), tf.ones([2]))

<tf.Tensor: id=67, shape=(3, 2), dtype=float32, numpy=
array([[3., 3.],
       [3., 3.],
       [3., 3.]], dtype=float32)>

跟踪和多态

Python的动态类型意味着可以使用各种参数类型调用函数,Python将在每个场景中执行不同的操作。

另一方面,TensorFlow图需要静态dtypes和形状尺寸。tf.function通过在必要时回溯函数来生成正确的图结构来弥补这一差距。大多数使用的tf.function源于这种回归行为。

我们可以使用不同类型的参数调用函数来查看正在发生的事情。

# 函数的多态
@tf.function
def double(a):
    print('追踪变量:',a)
    return a + a

print('结果:',double(tf.constant(1)))
print()
print('结果:',double(tf.constant(1.1)))
print()
print('结果:',double(tf.constant('c')))
print()
追踪变量: Tensor("a:0", shape=(), dtype=int32)
结果: tf.Tensor(2, shape=(), dtype=int32)

追踪变量: Tensor("a:0", shape=(), dtype=float32)
结果: tf.Tensor(2.2, shape=(), dtype=float32)

追踪变量: Tensor("a:0", shape=(), dtype=string)
结果: tf.Tensor(b'cc', shape=(), dtype=string)

控制参数类型:
创建一个新的tf.function。tf.function确保单独的对象不共享追踪。
使用该get_concrete_function方法获取特定追踪
指定input_signature何时调用tf.function以确保仅构建一个功能图。

print('构建许可的追踪')
double_strings = double.get_concrete_function(tf.TensorSpec(shape=None, dtype=tf.string))
print("执行追踪函数")
print(double_strings(tf.constant("a")))
print(double_strings(a=tf.constant("b")))
print("使用不合法参数")
with assert_raises(tf.errors.InvalidArgumentError):
    double_strings(tf.constant(1))
构建许可的追踪
追踪变量: Tensor("a:0", dtype=string)
执行追踪函数
tf.Tensor(b'aa', shape=(), dtype=string)
tf.Tensor(b'bb', shape=(), dtype=string)
使用不合法参数
Caught expected exception 
  <class 'tensorflow.python.framework.errors_impl.InvalidArgumentError'>: cannot compute __inference_double_98 as input #0(zero-based) was expected to be a string tensor but is a int32 tensor [Op:__inference_double_98]
@tf.function(input_signature=(tf.TensorSpec(shape=[None], dtype=tf.int32),))
def next_collatz(x):
    print("Tracing with", x)
    return tf.where(tf.equal(x % 2, 0), x // 2, 3 * x + 1)

print(next_collatz(tf.constant([1, 2])))
# 只能输入1维向量
with assert_raises(ValueError):
    next_collatz(tf.constant([[1, 2], [3, 4]]))
Tracing with Tensor("x:0", shape=(None,), dtype=int32)
tf.Tensor([4 1], shape=(2,), dtype=int32)
Caught expected exception 
  <class 'ValueError'>: Python inputs incompatible with input_signature: inputs ((<tf.Tensor: id=125, shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
       [3, 4]], dtype=int32)>,)), input_signature ((TensorSpec(shape=(None,), dtype=tf.int32, name=None),))

什么时候回溯?

多态tf.function通过跟踪生成具体函数的缓存。缓存键实际上是从函数args和kwargs生成的键的元组。为tf.Tensor参数生成的关键是其形状和类型。为Python原语生成的密钥是它的值。对于所有其他Python类型,键都基于对象,id()以便为每个类的实例独立跟踪方法。将来,TensorFlow可以为Python对象添加更复杂的缓存,可以安全地转换为张量。

使用Python参数还是Tensor参数?

通常,Python的参数被用来控制超参数和图的结构-例如,num_layers=10或training=True或nonlinearity=‘relu’。因此,如果Python参数发生变化,那么必须回溯图。

但是,Python参数可能不会用于控制图构造。在这些情况下,Python值的变化可能会触发不必要的回溯。举例来说,这个训练循环,AutoGraph将动态展开。尽管存在多条迹线,但生成的图实际上是相同的,因此这有点低效。

def train_one_step():
    pass

@tf.function
def train(num_steps):
    print(&
### 回答1: Python的TensorFlow 2.0 Demo是一个展示和演示TensorFlow 2.0的示例程序。TensorFlow是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练各种人工智能模型。 TensorFlow 2.0 Demo可以帮助我们了解如何使用Python编写TensorFlow代码,构建和训练模型。在Demo中,我们可以看到一些预先定义好的模型,如卷积神经网络(CNN)和循环神经网络(RNN),以及一些常见的数据集,如MNIST手写数字数据集。 Demo中的代码可以帮助我们学习如何使用TensorFlow 2.0的新特性,如Eager Execution和tf.keras API。Eager Execution使得TensorFlow代码更加直观和易于调试,而tf.keras API提供了一种方便的方式来定义和训练神经网络模型。 另外,Demo还可以帮助我们了解TensorFlow 2.0的一些新功能,如动态图(Dynamic Graph)和AutoGraph。动态图允许我们动态地构建和修改计算图,而AutoGraph则可以将Python代码自动转化为高效的TensorFlow计算图。 通过运行TensorFlow 2.0 Demo,我们可以学习到如何使用Python和TensorFlow构建和训练机器学习模型,并熟悉TensorFlow 2.0的一些新特性和功能。这对于想要进一步了解和掌握深度学习和人工智能的人来说非常有帮助。 ### 回答2: Python TensorFlow 2.0 Demo 是一个用于展示 TensorFlow 2.0 版本的 Python 示例的演示程序。它旨在向用户展示如何使用 TensorFlow 2.0 进行机器学习和深度学习任务。 Python TensorFlow 2.0 Demo 演示了 TensorFlow 2.0 在数据处理、模型构建和训练等方面的功能。通过这个示例,用户可以了解 TensorFlow 2.0 的主要特点和用法。 在数据处理方面,Python TensorFlow 2.0 Demo 提供了许多常用的数据处理功能,例如加载数据集、数据集预处理、数据增强等。这些功能可以帮助用户准备数据用于模型的训练和评估。 在模型构建方面,Python TensorFlow 2.0 Demo 展示了如何使用 TensorFlow 2.0 构建各种类型的神经网络模型,包括卷积神经网络(CNN)、循环神经网络(RNN)和变分自编码器(VAE)等。用户可以学习如何定义模型的结构和参数,并将其编译为可训练的 TensorFlow 图。 在模型训练方面,Python TensorFlow 2.0 Demo 展示了如何使用 TensorFlow 2.0 进行模型的训练和评估。用户可以学习如何选择合适的优化器、损失函数和评估指标,并使用训练数据集对模型进行训练,并使用测试数据集对其进行评估。 总而言之,Python TensorFlow 2.0 Demo 可以帮助用户了解并学习如何使用 TensorFlow 2.0 进行机器学习和深度学习任务。通过这个演示程序,用户可以掌握 TensorFlow 2.0 的基本用法,并在实践中探索更多高级的功能和技巧。 ### 回答3: Python TensorFlow 2.0 是一个强大的深度学习框架,可以用于构建和训练各种机器学习模型。使用 Python TensorFlow 2.0,可以轻松地创建端到端的模型,处理大规模的数据集,以及进行模型的训练和推理。 在 TensorFlow 2.0 中,与之前版本相比,有一些重要的改进和新功能。其中最重要的是 Eager Execution(即动态图执行),它使得在 TensorFlow 中编写代码更加直观和简单,可以立即获得结果的反馈。另外,TensorFlow 2.0 还引入了一种新的高级 API——Keras,它提供了更简洁、易用的方式来定义和训练神经网络模型。 使用 TensorFlow 2.0 可以轻松地构建各种机器学习模型。例如,可以使用 TensorFlow 2.0 构建一个图像分类模型,对图像进行分类。首先,需要准备训练集和测试集的图像数据,然后使用 TensorFlow 2.0 的 Keras API 构建一个卷积神经网络模型。接下来,编写代码对模型进行训练,并使用测试集进行验证。通过迭代和调整模型的参数,可以获得更好的分类效果。 在实际使用 TensorFlow 2.0 进行机器学习任务时,通常还会使用一些其他的库和工具来辅助。例如,可以使用 NumPy 来处理和转换数据,使用 Matplotlib 来可视化结果,使用 Pandas 来进行数据处理和分析等等。同时,也可以利用 TensorFlow 的高级特性,如分布式训练和自定义损失函数等,来进一步提升模型的性能和效果。 总而言之,Python TensorFlow 2.0 是一个功能强大、易用的深度学习框架,可用于构建和训练各种机器学习模型。通过灵活的应用和结合其他工具和库,可以实现各式各样的机器学习任务,并获得良好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值