2015-12-02 3 views
2

В настоящее время я реализую сверточный RBM, и я использую для этого Theano.Рисование образцов из многомерных с использованием Theano

Мое текущее выполнение кажется довольно медленным, и профилирование показало, что в основном это связано с шагами выборки Гиббса. Фактически, я использую Theano's shared randomstreams для генерации многочленных образцов.

Однако я нашел улучшенную версию случайного потока Theano here, который отвечает всем требованиям производительности, которые у меня есть.

К сожалению, этот экспериментальный случайный генератор поддерживает только двумерные матрицы, и я должен использовать его для тензора4-объекта (4D-Matrix), так как это результат работы nano conv2d от Theano.

Вы знаете, если есть эффективный способ сделать образцы из 4D-матрицы, которая имеет следующую структуру:

SampleSize х 1 х N х M

, где я хотел бы сделать из одного из столбцы (третье измерение), что дает мне такой код:

for sample in range(numSamples): 
     for col in range(numCols): 
      drawMultinomial(n=1, pvals=data[sample,0,col,:]) 

Но этот код будет очень медленно, и я хотел бы сделать это эффективно и на GPU.

Так что любая помощь была бы высоко оценена.

ответ

1

Итак, я нашел решение, которое сработало для меня с довольно простой комбинацией dimshuffle/reshape, которая отменяется после выборки.

def sampleVisibleLayer (self, V): 
    reshaped = V.dimshuffle(0, 1, 3, 2).reshape((V.shape[0]*V.shape[3], V.shape[2])) 
    S_reshaped = self.theano_rng.multinomial(n=1,pvals=reshaped) 
    S = S_reshaped.reshape((V.shape[0], 1, V.shape[3], V.shape[2])).dimshuffle(0, 1, 3, 2) 

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

Решение также довольно быстро, так как в O (1) выполняются димфаффы и перестановки.