Theano Cost Function, TypeError: Unknown parameter type: <class 'numpy.ndarray'>

做~自己de王妃 提交于 2019-12-12 04:48:26

问题


I'm new to Theano, just learning it. I have a ANN in python that I'm implementing in Theano as learning process. I'm using Spyder.

And Theano throws out an error: TypeError: Unknown parameter type: class 'numpy.ndarray'

I'm not sure where the error is. Is it in the cost function or in the gradient descent? And what is the typical reason for it?

Here is my code:

X = T.dmatrix()
y = T.dmatrix()

X_input = np.genfromtxt('X.csv',delimiter=',') #5000x195
y_input = np.genfromtxt('y.csv',delimiter=',')  #5000x75

input_layer_size, hidden_layer_size_1, hidden_layer_size_2, y_size = 195, 15, 15, 75

theta1 = theano.shared(np.array(np.random.rand(hidden_layer_size_1, (input_layer_size+1)), dtype=theano.config.floatX))
theta2 = theano.shared(np.array(np.random.rand(hidden_layer_size_2, (hidden_layer_size_1+1)), dtype=theano.config.floatX))
theta3 = theano.shared(np.array(np.random.rand(y_size, hidden_layer_size_2+1), dtype=theano.config.floatX))

def computeCost(X, y, w1, w2, w3):
    m = X.shape[0]
    b = T.ones((m,1))
    a_1 = T.concatenate([b, X], axis=1)
    z_2 = T.dot(a_1, T.transpose(w1))
    a_2 = T.nnet.nnet.sigmoid(z_2)
    a_2 = T.concatenate([b, a_2], axis=1)
    z_3 = T.dot(a_2, T.transpose(w2))
    a_3 = T.nnet.nnet.sigmoid(z_3)
    a_3 = T.concatenate([b, a_3], axis=1)
    z_4 = T.dot(a_3, T.transpose(w3))
    h   = T.nnet.nnet.sigmoid(z_4)
    cost = T.sum(-y * T.log(h) - (1-y) * T.log(1-h))/m
    return cost

fc = computeCost(X, y, theta1, theta2, theta3)

def grad_desc(cost, theta):
    alpha = 0.1 #learning rate
    return theta - (alpha * T.grad(cost, wrt=theta))

cost = theano.function(inputs=[X_input, y_input], outputs=fc, updates=[
        (theta1, grad_desc(fc, theta1)),
        (theta2, grad_desc(fc, theta2)),
        (theta3, grad_desc(fc, theta3))])

My last code generated this error:

Traceback (most recent call last):

  File "ipython-input-88-099323f95e73", line 1, in <module>
cost = theano.function(inputs=[X_input, y_input], outputs=fc, updates=[(theta1, grad_desc(fc, theta1)), (theta2, grad_desc(fc, theta2)), (theta3, grad_desc(fc, theta3))])


  File "C:\Program Files\Anaconda3\lib\site-packages\theano\compile\function.py", line 320, in function
output_keys=output_keys)

  File "C:\Program Files\Anaconda3\lib\site-packages\theano\compile\pfunc.py", line 390, in pfunc
for p in params]

  File "C:\Program Files\Anaconda3\lib\site-packages\theano\compile\pfunc.py", line 390, in <listcomp>
for p in params]

  File "C:\Program Files\Anaconda3\lib\site-packages\theano\compile\pfunc.py", line 489, in _pfunc_param_to_in
raise TypeError('Unknown parameter type: %s' % type(param))

TypeError: Unknown parameter type: class 'numpy.ndarray'

回答1:


In your theano.function your inputs are numpy arrays (X_input and y_input). You want the inputs to be symbolic variables, such as:

cost = theano.function(inputs=[X, y], outputs=fc, updates=[

This will create a function which can be called with numpy arrays to perform the actual computation, as in:

actual_cost = cost(X_input, y_input)


来源:https://stackoverflow.com/questions/42820528/theano-cost-function-typeerror-unknown-parameter-type-class-numpy-ndarray

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!