资讯专栏INFORMATION COLUMN

Theano - theano如何处理形状信息

muddyway / 1901人阅读

摘要:是怎么处理形状信息在构建图的时候,不可能严格执行变量的形状。形状推断问题在图中,将会传播形状的信息。以下情形是目前我们可以做到的当调用时,你可以直接把形状信息传递给。例如你可以在图的任何位置使用添加位置信息。

Theano是怎么处理形状信息(Shape Information)

在构建图的时候,不可能严格执行Theano变量的形状。因为在运行的时候,传递给Theano函数的某一参数的值可能影响Thenao变量的形状。目前,关于形状信息的使用在Theano中有以下两种方式:

在输出形状已知的情况下,生成在CPU和GPU上进行2d卷积的更高效的C代码

当我们只关心变量的形状,而不是实际值的时候,将移除图的计算。这通过Op.infer_shape完成。

例子:

import theano
import theano.tensor as T
x = T.matrix("x")
f = theano.function([x], (x ** 2).shape)
theano.printing.debugprint(f)
# MakeVector{dtype="int64"} [id A] ""   2
#  |Shape_i{0} [id B] ""   1
#  | |x [id C]
#  |Shape_i{1} [id D] ""   0
#    |x [id C]

输出结果不包含任何乘法以及幂运算。Theano已经移除了它们直接去计算输出的形状。

形状推断问题(Shape Inference Problem)

在图中,Theano将会传播形状的信息。有时,这将会导致一些错误。考虑下面的例子:

import numpy
import theano
x = theano.tensor.matrix("x")
y = theano.tensor.matrix("y")
z = theano.tensor.join(0, x, y)     # 将x,y按行拼接起来,要求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{dtype="int64"} [id A] ""   4
#  |Elemwise{Add}[(0, 0)] [id B] ""   3
#  | |Shape_i{0} [id C] ""   1
#  | | |x [id D]
#  | |Shape_i{0} [id E] ""   2
#  |   |y [id F]
#  |Shape_i{1} [id G] ""   0
#    |x [id D]

f(xv, yv)       # 并没有报错
# array([8, 4])

f = theano.function([x,y], z)   # 直接返回z
theano.printing.debugprint(f)
# Join [id A] ""   0
#  |TensorConstant{0} [id B]
#  |x [id C]
#  |y [id D]

f(xv, yv)    # 报错
# Traceback (most recent call last):
#   ...
# ValueError: ...

正如你看到的,当仅仅访问计算结果的形状信息(z.shape)时,将会直接推断结果的形状,并不会执行计算过程(即z的具体数值)。

这使得形状的计算速度很快,但是它可能会隐藏一些错误。在这个例子中,输出结果形状的计算仅仅基于输入的第一个Theano变量,这导致返回形状信息的错误。

这种现象也可能出现在其他运算上,比如elemwise和dot。事实上,为了执行一些优化(例如,速度和稳定性),Theano从一开始就假定计算是正确的,并且是一致的。就像上述例子中一样。
你可以通过使用Theano标志optimizer_excluding=local_shape_to_shape_i运行代码(将不会执行上述提及的优化)来检测这种错误。你也可以通过在FAST_COMPILE或者DebugMode模式下执行代码,得到同样的效果。

FAST_COMPILE模式将不会执行这种优化,以及大部分其它的优化。

DebugMode模式将会在优化前以及优化后进行测试,导致运行速率更慢。

指定确切的形状

目前,指定一个形状并不像我们计划一些更新和期望的那么容易和灵活。以下情形是目前我们可以做到的:

当调用conv2d时,你可以直接把形状信息传递给ConvOp。你只需要在调用时简单地设置一下image_shape和filter_shape参数就可以了。他们必须是包含4个元素的元组。例如:

theano.tensor.nnet.conv2d(..., image_shape=(7,3,5,5), filter_shape=(2,3,4,4))

你可以在图的任何位置使用SpecifyShape添加位置信息。这允许执行一些优化。在接下来的例子中,这使得预先计算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)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38659.html

相关文章

  • Theano - 广播(broadcasting)

    摘要:广播广播是这样的一个机制它允许不同维度的张量进行加法或者乘法运算。如上图,广播一个行矩阵。和分别表示和指明沿着哪个维度可以进行广播。如果第二个参数是向量,它的形状为,以及它的广播模式为。当可用的时候,广播信息将会以变量的类型给出。 广播(Broadcasting) 广播是这样的一个机制:它允许不同维度的张量进行加法或者乘法运算。在运算时,他将会沿着维度缺失的方向复制较小的那个张量。 通...

    whjin 评论0 收藏0
  • PyTorch和TensorFlow到底哪个更好?看看一线开发者怎么说

    摘要:我认为对机器学习开发者来说,是一个了不起的工具集。这个帖子发出后得到了很多机器学习研究者和开发者的关注,他们纷纷跟贴谈论自己的想法和经验不只是关于和,讨论中还涉及到更多工具。 Theano、TensorFlow、Torch、MXNet 再到近日比较热门的 PyTorch 等等,深度学习框架之间的比较一直以来都是非常受人关注的热点话题。机器之心也曾发表过多篇相关的介绍和对比文章,如《主流深度学...

    coordinate35 评论0 收藏0
  • Deep learning:四十二(Denoise Autoencoder简单解)

    摘要:本篇博文主要是根据的那篇文章简单介绍下,然后通过个简单的实验来说明实际编程中该怎样应用。当然作者也从数学上给出了一定的解释。自顶向下的生成模型观点的解释。信息论观点的解释。 前言:   当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Bengio在08年...

    gotham 评论0 收藏0
  • Theano - Numpy 新手

    摘要:机器学习中的矩阵公约水平方向为矩阵的行,竖直方向为矩阵的列,每一行为一个样例记录。因此输入表示由个样例记录,每个样例具有个维度属性组成的矩阵。如果为一个神经网络的输入,那么权重矩阵的表示形式为的矩阵。 机器学习中的矩阵公约 水平方向为矩阵的行,竖直方向为矩阵的列,每一行为一个样例(记录)。 因此输入[10, 5]表示:由10个样例(记录),每个样例具有5个维度(属性)组成的矩阵。如果[...

    wangxinarhat 评论0 收藏0
  • Deep Learning深度学习相关入门文章汇摘

    摘要:深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。深度学习的概念由等人于年提出。但是自年以来,机器学习领域,取得了突破性的进展。 深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习是无监督学习的一种。 深度学习的概念源于人工神经网络的研究。含多隐层的多层感知...

    Riddler 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<