返回介绍

01. Python 工具

02. Python 基础

03. Numpy

04. Scipy

05. Python 进阶

06. Matplotlib

07. 使用其他语言进行扩展

08. 面向对象编程

09. Theano 基础

10. 有趣的第三方模块

11. 有用的工具

12. Pandas

Theano 符号图结构

发布于 2022-09-03 20:46:15 字数 7946 浏览 0 评论 0 收藏 0

使用 Theano,首先要定义符号变量,然后是利用这写符号变量进行计算,这些符号被称为 variables,而操作 +, -, **, sum(), tanh() 被称为 ops,一个 op 操作接受某些类型的输入,并返回某些类型的输出。

Theano 利用这些来构建一个图结构,一个图结构包括:

  • variable 节点
  • op 节点
  • apply 节点

其中,apply 节点用来表示一个特定的 op 作用在一些特定的 variables 上,例如:

In [1]:

import theano
import theano.tensor as T

x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y
Using gpu device 0: GeForce GTX 850M

要显示这个图结构可以用 pydotprint,先安装 graphviz

Windows 下:

在环境变量 path 后加上:

  • path
    • C:\Program Files (x86)\Graphviz2.38\bin

然后要先安装 pydot 包:

如果你的 pyparsing >= 2.0 ,则将其降为 1.5.7,下载并安装 pydot-1.0.28

安装完之后,找到 pydot.py 将其中:

graph.append( '%s %s {\n' % (self.obj_dict['type'], self.obj_dict['name']) )

修改为:

graph.append( '%s %s {\n' % (self.obj_dict['type'], quote_if_necessary(self.obj_dict['name'])) )

In [2]:

theano.printing.pydotprint(z, outfile='https://www.wenjiangs.com/wp-content/uploads/2022/09/apply1.png', var_with_name_simple=True)
The output file is available at https://www.wenjiangs.com/wp-content/uploads/2022/09/apply1.png

它的图结构如下:

图结构1

zowner 是一个 apply 结构,其 op 为:

In [3]:

z.owner.op.name

Out[3]:

'Elemwise{add,no_inplace}'

这个 apply 结构的输入值有两个,输出值有一个:

In [4]:

print z.owner.nin
print z.owner.nout
2
1

查看它的输入:

In [5]:

z.owner.inputs

Out[5]:

[x, y]

我们可以用 pprint 来显示它:

In [6]:

print theano.printing.pprint(z)
(x + y)

debugprint 显示图结构:

In [7]:

theano.printing.debugprint(z)
Elemwise{add,no_inplace} [@A] ''   
 |x [@B]
 |y [@C]

再看另一个稍微复杂的例子:

In [8]:

y = x * 2

查看 y 的图谱:

In [9]:

theano.printing.debugprint(y)
Elemwise{mul,no_inplace} [@A] ''   
 |x [@B]
 |DimShuffle{x,x} [@C] ''   
   |TensorConstant{2} [@D]

这里我们看到,y 对应的第二个 input 并不是 2,而是一个 DimShuffle 的操作:

In [10]:

y.owner.inputs[1].owner.op

Out[10]:

<theano.tensor.elemwise.DimShuffle at 0x1b816390>

它的输入才是常数 2:

In [11]:

y.owner.inputs[1].owner.inputs

Out[11]:

[TensorConstant{2}]

In [12]:

theano.printing.pydotprint(y, outfile='https://www.wenjiangs.com/wp-content/uploads/2022/09/apply2.png', var_with_name_simple=True)
The output file is available at https://www.wenjiangs.com/wp-content/uploads/2022/09/apply2.png

其图结构为 结构2

function 对图的优化

In [13]:

a = T.dscalar('a')
b = a + a ** 10

f = theano.function([a], b)

In [14]:

theano.printing.pydotprint(b, outfile='https://www.wenjiangs.com/wp-content/uploads/2022/09/apply_no_opti.png', var_with_name_simple=True)
theano.printing.pydotprint(f, outfile='https://www.wenjiangs.com/wp-content/uploads/2022/09/apply_opti.png', var_with_name_simple=True)
The output file is available at https://www.wenjiangs.com/wp-content/uploads/2022/09/apply_no_opti.png
The output file is available at https://www.wenjiangs.com/wp-content/uploads/2022/09/apply_opti.png

比较一下 function 函数对图结构进行的优化:

未优化前:

没有优化

优化后:

优化

图结构的作用

  • 计算按照图结构来计算
  • 优化,求导

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文