I'll answer my own question. I've figured out where the error was.

1. I had to explicitly define the symbolic variables as type float32
e..g X = T.fmatrix('X').astype(dtype=float32)

Which is really a bummer if you ask me, I thought the whole point of having 
a .theanorc file and defining your type as float32 was to remove the 
redundancy to explicitly define the variables as float32 let alone the 
operations such mean() and sum() where you also have to define the data 
type as float32.

2. the other change was to either cast the data type to float32 during the 
input to the predict() function or explicitly define the flag 
allow_input_downcast to True in the theano.function(), or both.

I would really like to define the type once only in your .theanorc for 
instance and everything else to take care of itself. So that we could focus 
on higher more abstract cognitive tasks rather than to always keep thinking 
what does that variable cast to?

I hope that the theano developers can have a look on that and possibly add 
it as an enhancement in the next release.
I would also love to see some refactoring to the library since as a user it 
feels a little cluttered to me. (I'm not trying to be judgmental, don't 
take this the wrong way!)
Finally I would love to have support for newer compilers e.g. (gcc6, 
icc/icpc) and libraries e.g. intel-mkl.

My thanks to the community. Keep up the good work!

On Tuesday, September 20, 2016 at 2:29:58 PM UTC+1, martin.de...@gmail.com 
> Hi everyone I've been some trouble lately trying to understand why the 
> hell theano keeps changing my variable types without being explicitly 
> instructed to do so.
> I've enforced in my .theanorc to use float32 and also to raise any warning 
> in case of use float64 via the flag warn_float64=raise.
> Here is a minimal example which I cannot understand where the change of 
> variable type is coming from.
> import numpy as np
> import theano
> from theano import tensor as T
> floatX = theano.config.floatX
> N = 400                                   
> feats = 784                               
> n_classes = 2
> D = (np.random.randn(N, feats), np.random.randint(size=N, low=0, high=2))
> training_steps = 10000
> X = T.fmatrix("X")
> y = T.ivector("y")
> W = theano.shared(np.random.randn(feats, n_classes).astype(dtype=floatX),
>                   name="W")
> b = theano.shared(np.zeros(W.get_value().shape[1]).astype(dtype=floatX),
>                   name="b")
> p_1 = 1./(1 + T.exp(-T.dot(X, W) - b))
> prediction = p_1 > 0.5
> cost = T.mean(-y * T.log(p_1) - (1-y) * T.log(1-p_1),
>               dtype=floatX, acc_dtype=floatX)
> cost += 0.01 * T.sum(W ** 2, dtype=floatX)
> gW, gb = T.grad(cost, [W, b])
> train = theano.function(inputs=[X, y], outputs=[prediction, cost],
>                         updates=((W, W - 0.1 * gW), (b, b - 0.1 * gb)))
> predict = theano.function(inputs=[X], outputs=prediction)
> for i in range(training_steps):
>     pred, err = train(D[0], D[1])
> print("Final model:")
> print(W.get_value())
> print(b.get_value())
> print("target values for D:")
> print(D[1])
> print("prediction on D:")
> print(predict(D[0]))
> I always get an exception:
> Exception: You are creating a TensorVariable with float64 dtype. You 
> requested an action via the Theano flag 
> warn_float64={ignore,warn,raise,pdf}.
> Which points to the cost regarding the cross entropy error. 
> But I've explicitly told to use float32 both for the inner summation 
> calculation in mean operator and and also to cast the output as float32.
> I don't understand where this exception is coming from?
> Pretty much everything as been set up to float32.
> Any help much appreciated?


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.

Reply via email to