在deep learning tutorials中,所有訓練數據都存儲在shared
數組中,只有該數組中的索引被傳遞給訓練函數才能分出小批次。 我知道這允許將數據留在GPU內存中,而不是將小塊數據作爲參數傳遞給每個小批次的訓練函數。 在一些previous questions,這是作爲一個答案,爲什麼在教程中使用givens
機制。在deeplearning教程中使用'givens'確實是必要的嗎?
我還沒有看到這兩個概念之間的聯繫,所以我可能錯過了一些必要的東西。 據我所知,givens機制用給定的符號表達式交換圖中的一個變量(即,某個給定的子圖插入在該變量的位置)。 那麼爲什麼不以我們首先需要的方式定義計算圖?
這是一個簡單的例子。我定義了一個共享變量X
和一個整數index
,我要麼創建一個已經包含切片操作的圖形,要麼創建一個切片操作通過givens
事後插入的切片操作。 從表面看,兩個結果函數get_nogivens
和get_tutorial
是相同的(請參見最後的debugprints)。
但爲什麼教程使用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]