Theano2.1.15-基础知识之theano如何处理shapre信息
来自:http://deeplearning.net/software/theano/tutorial/shape_info.html
How Shape Information is Handled by Theano
当建立一个graph的时候,是没法严格的执行theano变量的shape的,因为在运行的时候将具体的值作为提供给一个theano函数的参数来说,也许会受到它graph中theano变量的shape的限制。
当前,有两种方式来使用shape信息:
当准确的输出shape已经提前知道的情况下,为了在cpu和gpu上让2d卷积得到更快的c代码。
当我们只想要知道shape,而不是一个变量的实际的值的时候,也就是为了移除graph中的计算。可以使用方法: Op.infer_shape 。
例子:
- >>> import theano
- >>> x = theano.tensor.matrix('x')
- >>> f = theano.function([x], (x ** 2).shape)
- >>> theano.printing.debugprint(f)
- MakeVector [@A] '' 2
- |Shape_i{0} [@B] '' 1
- | |x [@C]
- |Shape_i{1} [@D] '' 0
- |x [@C]
这个编译后的函数的输出不包含任何乘法或幂次运算。theano已经将它们移除,直接计算输出的shape。
一、Shape的推测问题
Theano 在graph中传播关于shape的信息。有时候,这会导致错误,考虑下面的例子:
- >>> import numpy
- >>> import theano
- >>> x = theano.tensor.matrix('x')
- >>> y = theano.tensor.matrix('y')
- >>> z = theano.tensor.join(0, x, y)
- >>> xv = numpy.random.rand(5, 4)
- >>> yv = numpy.random.rand(3, 3)
- >>> f = theano.function([x,y], z.shape)
- >>> theano.printing.debugprint(f)
- MakeVector [@A] '' 4
- |Elemwise{Add}[(0, 0)] [@B] '' 3
- | |Shape_i{0} [@C] '' 1
- | | |x [@D]
- | |Shape_i{0} [@E] '' 2
- | |y [@F]
- |Shape_i{1} [@G] '' 0
- |x [@D]
print f(xv,yv)# 不应该引起错误。[8, 4]
- >>> f = theano.function([x,y], z)# Do not take the shape.
- >>> theano.printing.debugprint(f)
- Join [@A] '' 0
- |TensorConstant{0} [@B]
- |x [@C]
- |y [@D]
- >>> f(xv,yv)
- >>> # Raises a dimensions mismatch error.
正如你看到的,当只想要知道一些计算的shape的时候 (例子中的join ),可以在没有执行该计算本身(在第一个输出和调试打印的时候没有 join )的时候,直接得到一个推测的shape
。
这使得shape的计算更快,不过它同样也隐藏着错误。在这个例子中,join的输出的shape的计算只基于第一个输入的theano变量得到的,这会引发一个错误。
当使用其他ops的时候,例如 elemwise 和 dot,错误也许会发生。确实,为了执行一些优化(速度或者稳定性),theano首先假设计算是正确的。
你可以通过运行没有优化的代码来检测这些问题,使用theano flagoptimizer_excluding=local_shape_to_shape_i。你同样可以通过在模式FAST_COMPILE(它不会使用这个优化,也不会使用其他的大部分优化)
或者 DebugMode (它会在所有优化之后来进行测试(更慢))下运行来得到同样的结果。
二、指定准确的shape
当前,指定一个shape梅雨哦和我们想的那样容易和灵活。我们打算进行一些升级。这里就是当前我们可以做到的:
- 你可以在调用conv2d函数的时候,直接将shape信息传递给 ConvOp 。简单的在调用的时候设置参数为 image_shape 和filter_shape 。他们必须是4个元素的元组。例如:
- theano.tensor.nnet.conv2d(..., image_shape=(7, 3, 5, 5), filter_shape=(2, 3, 4, 4))
- 你可以使用 SpecifyShape 操作来在graph的任何位置上增加shape信息。这可以允许执行某些优化。在下面的例子中,这使得对theano函数进行预计算成为一个常量。
- >>> import theano
- >>> x = theano.tensor.matrix()
- >>> x_specify_shape = theano.tensor.specify_shape(x, (2, 2))
- >>> f = theano.function([x], (x_specify_shape ** 2).shape)
- >>> theano.printing.debugprint(f)
- DeepCopyOp [@A] '' 0
- |TensorConstant{(2,) of 2} [@B]
三、未来的计划
参数 “constant shape”可以加入到 theano.shared()中 。这可能是在使用shared变量的时候最频繁的操作了。它会让代码更简单,而且可可以当更新shared变量的时候使得shape不发生改变。
参考资料:
[1]官网:http://deeplearning.net/software/theano/tutorial/shape_info.html
Theano2.1.15-基础知识之theano如何处理shapre信息的更多相关文章
- Theano2.1.18-基础知识之theano的扩展
来自:http://deeplearning.net/software/theano/tutorial/extending_theano.html Extending Theano 该教程覆盖了如何使 ...
- Theano2.1.21-基础知识之theano中多核的支持
来自:http://deeplearning.net/software/theano/tutorial/multi_cores.html Multi cores support in Theano 一 ...
- 【STM32H7教程】第15章 STM32H7的GPIO基础知识(重要)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第15章 STM32H7的GPIO基础知识(重要) ...
- ReactiveCocoa基础知识内容
本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...
- Theano2.1.1-基础知识之准备工作
来源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial 这里介绍的是使用theano的一些基础知识,虽然thea ...
- JAVA学习基础知识总结(原创)
(未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...
- Linux Shell 基础知识(一)
1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...
- 软帝学院:一万字的Java基础知识总结大全(实用)
Java基础总结大全(实用) 一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨 ...
- Python基础知识总结笔记(四)函数
Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...
随机推荐
- Java并发之工具类 ForkJoin 任务分解
Fork/Join框架的介绍 第一步分割任务.首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小. 第二步执行任务并合并结果.分割 ...
- Silverlight 调用自托管的wcf 报跨域异常的处理
Sileverlight很多时候需要通过wcf和后台,程序进行交互.如果 iis was托管还好,极端的遇到自托管的程序,console,windowsservice,winform,wpf等,就会出 ...
- Java 使用 JRegistry-1.8.1 读取和设置 windows 注册表
在一个监控相关的Java项目中,需要读取windows系统的注册表,搜索到使用 JRegistery 可以解决.代码如下: /** * @author digdeep@126.com */ publi ...
- 从客户端中检测到有潜在危险的Request.Form值的详细解决方案
ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidatio ...
- 腾讯TOS
腾讯TOS 手机操作系统 3月3日开启内测[日期:2015-02-11] 来源:Linux社区 作者:Linux [字体:大 中 小] 腾讯TOS 操作系统 3月3日开启内测 2月1 ...
- 使用数据库sqlite3 C语言实现登陆注册的功能
//此代码为注册功能 void create_regtable() { int rc; //rc为返回值,判断函数是否执行成功 rc=0函数执行成功,rc !=0函数执行失败 sqlite3 *db; ...
- 使用Bootstrap v3.3.4注意细节box-sizing
一.bootstrap样式 在Bootstrap v3.3.4中有下面一条重置样式: * { -webkit-box-sizing: border-box; -moz-box-sizing: bord ...
- 2014 UESTC暑前集训图论专题解题报告
A.方老师和缘分 http://www.cnblogs.com/whatbeg/p/3765621.html B.方老师和农场 http://www.cnblogs.com/whatbeg/p/376 ...
- Codeforces Round #371 (Div. 2)E. Sonya and Problem Wihtout a Legend[DP 离散化 LIS相关]
E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...
- JQuery获取元素的方法总结
JQuery获取元素的方法总结 一.说明 获取元素的方法分为两种:jQuery选择器.jQuery遍历函数. 做个总结,巩固下知识. 二.获取本身 1.只需要一种jQuery选择器 选择器 实 ...