一文搞懂tf.function

TensorFlow本质是可编程计算图编译器,不是AI工具箱 TensorFlow本质上是一个面向高性能数值计算的图编译器与运行时调度系统,其核心在于将Python描述的计算逻辑静态编译为跨平台优化指令(如XLA融合内核),再由底层Runtime调度至CPU/GPU/TPU执行。这一‘图优先’设计源于GPU显存管理刚性需求,通过Placer算法实现张量生命周期规划与内存复用,显著降低显存碎片和同步开销。相比直译式框架,它在工业级训练吞吐、边缘部署确定性及SavedModel跨语言兼容性上具备不可替代的技术价值。尤其在需要稳定低延迟、高资源利用率与生产可追溯性的场景—— 阅读详情

文章1:一文搞懂tf.function

本文版权归属于我老师的床长人工智能教程网站,需要转载的朋友请保留此版权声明!

在tensorflow1.x的时候,代码默认的执行方式是graph execution(图执行),而从tensorflow2.0开始,改为了eager execution(饥饿执行)。正如翻译的意思一样,eager execution会立即执行每一步代码,非常的饥渴。而graph execution会将所有代码组合成一个graph(图)后再执行。这里打一个不太恰当的比喻来帮助大家理解:eager execution就像搞一夜情,认识后就立即“执行”,而graph execution就像婚恋,认识后先憋着,不会立即“执行”,要经过了长时间的“积累”后,再一次性“执行”。

在eager 模式下,代码的编写变得很自然很简单,而且因为代码会被立即执行,所以调试时也变得很方便。而graph 模式下,代码的执行效率要高一些;而且由于graph其实就是一个由操作指令和数据组成的一个数据结构,所以graph可以很方便地被导出并保存起来,甚至之后可以运行在其它非python的环境下(因为graph就是个数据结构,里面定义了一些操作指令和数据,所以任何地方只要能解释这些操作和数据,那么就能运行这个模型);也正因为graph是个数据结构,所以不同的运行环境可以按照自己的喜好来解释里面的操作和数据,这样一来,解释后生成的代码会更加符合当前运行的环境,这里一来代码的执行效率就更高了。

可能有些同学还无法理解上面所说的“graph是个数据结构…”。这里我打个比方来帮助大家理解。假设graph里面包含了两个数据x和y,另外还包含了一个操作指令“将x和y相加”。当C++的环境要运行这个graph时,“将x和y相加”这个操作就会被翻译成相应的C++代码,当Java环境下要运行这个graph时,就会被解释成相应的Java代码。graph里面只是一些数据和指令,具体怎么执行命令,要看当前运行的环境。

除了上面所说的,graph还有很多内部机制使代码更加高效运行。总之,graph execution可以让tensorflow模型运行得更快,效率更高,更加并行化,更好地适配不同的运行环境和运行设备。

graph 虽然运行很高效,但是代码却没有eager 的简洁,为了兼顾两种模式的优点,所以出现了tf.function。使用tf.function可以将eager 代码一键封装成graph。

既然是封装成graph,那为什么名字里使用function这个单词内,不应该是tf.graph吗?因为tf.function的作用就是将python function转化成包含了graph的tensorflow function。所以使用function这个单词也说得通。下面的代码可以帮助大家更好地理解。


import tensorflow as tf
import timeit
from datetime import datetime


# 定义一个 Python function.
def a_regular_function(x, y, b):
 x = tf.matmul(x, y)
 x = x + b
 return x

# `a_function_that_uses_a_graph` 是一个 TensorFlow `Function`.
a_function_that_uses_a_graph = tf.function(a_regular_function)

# 定义一些tensorflow tensors.
x1 = tf.constant([[1.0, 2.0]])
y1 = tf.constant([[2.0], [3.0]])
b1 = tf.constant(4.0)

orig_value = a_regular_function(x1, y1, b1).numpy()

# 在python中可以直接调用tenforflow Function。就像使用python自己的function一样。
tf_function_value = a_function_that_uses_a_graph(x1, y1, b1).numpy()

assert(orig_value == tf_function_value)

tf.function不仅仅只作用于顶层的python function,它也作用于内嵌的python function。看下面的代码你就能明白了。

def inner_function(x, y, b):
 x = tf.matmul(x, y)
 x = x + b
 return x

# 使用tf.function将`outer_function`变成一个tensorflow `Function`。注意,之前的代码是将tf.function当作是函数来使用,这样是被当作了修饰符来使用。这两种方式都是被支持的。
@tf.function
def outer_function(x):
 y = tf.constant([[2.0], [3.0]])
 b = tf.constant(4.0)
 return inner_function(x, y, b)

