Hi everybody, I am trying to approximate a function that consist of multiple overlapping Gaussian kernels. The calculation should be done in the scan function that iterates over the Gaussian kernels. At this point I got stuck with two problems.
1. I have tried to calculate the sum of all kernels for each input by using the previous result. However, the return value is not the sum of all kernels for a given input but something else. I was not able to figure it out yet. See attached file scan_sum_kernel.py 2. I would like to define the input vector and the kernel parameters (height, mean, variance) as NumPy arrays. Therefore, I added the ‘givens’ parameter to the function. However, this leads to the Value Error: "length not known: <TensorType(int64, vector)> [id A]" See attached file scan_shared_variable.py Any hint and advice how to go on and what to try next is much appreciated! Below the code that is working so far: x = np.arange(start=1,stop=100,step=1) xs = T.dscalar('xs') height = T.dvector('height') mean = T.dvector('mean') variance = T.dvector('variance') bias = T.dvector('bias') def gaussian(height, mean, variance, bias, x): return (height * \ T.exp(-(T.sqr( x-mean) / \ (2*variance)))) + bias gaus_dist, updates = theano.scan( fn=gaussian, sequences=[height, mean, variance, bias], non_sequences=[xs] ) get_gaus = theano.function(inputs=[xs, height, mean, variance, bias], outputs=gaus_dist) gaus3 = np.array([]) for xs in x: gaus1 = get_gaus(xs, [2,10,11], [10,35,64], [2,12,22], [2, 3, 4]) gaus2=0 for gaus_tmp in gaus1: gaus2=gaus2+gaus_tmp gaus3 = np.append(gaus3,gaus2) %matplotlib inline plt.plot(gaus3) -- --- You received this message because you are subscribed to the Google Groups "theano-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to theano-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
# coding: utf-8 # In[4]: import theano.tensor as T import theano import numpy as np import matplotlib.pyplot as plt x = np.arange(start=1,stop=100,step=1) xs = T.dscalar('xs') height = T.dvector('height') mean = T.dvector('mean') variance = T.dvector('variance') bias = T.dvector('bias') def gaussian(height, mean, variance, bias, last_ret, x): tmp = (height * T.exp(-(T.sqr( x-mean) / (2*variance)))) + bias return tmp + last_ret gaus_dist, updates = theano.scan( fn=gaussian, sequences=[height, mean, variance, bias], outputs_info=[np.float64(0)], non_sequences=[xs] ) get_gaus = theano.function(inputs=[xs, height, mean, variance, bias], outputs=gaus_dist) gaus3 = np.array([]) for xs in x: gaus1 = get_gaus(xs, [2,10,11], [10,35,64], [2,12,22], [0, 0, 0]) gaus2=0 for gaus_tmp in gaus1: gaus2=gaus2+gaus_tmp gaus3 = np.append(gaus3,gaus2) get_ipython().magic('matplotlib inline') plt.plot(gaus3) # In[ ]:
# coding: utf-8 # In[1]: import theano.tensor as T import theano import numpy as np import matplotlib.pyplot as plt x = np.arange(start=1,stop=100,step=1) xs = theano.shared(x) height_np = np.array([2,10,11]) height = theano.shared(height_np) mean_np = np.array([10,35,64]) mean = theano.shared(mean_np) variance_np= np.array([2,12,22]) variance = theano.shared(variance_np) bias_np = np.array([2,2,4]) bias = theano.shared(bias_np) def gaussian(height, mean, variance, bias, x): return (height * T.exp(-(T.sqr( x-mean) / (2*variance)))) + bias gaus_dist, updates = theano.scan( fn=gaussian, sequences=[height, mean, variance, bias], non_sequences=[xs], ) get_gaus = theano.function(inputs=[xs], outputs=gaus_dist, givens=[height, mean, variance, bias]) gaus3 = np.array([]) for xs in x: gaus1 = get_gaus(xs, height, mean, variance, bias) gaus2=0 for gaus_tmp in gaus1: gaus2=gaus2+gaus_tmp gaus3 = np.append(gaus3,gaus2) get_ipython().magic('matplotlib inline') plt.plot(gaus3) # In[ ]: