2015-10-22 21 views
3

deep learning tutorials中,所有訓練數據都存儲在shared數組中,只有該數組中的索引被傳遞給訓練函數才能分出小批次。 我知道這允許將數據留在GPU內存中,而不是將小塊數據作爲參數傳遞給每個小批次的訓練函數。 在一些previous questions,這是作爲一個答案,爲什麼在教程中使用givens機制。在deeplearning教程中使用'givens'確實是必要的嗎?

我還沒有看到這兩個概念之間的聯繫,所以我可能錯過了一些必要的東西。 據我所知,givens機制用給定的符號表達式交換圖中的一個變量(即,某個給定的子圖插入在該變量的位置)。 那麼爲什麼不以我們首先需要的方式定義計算圖?

這是一個簡單的例子。我定義了一個共享變量X和一個整數index,我要麼創建一個已經包含切片操作的圖形,要麼創建一個切片操作通過givens事後插入的切片操作。 從表面看,兩個結果函數get_nogivensget_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] 

回答

0

它們在這裏只使用givens來分離從輸入數據變量傳遞給圖的實際數據。你可以明確地用X[index * batch_size: (index + 1) * batch_size]代替輸入變量,但這只是一點點雜亂。

相關問題