# tf.function构建的graph中不仅仅包含了 `outer_function`还包含了它里面调用的`inner_function`。
outer_function(tf.constant([[1.0, 2.0]])).numpy()

输出结果:

array([[12.]], dtype=float32)

如果你之前使用过tenforflow 1.x,你会察觉到,在2.x中构建graph再也不需要tf.Session和Placeholder了。使代码大大地简洁了。

我们的代码里经常会将python代码和tensorflow代码混在一起。在使用tf.function进行graph转化时,tensorflow的代码会被直接进行转化,而python代码会被一个叫做AutoGraph (tf.autograph)的库来负责进行转化。

同一个tensorflow function可能会生成不同的graph。因为每一个tf.Graph的input输入类型必须是固定的,所以如果在调用tensorflow function时传入了新的数据类型,那么这次的调用就会生成一个新的graph。输入的类型以及维度被称为signature(签名),tensorflow function就是根据签名来生成graph的,遇到新的签名就会生成新的graph。下面的代码可以帮助你理解。

@tf.function
def my_relu(x):
 return tf.maximum(0., x)

# 下面对`my_relu` 的3次调用的数据类型都不同,所以生成了3个graph。这3个graph都被保存在my_relu这个tenforflow function中。
print(my_relu(tf.constant(5.5)))
print(my_relu([1, -1])) #python数组
print(my_relu(tf.constant([3., -3.]))) # tf数组

输出结果:

tf.Tensor(5.5, shape=(), dtype=float32)
tf.Tensor([1. 0.], shape=(2,), dtype=float32)
tf.Tensor([3. 0.], shape=(2,), dtype=float32)

如果相同的输入类型被调用了,那么不会再重新生成新的类型。

# 下面这两个调用就不会生成新的graph.
print(my_relu(tf.constant(-2.5))) # 这个数据类型与上面的 `tf.constant(5.5)`一样.
print(my_relu(tf.constant([-1., 1.]))) # 这个数据类型与上面的 `tf.constant([3., -3.])`一样。

因为一个tensorflow function里面可以包含多个graph,所以说tensorflow function是具备多态性的。这种多态性使得tensorflow function可以任意支持不同的输入类型,非常的灵活;并且由于对每一个输入类型会生成一个特定的graph,这也会让代码执行时更加高效!

下面的代码打印出了3种不同的签名

print(my_relu.pretty_printed_concrete_signatures())

输出结果:

my_relu(x)
 Args:
   x: float32 Tensor, shape=()
 Returns:
   float32 Tensor, shape=()

my_relu(x=[1, -1])
 Returns:
   float32 Tensor, shape=(2,)

my_relu(x)
 Args:
   x: float32 Tensor, shape=(2,)
 Returns:
   float32 Tensor, shape=(2,)

上面你已经学会了如何使用tf.function将python function转化为tenforflow function。但要想在实际开发中正确地使用tf.function,还需要学习更多知识。下面我就带领大家来学习学习它们。八十八师的弟兄们,不要退缩,跟着我一起冲啊啊啊!

默认情况下,tenforflow function里面的代码会以graph的模式被执行,但是也可以让它们以eager的模式来执行。大家看下面的代码。

@tf.function
def get_MSE():
 print("Calculating MSE!")


#这条语句就是让下面的代码以eager的模式来执行
tf.config.run_functions_eagerly(True)
get_MSE(y_true, y_pred)

#这条代码就是取消前面的设置
tf.config.run_functions_eagerly(False)

某些情况下,同一个tensorflow function在graph与eager模式下会有不同的运行效果。python的print函数就是其中一个特殊情况。看下面的代码。

@tf.function
def get_MSE(y_true, y_pred):
 print("Calculating MSE!")
 sq_diff = tf.pow(y_true - y_pred, 2)
 return tf.reduce_mean(sq_diff)

y_true = tf.random.uniform([5], maxval=10, dtype=tf.int32)
y_pred = tf.random.uniform([5], maxval=10, dtype=tf.int32)

error = get_MSE(y_true, y_pred)
error = get_MSE(y_true, y_pred)
error = get_MSE(y_true, y_pred)

输出结果:

Calculating MSE!

看到输出结果你是不是很惊讶?get_MSE被调用了3次,但是里面的python print函数只被执行了一次。这是为什么呢?因为python print函数只在创建graph时被执行,而上面的3次调用中输入参数的类型都是一样的,所以只有一个graph被创建了一次,所以python print函数也只会被调用一次。

