来自: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信息的更多相关文章

  1. Theano2.1.18-基础知识之theano的扩展

    来自:http://deeplearning.net/software/theano/tutorial/extending_theano.html Extending Theano 该教程覆盖了如何使 ...

  2. Theano2.1.21-基础知识之theano中多核的支持

    来自:http://deeplearning.net/software/theano/tutorial/multi_cores.html Multi cores support in Theano 一 ...

  3. 【STM32H7教程】第15章 STM32H7的GPIO基础知识(重要)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第15章       STM32H7的GPIO基础知识(重要) ...

  4. ReactiveCocoa基础知识内容

    本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...

  5. Theano2.1.1-基础知识之准备工作

    来源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial 这里介绍的是使用theano的一些基础知识,虽然thea ...

  6. JAVA学习基础知识总结(原创)

    (未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...

  7. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  8. 软帝学院:一万字的Java基础知识总结大全(实用)

    Java基础总结大全(实用) 一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨 ...

  9. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

随机推荐

  1. PHP非阻塞模式 (转自 尘缘)

    让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_re ...

  2. gulp系列:简单实践

    coffescript测试源码   gulp = require('gulp') #删除 1.清空目录 常用插件 gulp-clean .del (nodejs模块) del = require('d ...

  3. Linux磁盘管理之创建磁盘分区05

    一.磁盘基础知识 磁盘安装在计算机上后,在系统读取到硬盘后并不能直接使用,必须经过分区.格式化才能够正确使用.这一次主要是针对磁盘分区进行简单总结,存储设备类型:U盘.光盘.软盘.硬盘.磁带. 硬盘接 ...

  4. Vim光标定位

    *定位到指定行n: 输入"nG". 或输入"ngg". 或输入":n" 这里,n就是指定的行的行号.注意,有时候G=gg. *跳到屏幕顶部: ...

  5. jQuery入门第二天&&&正则表达式完结篇——仿smarty引擎的制作

    hi 周一完全的不在状态...中午还去观战,没有睡觉的我,晚上的smarty不知道能不能做完,加油吧 1.jQuery ---过滤性选择器(二)--- --[attribute=value]属性选择器 ...

  6. BNUOJ 52325 Increasing or Decreasing 数位dp

    传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...

  7. Mobizen免帐号版

    Mobizen电脑控制手机软件,是远程软件专家RSUPPORT公司研发的一款全新产品,可以通过电脑(web页面和客户端两种形式)远程控制安卓系统的智能手机和平板电脑,三种连接方式3G/4G.Wifi. ...

  8. 转载:JavaSE之反射

    该文章转载自:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html Java反射详解 本篇文章依旧采用小例子来说明,因为我 ...

  9. AC日记——石头剪刀布 openjudge 1.6 08

    08:石头剪刀布 总时间限制:  1000ms 内存限制:  65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在 ...

  10. Mecanim分析

    前言 目前我还只是学习到Mecanima的初级阶段,看完了阿赵的日志<Unity3D 4.0新功能:Mecanim动画系统基础教程>,对Mecanima的了解更深入了一些,谢谢他的分享. ...