Theano - 函数
Theano - 函数:编译与执行图
Section titled “Theano - 函数:编译与执行图”在 Theano 中,定义符号变量和表达式仅构建了计算图(computational graph)。它描述了应该执行什么计算,但并没有实际执行它。连接符号图定义与其数值执行的桥梁就是 theano.function。
theano.function 接受你的符号图,将其编译成高度优化的可执行代码,并返回一个可调用的 Python 对象(一个函数),你可以使用它来通过具体的数据运行计算。
当你调用 theano.function 时,幕后会发生几件事情:
- 图分析(Graph Analysis): Theano 分析输入和输出变量以及连接它们的操作。
- 优化(Optimization): 它对图结构应用大量的优化。这可能包括代数简化(例如,移除冗余操作)、重写表达式以提高数值稳定性、融合操作以及规划内存分配。
- 代码生成(Code Generation): 优化图的一部分,尤其是涉及循环或张量操作的部分,可能会被编译成 C/C++ 或 CUDA 代码以提高速度。
- 函数创建(Function Creation): 它将优化后的、编译好的代码打包成一个可调用的 Python 对象。
这个编译步骤可能需要一些时间,特别是对于复杂图,但由此产生的函数重复执行时通常比解释执行原始 Python/NumPy 等效代码快得多。
创建 Theano 函数的基本语法是:
import theanoimport theano.tensor as tt
# 1. Define symbolic inputsinput_var1 = tt.dmatrix('in1')input_var2 = tt.dscalar('in2')
# 2. Define symbolic expression(s) / output(s)output_var = input_var1 * input_var2 # Example: scale matrix by scalar
# 3. Compile the functioncompiled_function = theano.function( inputs=[input_var1, input_var2], # List of symbolic inputs outputs=output_var # List (or single) symbolic output(s))inputs:一个 Python 列表,包含作为计算输入的符号变量。当你调用编译后的函数时,你将按照相同的顺序提供对应于这些符号输入的具体数值(例如,NumPy 数组)。outputs:一个 Python 列表,包含你希望函数返回其计算值的符号变量。如果你只有一个输出,可以直接提供,而无需将其包含在列表中(尽管使用列表通常更清晰)。
然后你可以使用 NumPy 数组或适当的 Python 类型调用 compiled_function:
import numpy as np
matrix_data = np.array([[1, 2], [3, 4]], dtype='float64')scalar_data = 2.0
result = compiled_function(matrix_data, scalar_data)print(result)# Output:# [[2. 4.]# [6. 8.]]高级特性(简要概述)
Section titled “高级特性(简要概述)”theano.function 支持其他几个重要的参数,特别是:
updates:用于实现训练循环。它接受一个元组列表,每个元组包含一个共享变量(shared variable)和一个表示其新值的符号表达式。函数计算完输出后,会根据这些规则更新共享变量(例如,梯度下降更新)。参见“训练示例”章节。givens:允许将图中的某个特定表达式替换为不同的值或表达式,常用于在测试期间实现 Dropout 等技术或在特定阶段提供数据。mode:(现在不太相关)曾允许指定优化级别,如FAST_COMPILE(编译更快,优化较少)或FAST_RUN(编译较慢,优化更多)。这也可以通过THEANO_FLAGS环境变量全局设置。现代框架更自动化地处理优化。
updates 机制尤其关键,因为它允许 theano.function 作为执行的副作用来修改共享变量(如模型权重)的状态。
在 Theano 工作流中的作用
Section titled “在 Theano 工作流中的作用”theano.function 是 Theano 工作流的核心。它连接了图定义的抽象、符号世界与数值计算的具体世界。通过编译图,它释放了 Theano 的主要卖点——性能优势。
理解其作为编译器和执行器的作用是掌握 Theano(以及概念上,现代框架如 TensorFlow 的 tf.function 或 JAX 的 jit 的部分)如何实现效率的关键。