为了将graph和eager进行对比,下面我们在eager模式下看看输出结果。

# 开启强制eager模式
tf.config.run_functions_eagerly(True)

error = get_MSE(y_true, y_pred)
error = get_MSE(y_true, y_pred)
error = get_MSE(y_true, y_pred)

# 取消eager模式
tf.config.run_functions_eagerly(False)

输出结果:

Calculating MSE!
Calculating MSE!
Calculating MSE!

看!在eager模式下,print被执行了3次。PS:如果使用tf.print,那么在graph和eager模式下都会打印3次。

graph execution模式还有一个特点,就是它会不执行那些无用的代码。看下面的代码。

def unused_return_eager(x):
	 # 当传入的x只包含一个元素时,下面的代码会报错,因为下面的代码是要获取x的第二个元素。PS:索引是从0开始的,1代表第二个元素
	 tf.gather(x, [1]) # unused
	 return x

try:
	 print(unused_return_eager(tf.constant([0.0])))
except tf.errors.InvalidArgumentError as e:
	 print(f'{type(e).__name__}: {e}')

上面的代码是以eager的模式运行,所以每一行代码都会被执行,所以上面的异常会发生并且会被捕获到。而下面的代码是以graph模式运行的,则不会报异常。因为tf.gather(x, [1])这句代码其实没有任何用途(它只是获取了x的第二个元素,并没有赋值也没有改变任何变量),所以graph模式下它根本就没有被执行,所以也就不会报任何异常了。

@tf.function
def unused_return_graph(x):
 tf.gather(x, [1])
 return x

try:
 print(unused_return_eager(tf.constant([0.0])))
except tf.errors.InvalidArgumentError as e:
 print(f'{type(e).__name__}: {e}')

前面我们说graph的执行效率会比eager的要高,那到底高多少呢?其实我们可以用下面的代码来计算graph模式到底能比eager模式提升多少效率。

x = tf.random.uniform(shape=[10, 10], minval=-1, maxval=2, dtype=tf.dtypes.int32)

def power(x, y):
 result = tf.eye(10, dtype=tf.dtypes.int32)
 for _ in range(y):
   result = tf.matmul(x, result)
 return result

print("Eager execution:", timeit.timeit(lambda: power(x, 100), number=1000))

输出结果:

Eager execution: 1.8983725069999764
power_as_graph = tf.function(power)
print("Graph execution:", timeit.timeit(lambda: power_as_graph(x, 100), number=1000))

输出结果:

Graph execution: 0.5891194120000023

从上面的代码可以看出graph比eager的执行时间缩短了近3倍。当然,因具体计算内容不同,效率的提升程度也是不同的。

graph虽然能提升运行效率,但是转化graph时也会有代价。对于某些代码,转化graph所需的时间可能比运行graph的还要长。所以在编写代码时要尽量避免graph的重复转化。如果你发现模型的效率很低,那么可以查查是否存在重复转化。可以通过加入print函数来判断是否存在重复转化(还记得前面我们讲过,每次转化graph时就会调用一次print函数)。看下面的代码。

@tf.function
def a_function_with_python_side_effect(x):
 print("Tracing!") # An eager-only side effect.
 return x * x + tf.constant(2)

print(a_function_with_python_side_effect(tf.constant(2)))
print(a_function_with_python_side_effect(tf.constant(3)))

输出结果:

Tracing!
tf.Tensor(6, shape=(), dtype=int32)
tf.Tensor(11, shape=(), dtype=int32)

可以看出,因为上面两次调用的参数类型是一样的,所以只转化了一次graph,print只被调用了一次。

print(a_function_with_python_side_effect(2))
print(a_function_with_python_side_effect(3))

输出结果:

Tracing!
tf.Tensor(6, shape=(), dtype=int32)
Tracing!
tf.Tensor(11, shape=(), dtype=int32)

上面print被调用了2次。啊?为什么?你可以会表示不解~~上面两个参数的类型是一样的啊,为什么还调用了两次print。因为,输入参数是python类型,对于新的python类型每次都会创建一个新的graph。所以最好是用tenforflow的数据类型作为function的输入参数。

最后我给出tf.function相关的几点建议:

  • 当需要切换eager和graph模式时,应该使用tf.config.run_functions_eagerly来进行明显的标注。
  • 应该在python function的外面创建tenforflow的变量(tf.Variables),在里面修改它们的值。这条建议同样适用于其它那些使用tf.Variables的tenforflow对象(例如keras.layers,keras.Models,tf.optimizers)。
  • 避免函数内部依赖外部定义的python变量。
  • 应该尽量将更多的计算量代码包含在一个tf.function中而不是包含在多个tf.function里,这样可以将代码执行效率最大化。
  • 最好是用tenforflow的数据类型作为function的输入参数。

