Search code examples
pythontheano

TypeError from theano While using 3D numpy array


I am trying something similar to code below

datax=theano.shared(value=rng.rand(5,500,45))
x=T.dmatrix('x')
i=T.lscalar('i')
W=theano.shared(value=rng.rand(90,45,500))
Hb=theano.shared(value=np.zeros(90))
w_v_bias=T.dot(W,x).sum(axis=2).sum(axis=1)+Hb
z=theano.function([i],w_v_bias,givens={x:datax[i*5:(i+1)*5]})

z(0)

Theano is giving me a TypeError with msg:

Cannot convert Type TensorType(float64, 3D) (of Variable Subtensor{int64:int64:}.0) into Type TensorType(float64, matrix). You can try to manually convert Subtensor{int64:int64:}.0 into a TensorType(float64, matrix)

What I am doing wrong here?

Edit

As mentioned by daniel changing x to dtensor3 will result in another error.

ValueError: Input dimension mis-match. (input[0].shape[1] = 5, input[1].shape[1] = 90)

Apply node that caused the error: Elemwise{add,no_inplace}(Sum{axis=[1], acc_dtype=float64}.0, DimShuffle{x,0}.0)

Another way is to modify my train function but then I won't be able to do batch learning.

  z=theano.function([x],w_v_bias)
  z(datax[0])

I am trying to implement RBM with integer values for visible units.


Solution

  • Solved it after few hit and trials.

    What I needed was to change

    x=T.dmatrix('x')
    w_v_bias=T.dot(W,x).sum(axis=2).sum(axis=1)+Hb 
    

    to

    x=T.dtensor3('x')
    w_v_bias=T.dot(x,W).sum(axis=3).sum(axis=1)+Hb
    

    Now it produces (5,90) array after adding Hb elementwise to each of the five vectors of dot product.