В 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]