文章2:Tensorflow 2.0上手6: 解剖tf.function的使用

关于Tensorflow 2.0,最令我觉得有意思的功能就是tf.function和AutoGraph了.他们可以把Python风格的代码转为效率更好的Tensorflow计算图.为了更好的了解这两个功能,我在这里分享一下Paolo Galeone对tf.function和AutoGraph介绍的系列文章.

Session execution

了解Tensorflow 1.x的读者都知道Tensorflow一般的工作流程.创建一个计算图tf.graph,然后通过tf.Session对计算图进行计算.以下是一段简单的代码:

g = tf.Graph()
with g.as_default():
    a = tf.constant([[10,10],[11.,1.]])
    x = tf.constant([[1.,0.],[0.,1.]])
    b = tf.Variable(12.)
    y = tf.matmul(a, x) + b
    init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(y))

用Tensorflow 2.0默认的Eager execution实现则很不一样,用户不再需要直接定义计算图或者通过tf.Session来执行代码,也不需要调用tf.global_variables_initializer去初始化变量或者通过tf.control_dependencies去执行计算图中没有包含的节点.

Tensorflow变得像普通的Python代码一样简单.

a = tf.constant([[10,10],[11.,1.]])
x = tf.constant([[1.,0.],[0.,1.]])
b = tf.Variable(12.)
y = tf.matmul(a, x) + b
print(y.numpy())

这样的代码非常易读,但是也带来了执行效率低的问题,因为代码需要依赖Python的解释器来进行计算,无法对数据流以及计算图进行优化.

为了在代码可读性和代码速度之间保持平衡,Tensorflow 2.0引入了tf.function这一概念.
tf.function, not tf.Session
Tensorflow 2.0中一个主要的改变就是移除tf.Session这一概念.这样可以帮助用户更好的组织代码,不用将tf.Session作为一个变量在Python函数中传来传去,我们可以用一个Python装饰符来进行加速,那就是@tf.function.

需要注意的是不是所有的函数都可以通过tf.function进行加速的.有的任务并不值得将函数转化为计算图形式,比如简单的矩阵乘法.然而,对于大量的计算,如对深度神经网络的优化,这一图转换能给性能带来巨大的提升.我们也把这样的图转化叫作tf.AutoGraph.在Tensorflow 2.0中,我们会自动的对被@tf.function装饰的函数进行AutoGraph优化.

懒人介绍tf.function

我们来粗浅的看一下被tf.function装饰的函数第一次执行时都做了什么:

  • 函数被执行并且被跟踪(tracing).Eager execution处于关闭状态,所有的Tensorflow函数被当做tf.Operation进行图的创建.
  • AutoGraph被唤醒,去检测Python代码可以转为Tensorflow的逻辑,比如while > tf.while, for > tf.while, if > tf.cond, assert > tf.assert.
  • 通过以上两步,我们对函数进行建图,为了保证Python代码中每一行的执行顺序,tf.control_dependencies被自动加入到代码中.保证第i行执行完后我们会执行第i+1行.
  • 返回tf.Graph,根据函数名和输入参数,我们将这个graph存到一个cache中.
  • 对于任何一个该函数的调用,我们会重复利用cache中的计算图进行计算.

我们来看一下Tensorflow 2.0中Eager Execution的代码如何转为tf.function的代码.首先来看一段简单的Tensorflow 2.0代码:

def f():
    a = tf.constant([[10,10],[11.,1.]])
    x = tf.constant([[1.,0.],[0.,1.]])
    b = tf.Variable(12.)
    y = tf.matmul(a, x) + b
    return y
print(f().numpy())
#执行结果
[[22. 22.]
 [23. 13.]]

因为Tensorflow 2.0默认是Eager execution,代码的阅读和执行就和普通的Python代码一样,简单易读.

From eager to tf.function

首先我们简单的加上@tf.function装饰一下,为了方便调试,我们加入一个print和一个tf.print.

@tf.function
def f():
    a = tf.constant([[10,10],[11.,1.]])
    x = tf.constant([[1.,0.],[0.,1.]])
    b = tf.Variable(12.)
    y = tf.matmul(a, x) + b
    print("PRINT: ", y)
    tf.print("TF-PRINT: ", y)
    return y
