【发布时间】:2015-10-22 14:16:11
【问题描述】:
在deep learning tutorials 中,所有训练数据都存储在shared 数组中,并且只有该数组的索引被传递给训练函数以切出一个小批量。
我知道这允许将数据留在 GPU 内存中,而不是将小块数据作为参数传递给每个小批量的训练函数。
在一些previous questions 中,这是作为为什么在教程中使用givens 机制的答案。
我还没有看到这两个概念之间的联系,所以我可能错过了一些重要的东西。 据我了解,给定机制用给定的符号表达式交换了图中的变量(即,插入了一些给定的子图来代替该变量)。 那么为什么不首先按照我们需要的方式定义计算图呢?
这是一个最小的例子。我定义了一个共享变量X 和一个整数index,我要么创建一个已经包含切片操作的图形,要么创建一个切片操作通过givens 事后插入的图形。
从表面上看,get_nogivens 和 get_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