我正在学习Theano。我写了一个简单的dropout函数如下:
import theano.tensor as T
srng = T.shared_randomstreams.RandomStreams()
def drop(input, dropout=0.0):
if T.gt(dropout, 0.):
retain_prob = 1 - dropout.astype('floatX')
mask = srng.binomial(n=1, p=retain_prob, size=input.shape, dtype='floatX')
return input * mask / retain_prob
else:
return input
当我将此函数应用于前两个卷积层的输入时,每个图像上花费的平均时间从0.5ms增加到大约2.5ms!有谁知道这种剧烈减速的原因是什么?
我正在使用安装了cuDNN的GTX 980卡。
答案 0 :(得分:8)
RandomStream仅适用于CPU。因此,每次调用drop时都必须将mask
从CPU复制到GPU,这是急剧减速的原因。为避免这种情况,我现在使用random stream implementation which works on GPU。
答案 1 :(得分:0)
这似乎与我的问题类似(Lasagne dropoutlayer does not utilize GPU efficiently)。
你有没有检查过代码集cuda_enabled = True
?否则你可以在https://github.com/Theano/Theano/blob/master/theano/sandbox/cuda/init.py的第93行手动设置它。
我知道这不是一个优雅的解决方案,但它现在解决了我的问题。 :)