f()
#执行结果
PRINT:  Tensor("add:0", shape=(2, 2), dtype=float32)
ValueError: tf.function-decorated function tried to create variables on non-first call.

咦,为什么代码报错了?

我以为我发现了一个Bug,因为我理想的执行方式是第一次执行后进行构图并且调用这个图进行计算,之后每次都重复调用这个计算图,然而我们却收到了异常.

但实际上程序的执行过程和我们期待的是一样的,因为tf.function可能会对一段Python函数进行多次执行来构图,在多次执行的过程中,同样的Variable被创建了多次,产生错误.

这其实也是一个很容易混乱的概念,在eager mode下一个Variable是一个Python object,所以会在执行范围外被销毁.但是在tf.function的装饰下,Variable变成了tf.Variable,是在Graph中持续存在的.

把一个在eager mode下正常执行的函数转换到Tensorflow图形式,需要一边思考着计算图一边构建程序.

所以我们在使用tf.function有几种操作需要做:

  1. 设计函数f时需要一些输入参数,这个输入参数可以是tf.Variable或者其他任何类型.
  2. 设计一个函数从parent scope继承Python variable,在函数中检查Variable是否已经定义过(if b != None).
  3. 将所有的内容写到一个class里,就好像Keras layer一样,所有的Variable都是class的内部参数(self._b),将class的__call__()通过tf.function装饰.

我们来分析一下上面这些写法.

方案2 vs 方案3

上面的第2种方案和第3种方案类似,但是从面向对象的角度来看,方案3会更美一些.

我们先来看一下方案2的丑陋写法(很不推荐):

b = None
@tf.function
def f():
    a = tf.constant([[10, 10], [11., 1.]])
    x = tf.constant([[1., 0.], [0., 1.]])
    global b
    if b is None:
        b = tf.Variable(12.)
    y = tf.matmul(a, x) + b
    print("PRINT: ", y)
    tf.print("TF-PRINT: ", y)
    return y
f()

方案3的写法:

class F():
    def __init__(self):
        self._b = None
    @tf.function
    def __call__(self):
        a = tf.constant([[10, 10], [11., 1.]])
        x = tf.constant([[1., 0.], [0., 1.]])
        if self._b is None:
            self._b = tf.Variable(12.)
        y = tf.matmul(a, x) + self._b
        print("PRINT: ", y)
        tf.print("TF-PRINT: ", y)
        return y
f = F()
f()

函数逻辑与主过程的分割相对清晰,没有全局变量,class F可以被实例化然后调用,而不用担心我们生成一个全局变量b,让其他函数也能看到.

运用上述两种代码,我们已经解决了对于函数创造自己的Variable的问题.在实际运行过程中,tf.function生成的函数将和eager execution返回相同的结果.

方案1举例

现在来看一下上面讲到的方案1,将变量传递到函数中去.

@tf.function
def f(b):
    a = tf.constant([[10,10],[11.,1.]])
    x = tf.constant([[1.,0.],[0.,1.]])
    y = tf.matmul(a, x) + b
    print("PRINT: ", y)
    tf.print("TF-PRINT: ", y)
    return y
b = tf.Variable(12.)
f(b)

如上一节所述,该函数也可以产生预期的行为。此外,通过传递Variable,我们也可以在函数内部更新Variable的值.比方下面的代码可以更新参数x,产生1,2,3.

@tf.function
def g(x):
    x.assign_add(1)
    return x
a = tf.Variable(0)
print(g(a))
print(g(a))
print(g(a))
#执行结果
tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)

Conclusions

关于tf.function今天就先讲到这里,我们大致了解了怎么把一个Python eager mode下执行的函数通过tf.function转化为更快的计算图.

等下一章我们来仔细研究一下当我们把一个tf.Tensor或者Python value传入被tf.function装饰的代码里会发生什么.以及tf.function第一次被执行时,里面的Python代码究竟是如何运行的,每一步都会被转为我们期待的计算图形式吗?

原文: Dissecting tf function part 1
https://pgaleone.eu/tensorflow/tf.function/2019/03/21/dissecting-tf-function-part-1/

参考:

https://www.bilibili.com/read/cv12856573/

https://yaoyaowd.medium.com/tensorflow-2-0%E4%B8%8A%E6%89%8B6-%E8%A7%A3%E5%89%96tf-function%E7%9A%84%E4%BD%BF%E7%94%A8-b48cef249ca4

TensorFlow结构化数据输入管道:tf.data高性能实践指南 结构化数据输入管道是深度学习工程落地的关键基础设施,其本质是将带类型、列名和索引的表格数据(如CSV、Parquet)高效转化为GPU-ready张量流。核心原理在于打破Python与计算图的隔离,通过tf.data统一调度IO、解析、特征变换与批处理,实现零拷贝加载、并行解码与内存可控。技术价值体现在显著提升GPU利用率、降低OOM风险、保障训练可复现性,并支撑多GPU与分布式扩展。典型应用场景包括推荐系统CTR预估、金融风控建模及电商用户行为分析等需处理百万至亿级表格数据的工业任务。本文聚焦tf.dat 阅读详情

相关推荐

PyTorch与TensorFlow底层机制对比:张量调度、图执行与跨框架调试

深度学习框架中的张量并非简单数组,而是承载计算历史与设备状态的运行时对象;PyTorch采用动态定义即运行的张量调度机制,依赖`.grad`与CUDA流显式管理梯度生命周期与内存同步,而TensorFlow 2.x则通过`@tf.function`将Python逻辑编译为延迟执行的符号计算图,其`tf.Variable`与`FuncGraph`共同构成状态化执行单元。这种底层哲学差异直接决定调试方式、性能瓶颈与部署路径——例如`RuntimeError: Expected all tensors to be

tomfish 356

TensorFlow开发者认证:从模型训练到生产部署的全链路工程能力

TensorFlow开发者认证聚焦于真实场景下的端到端机器学习工程能力,涵盖数据管道构建、自定义训练循环、模型评估诊断及TFLite轻量化部署等核心环节。其本质是考察开发者对tf.data、tf.function、SavedModel和TFLite等原生API的深度理解与鲁棒应用能力,而非理论记忆或高层封装调用。该认证强调内存效率、计算并行性、错误容错性与生产约束适配,适用于已具备Kaggle项目经验、能独立调试梯度流与部署问题的中级AI工程师。它代表从‘能跑通模型’到‘可交付系统’的关键跃迁,是工业级Te

weixin_30527323的博客 1072

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

@tf.function 是什么意思,作用是什么

相比于动态图,静态图可以进行更多的优化,例如自动并行化、自动求导等,从而提高计算效率。装饰器可以将函数转换为 TensorFlow 图,提高函数的执行效率并支持自动优化和自动求导等功能,适用于大部分的 TensorFlow 计算任务。:装饰器可以将函数中的部分张量运算转换为 TensorFlow 图,这样可以将大部分计算转移到 GPU 上进行加速,提高计算性能。:通过将函数转换为 TensorFlow 图,可以避免重复的计算和 Python 解释器的开销,从而提高函数的执行效率。

“365天深度学习训练营”报名进行中~ 2238

Python控制tek示波器(1)

如何使用Python来控制tek示波器

m0_47441496的博客 3379

用WorkBuddy搭建漫剧AI自动化制作流水线全攻略

在内容创作领域,AI智能体正逐渐从单一工具辅助走向全流程自动化调度。其核心原理是将剧本、分镜、绘图、配音、剪辑等环节拆解为可独立执行的任务单元,由总控系统统一协调,从而大幅降低人力与时间成本。这种模式尤其适用于动态漫画(漫剧)这类环节多、专业度要求高的视频形态。传统制作流程中,角色一致性、配音周期和剪辑返工是公认的效率瓶颈,而借助AI智能体工作台,创作者只需输入故事创意,即可驱动多个数字分身协同完成内容生产。本文以WorkBuddy为例,详细展示如何配置模型、安装技能包并串联五段式流水线,将单集制作成本从万

weixin_28224217的博客 253

关于tf.function简述

目录 本文主要粗浅的讲解tf.function的相关内容,主要分为两块内容,一是tf.function的作用(为什么要有tf.function)。二是在使用tf.function时需要注意的点(tf.function的一些特性) tf.function的作用 通过对比 tf1.x 与 tf2.x eager 与 tf2.x tf.functon进行说明tf.function的作用 tf.1.x 首先从tf1.x的代码风格说起,在tf1.x中,我们需要自行创建一个graph,再把其加载进tf.Session中

small-guo 1793

Dify-前端本地运行-单点登录

本文介绍了如何在已部署Dify的系统中实现AI应用跳转及页面定制化改造。通过iframe跳转无法满足甲方需求后,作者对Dify前端源码进行了本地化二次开发,主要步骤包括:1) 按照官方文档搭建本地开发环境;2) 修改.env配置文件连接部署好的后端服务;3) 隐藏侧边栏和头部导航栏;4) 实现单点登录功能,通过URL参数获取用户邮箱自动登录。过程中解决了请求拦截导致的登录校验问题,最终达成仅保留对话框界面并同步用户信息的需求。该方案涉及Next.js框架和React技术的应用,为类似定制化需求提供了参

weixin_43163457的博客 3224

【Tensorflow教程笔记】常用模块 tf.function :图执行模式

Tensorflow教程笔记 基础 TensorFlow 基础 TensorFlow 模型建立与训练 基础示例:多层感知机(MLP) 卷积神经网络(CNN) 循环神经网络(RNN) 深度强化学习(DRL) Keras Pipeline 自定义层、损失函数和评估指标 常用模块 tf.train.Checkpoint :变量的保存与恢复 常用模块 TensorBoard:训练过程可视化 常用模块 tf.data :数据集的构建与预处理 常用模块 TFRecord :TensorFlow 数据集存储格式 常用模

nanke_4869的博客 1万+

OpenClaw记忆插件升级实战:从memory-lancedb-pro安装到AgentSkill封装

向量数据库作为现代AI应用的核心基础设施,通过将非结构化数据转换为高维向量并利用相似度检索实现语义理解。其原理基于嵌入模型生成向量表示,结合近似最近邻搜索算法实现高效查询。这项技术为智能体系统提供了长期记忆和上下文感知能力,显著提升了对话连贯性与任务执行效率。在AI智能体开发领域,向量数据库常用于知识库构建、对话历史管理和个性化推荐等场景。本文聚焦OpenClaw框架中memory-lancedb-pro插件的部署实践,针对**插件加载顺序**和**Apache Arrow依赖**两大常见痛点,通过封装成可

weixin_42525482的博客 638

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 358

有关于tf.py_function的一些概述

有关于tf.py_function的一些认识

qq_27273975的博客 1329

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统

这是一本关于使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统的详细书籍,全文约 10 万字。《Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and LangGraph》随着人工智能(AI)技术的迅猛发展,智能体(Agent)作为能够自主感知、推理、决策和行动的实体,正逐渐成为构建复杂智能系统的核心。从个性化推荐、客户服务到

AI天才研究院 348

【TensorFlow高效编程必杀技】:彻底搞懂tf.function输入签名的5大陷阱与最佳实践

掌握TensorFlow高效编程关键,深入解析tf.function的输入签名机制。涵盖动态形状、可变参数等5大陷阱及应对策略,提升模型训练性能。适用Eager模式转换与图构建场景,显著加速计算流程。最佳实践方案值得收藏。

IterLoom的博客 705

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

为什么你的@tf.function总是重新编译?:一文搞懂输入签名的设计原则

掌握TensorFlow tf.function的输入签名设计原则,避免频繁重新编译。详解动态输入场景下的签名定义方法,提升模型训练效率,关键技巧一文搞懂,值得收藏

LiteProceed的博客 408

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

纯TF2从零搭建Faster R-CNN:训练推理全流程实战

目标检测中,两阶段检测器通过区域提议与分类回归的级联结构,在精度上长期保持优势。其核心在于锚框机制生成候选区域,再经ROI Align实现特征对齐,最终完成精细分类与回归。在TensorFlow 2环境下,利用Keras与tf.function可原生实现这一流程,避免兼容层带来的调试复杂性。该方案适用于自定义数据集训练、模型改造及部署场景,尤其适合需要深入理解检测内部机制的开发者。本文围绕纯TF2实现Faster R-CNN的训练与推理平台,详细拆解骨干网络、RPN、ROI Head及数据管道等模块的工程细

weixin_28678151的博客 265

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2024年TensorFlow实战指南:从环境搭建到模型部署全解析

在深度学习领域,框架选择一直是开发者关注的核心问题。TensorFlow和PyTorch作为两大主流框架,各自在不同场景下展现独特优势。TensorFlow凭借其完整的部署生态,如TF Serving、TensorFlow Lite和TF.js,在工业落地、移动端和嵌入式推理中占据重要地位。其核心API Keras以平缓的学习曲线和优雅的封装,成为初学者建立深度学习全局认知的理想起点。理解动态图机制、tf.data数据管道、SavedModel导出格式等关键概念,能够帮助开发者高效构建图像分类等实际项目。无

weixin_33624741的博客 314

TensorFlow 2024实战:从环境搭建到模型部署全记录

深度学习框架的选择直接影响从实验到生产的路径。TensorFlow与PyTorch在2024年形成鲜明分工:研究者偏好PyTorch的灵活调试,而生产环境中TensorFlow凭借完整的工程闭环——从Keras高阶API、tf.data数据管道到TF Serving、TensorFlow Lite部署——仍是工业级系统的可靠选择。理解动态图与静态图的切换(eager execution与tf.function)是掌握框架原理的关键,这决定了模型从快速实验到高性能推理的转换效率。在图像分类、推荐系统等场景中,

weixin_31100517的博客 252

TensorFlow本质:工业级AI基础设施设计解析

TensorFlow并非单纯的深度学习框架,而是一种面向大规模AI生产的全栈式计算基础设施。其核心在于图计算模型与急切执行的分层协同、SavedModel跨平台部署能力,以及XLA编译器驱动的硬件级优化。它通过C++高性能内核、Python易用API和Protocol Buffer序列化机制,在训练、推理、监控与回滚等环节提供端到端稳定性。尤其在TPU支持、分布式容错、模型服务(TF Serving)及边缘部署(TFLite)等工业场景中展现出不可替代的技术价值。本文深入剖析TensorFlow的设计哲学、

weixin_29031161的博客 238

Virtual-Display-Driver 社区脚本实用指南:分辨率、刷新率与 HDR 全靠命令行

驱动装好了,虚拟显示器在跑,分辨率和 HDR 却找不到入口?Virtual-Display-Driver 的社区脚本就是为此而生:一组 PowerShell 脚本,在命令行直接调整这块虚拟显示器的分辨率、刷新率、HDR 与启停。[完整脚本清单](https://link.gitcode.com/i/32885cb56e0a222e712f061e7305ccaa)在这里。 ## 📋 先看清单:

gitblog_00879的博客 368

TensorFlow工程化实践:从数据管道到TFLite部署全链路

TensorFlow不仅是深度学习框架,更是一套覆盖数据加载、模型训练、梯度优化、模型导出与边缘部署的完整工程化神经网络实践体系。其核心价值在于通过tf.data实现高吞吐可扩展的数据流水线,借助tf.function实现确定性图优化与硬件协同,依托SavedModel构建跨平台、可复现、可验证的模型交付标准。在工业场景中,它支撑图像分类、缺陷检测、移动端实时推理等典型任务,并与TFLite、联邦学习、模型剪枝等前沿方向深度集成。本文聚焦TensorFlow 2.15 LTS版本,详解混合开发模式、动态标签

weixin_32238157的博客 236

Elasticsearch搜索相关性优化实战:从BM25到function_score

搜索引擎相关性排序决定了用户能否快速找到目标内容,尤其对电商、内容平台等场景,搜索结果的质量直接影响业务转化。在Elasticsearch中,默认的BM25评分模型基于词频与逆文档频率计算文本匹配度,但仅靠它难以满足复杂业务需求。理解TF-IDF到BM25的演变原理,掌握function_score等自定义评分机制,能让我们将销量、库存、时间等业务因子科学纳入排序计算。通过多字段权重设计、boost控制与调优技巧,可以精确控制title、content等字段的贡献度,使搜索结果更贴合用户意图。本文结合工程实

weixin_30846347的博客 331

文本向量化实战指南:从TF-IDF到BERT的工程落地全解析

文本向量化是自然语言处理的基础环节,本质是将离散符号映射为连续数值表示,以支撑语义计算与下游任务。其核心原理涵盖词频统计、共现矩阵分解、上下文动态建模等多层级技术路径。不同方案在精度、延迟、内存与可解释性上存在显著权衡,例如TF-IDF适合规则明确的短文本分类,而BERT类上下文化嵌入更适配多义词消歧与长程依赖建模。在制造业质检、政务工单分派、电商搜索等真实场景中,向量质量直接决定语义检索、情感分析与智能推荐的效果上限。本文聚焦工程落地中的关键决策点与高频避坑经验,覆盖从BoW、TF-IDF、词嵌入到Sen

weixin_34121282的博客 422

TensorFlow安装与核心原理:从GPU兼容性到SavedModel部署

TensorFlow是一个面向大规模数值计算与深度学习的系统级框架,其本质是将张量运算映射到CPU/GPU/NPU等异构硬件上的运行时系统。它通过计算图抽象、自动微分、设备调度和内存管理实现高性能与可扩展性,区别于纯Python库。关键技术包括CUDA/cuDNN版本兼容性、tf.function图编译机制、tf.data流水线优化,以及SavedModel跨平台部署格式。这些能力共同支撑工业级模型训练、边缘推理(如TFLite)和高并发服务(如TensorFlow Serving)。对于需要生产稳定、硬件

weixin_29045001的博客 103
上一篇: TensorFlow2基础-Tensor性质
下一篇: python获取模块文件路径
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值