Theano及其分叉PyTensor,是一个Python库和优化的编译器,用来操纵和求值数学表达式特别是矩阵值表达式。在其中,计算使用NumPy风格的语法来表达并被编译,用来在CPU或者GPU架构上高效的运行。
历史
Theano是开源项目,主要由蒙特利尔大学的(MILA)开发。软件名字取自古代哲学家。在2017年9月28日,Pascal Lamblin发布了来自约书亚·本希奥的一则信息,MILA负责人说:由于更强大的工业参与者的竞争,主要的开发在1.0发行之后将会停止。Theano 1.0.0随后在2017年11月15日发行。
在2018年5月17日,Chris Fonnesbeck代表PyMC开发团队写道:PyMC开发者将在他们退场后取得对Theano维护的控制权。在2021年1月绝大部份的Theano代码基被重新建造,并增加了通过JAX和Numba的编译,修订后的这个计算后端以新名字Aesara发行。2022年11月28日,PyMC团队宣布采用从Aesara计划分叉出PyTensor。
样例代码
下列代码以PyTensor用作介绍的例子:
import pytensor
from pytensor import tensor as pt
声明2个符号浮点标量
a = pt.dscalar("a")
b = pt.dscalar("b")
建立一个简单的表达式
c = a + b
将这个表达式转换成一个可调用对象,
它接收'(a, b)'值作为输入并计算出一个值给'c'
f_c = pytensor.function([a, b], c)
assert f_c(1.5, 2.5) == 4.0
计算样例表达式关于'a'的梯度
dc = pytensor.grad(c, a)
f_dc = pytensor.function([a, b], dc)
assert f_dc(1.5, 2.5) == 1.0
>> import pytensor >> from pytensor import tensor as pt >> >> # 通过'pytensor.function'编译函数还能优化表达式图 >> # 它会移除不必要的运算并将特定运算替代为更有效的运算 >> >> v = pt.vector("v") >> M = pt.matrix("M") >> >> d = a/a + (M + a).dot(v) >> >> pytensor.dprint(d)
Add [id A]
├─ ExpandDims{axis=0} [id B]
│ └─ True_div [id C]
│ ├─ a [id D]
│ └─ a [id D]
└─ dot [id E]
├─ Add [id F]
│ ├─ M [id G]
│ └─ ExpandDims{axes=[0, 1]} [id H]
│ └─ a [id D]
└─ v [id I]
' mode='w' encoding='utf-8'>
>>>
>>> f_d = pytensor.function([a, v, M], d)
>>>
>>> # 'a/a' -> '1'而点积被替代为BLAS函数(i.e. CGemv)
>>> pytensor.dprint(f_d)
Add [id A] 5
├─ [1.] [id B]
└─ CGemv{inplace} [id C] 4
├─ AllocEmpty{dtype='float64'} [id D] 3
│ └─ Shape_i{0} [id E] 2
│ └─ M [id F]
├─ 1.0 [id G]
├─ Add [id H] 1
│ ├─ M [id F]
│ └─ ExpandDims{axes=[0, 1]} [id I] 0
│ └─ a [id J]
├─ v [id K]
└─ 0.0 [id L]
' mode='w' encoding='utf-8'>
参见
*
- 可微分编程
引用
外部链接
- (GitHub)
- [http://deeplearning.net/software/theano/ Theano] at Deep Learning, Université de Montréal
评论 (0)