Я только что реализовал ядро Gaussian в Theano. Однако, когда я тестировал его как часть нейронной сети, это занимает слишком много времени. Похоже, что вычитания ядра не являются параллелизированными. Вся подготовка сети использует единое ядро обработки. Итак, как правильно заставить Theano разделить операцию ядра?эффективная реализация ядра в anano
import theano.tensor as T
import numpy
import theano
batch_s=5
dims=10
hidd_s=3
out_s=2
missing_param = None #"ignore"
rng = numpy.random.RandomState(1234)
input = T.matrix("input")
X = numpy.asarray(rng.uniform(low=-2.1, high=5.0, size=(batch_s, dims)))
def layer(x):
W=theano.shared(
value=numpy.asarray(
rng.uniform(low=0.001, high=1.0, size=(dims, hidd_s)),
dtype=theano.config.floatX),
name='W', borrow=True)
S=theano.shared(
value=numpy.asarray(
rng.uniform(low=10.0, high=100.0, size=(hidd_s,)),
dtype=theano.config.floatX),
name='S', borrow=True)
dot_H = theano.shared(
value=numpy.zeros((batch_s, hidd_s),
dtype=theano.config.floatX),
name='dot_H', borrow=True)
# This is the kernel operation. I have tested with single scan as well
# as with two nested scans, but operations arenot splitted as in the
# case of the usual dot product T.dot().
for i in range(batch_s):
for j in range(hidd_s):
dot_H = T.set_subtensor(dot_H[i,j],
T.exp(-(W.T[j] - x[i]).norm(2) ** 2)/2 * S[j] ** 2)
return dot_H
layer_out = theano.function(
inputs=[input],
outputs=layer(input),
on_unused_input=missing_param
)
print layer_out(X)
Thak you very much.
Если вы создаете нейронную сеть, вы можете попробовать [Intel Theano] (https://github.com/intel/Theano), который будет очень быстрым в процессоре с оптимизированной сверткой, relu и другими примитивами. – Patric