Могу ли я сохранить промежуточные результаты?

#gpu #theano

#графический процессор #theano

Вопрос:

Я хочу сохранить промежуточные результаты, чтобы избежать многократных вычислений для одной вещи. Я ищу что-то вроде этого:

     h1_activ = sigmoid(self.bias_visiblie   T.dot(D, self.W))
    h1_sample = h1_activ > rnds.uniform((n_samples, self.n_hidden )) 

    f_h1_sample = theano.function(
        inputs=[D],
        outputs=h1_sample,
        # I'd like to take the result from 'h1_sample' and store it into 'H1_sample'
        updates=[(self.H1_sample, ??? )] 
    )
 

Приведенный выше код, конечно, не выполняется, но есть ли способ сделать что-то подобное? Сохранение промежуточного значения в общей переменной?

Ответ №1:

Вы можете записать окончательные результаты, которые используют одни и те же промежуточные результаты, в том же theano.function .

Например:

 h1_activ = sigmoid(self.bias_visiblie   T.dot(D, self.W))
h1_sample = h1_activ > rnds.uniform((n_samples, self.n_hidden )) 
# h2_sample use the intermediate result h1_sample.
h2_sample = h1_sample * 2

f_h1_sample = theano.function(
    inputs=[D],
    outputs=[h1_sample, h2_sample],
)
 

h2_smaple — это конечный результат, который использует h1_sample.

Также вы можете сохранить промежуточные результаты и использовать их в качестве входных данных в другом theano.function .

Разные theano.function s соответствуют разным графам вычислений. Я думаю, что никакие вычисления не могут быть разделены между различными графиками вычислений.

Комментарии:

1. Привет! Когда вы говорите » вы можете записать окончательные результаты «, я не знаю, как я это сделаю. Я не хочу перетасовывать слишком много данных между графическим процессором и оперативной памятью процессора, так как же мне сохранить промежуточный результат после выполнения графика наиболее эффективно в оперативной памяти графических процессоров?

2. @displayname Я добавляю пример в исходный ответ.

3. Но разве это не скопирует данные обратно на хост?