2015-10-22 3 views
3

В deep learning tutorials все данные обучения хранятся в массиве shared, и только индекс в этот массив передается в функцию обучения, чтобы разрезать мини-патч. Я понимаю, что это позволяет оставить данные в памяти графического процессора, в отличие от передачи небольших фрагментов данных в качестве параметра для функции обучения для каждой мини-камеры. В некотором previous questions это было дано как ответ о том, почему в учебниках используется механизм givens.Является ли использование «givens» действительно необходимым в обучающих программах deeplearning?

Я еще не вижу связи между этими двумя концепциями, поэтому я, вероятно, упускаю что-то важное. Насколько я понимаю, механизм givens заменяет переменную в графе с заданным символическим выражением (т. Е. Вместо данной переменной вставлен некоторый заданный подграф). Тогда почему бы не определить вычислительный граф так, как нам это нужно в первую очередь?

Вот минимальный пример. Я определяю общую переменную X и целое число index, и я либо создаю график, который уже содержит операцию разрезания, либо создаю тот, где операция разреза вставляется после hoc через 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] 

ответ

0

givens Они используют здесь только расцепить фактические данные, которая передается на графику с переменным входными данными. Вы можете явно заменить входную переменную X[index * batch_size: (index + 1) * batch_size], но это немного более грязно.

Смежные вопросы