【问题标题】:Is the use of 'givens' really necessary in the deeplearning tutorials?在深度学习教程中真的有必要使用“给定”吗?
【发布时间】:2015-10-22 14:16:11
【问题描述】:

deep learning tutorials 中,所有训练数据都存储在shared 数组中,并且只有该数组的索引被传递给训练函数以切出一个小批量。 我知道这允许将数据留在 GPU 内存中,而不是将小块数据作为参数传递给每个小批量的训练函数。 在一些previous questions 中,这是作为为什么在教程中使用givens 机制的答案。

我还没有看到这两个概念之间的联系,所以我可能错过了一些重要的东西。 据我了解,给定机制用给定的符号表达式交换了图中的变量(即,插入了一些给定的子图来代替该变量)。 那么为什么不首先按照我们需要的方式定义计算图呢?

这是一个最小的例子。我定义了一个共享变量X 和一个整数index,我要么创建一个已经包含切片操作的图形,要么创建一个切片操作通过givens 事后插入的图形。 从表面上看,get_nogivensget_tutorial 生成的两个函数是相同的(请参阅最后的调试图)。

但是为什么教程使用givens 模式呢?

import numpy as np
import theano
import theano.tensor as T

X = theano.shared(np.arange(100),borrow=True,name='X')
index = T.scalar(dtype='int32',name='index')
X_slice = X[index:index+5]

get_tutorial = theano.function([index], X, givens={X: X[index:index+5]}, mode='DebugMode')
get_nogivens = theano.function([index], X_slice, mode='DebugMode')



> theano.printing.debugprint(get_tutorial)
DeepCopyOp [@A] ''   4
 |Subtensor{int32:int32:} [@B] ''   3
   |X [@C]
   |ScalarFromTensor [@D] ''   0
   | |index [@E]
   |ScalarFromTensor [@F] ''   2
     |Elemwise{add,no_inplace} [@G] ''   1
       |TensorConstant{5} [@H]
       |index [@E]

> theano.printing.debugprint(get_nogivens)
DeepCopyOp [@A] ''   4
 |Subtensor{int32:int32:} [@B] ''   3
   |X [@C]
   |ScalarFromTensor [@D] ''   0
   | |index [@E]
   |ScalarFromTensor [@F] ''   2
     |Elemwise{add,no_inplace} [@G] ''   1
       |TensorConstant{5} [@H]
       |index [@E]

【问题讨论】:

    标签: theano


    【解决方案1】:

    他们在这里使用givens 只是为了将传递给图形的实际数据与输入数据变量分离。您可以用X[index * batch_size: (index + 1) * batch_size] 显式替换输入变量,但这有点麻烦。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2018-09-06
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多