Hi, everyone:
I am writing CNN code but there is an error when I compute T.grad in the
Theano. Hopefully you can help me to analysis it. I don't know why there is
an error and how should I modify it. If you can help me, I will be
appreciate of you! Here is some details of dataset. There is a lot of
images which has R,G,B for each. And both width and height of each image
are 50. I am waiting for your reply :)
Here is my code
# function definition for CNN
srng = RandomStreams()
def floatX(X):
return np.asarray(X, dtype=theano.config.floatX)
def init_weights(shape):
return theano.shared(floatX(np.random.randn(*shape) * 0.01))
def dropout(X, p_use=1.):
if p_use < 1:
p_sampled = srng.binomial(p=p_use, n=1, size=X.shape,
dtype=theano.config.floatX)
X = X * p_sampled / p_use
return X
def rectify(X):
return T.maximum(X, 0.)
def PRelu(X,a):
return T.maximum(X, 0.) + a * T.minimum(X, 0.)
def softmax(X):
e_x = T.exp(X - X.max(axis=1).dimshuffle(0, 'x'))
print e_x
return e_x / e_x.sum(axis=1).dimshuffle(0, 'x')
def RMSprop(cost, params, lr=0.001, rho=0.9, epsilon=1e-6):
grads = T.grad(cost=cost, wrt=params)
updates = []
for p, g in zip(params, grads):
acc = theano.shared(p.get_value() * 0.)
acc_new = rho * acc + (1 - rho) * g ** 2
gradient_scaling = T.sqrt(acc_new + epsilon)
g = g / gradient_scaling
updates.append((acc, acc_new))
updates.append((p, p - lr * g))
return updates
# model building
X = T.ftensor4('x')
Y = T.fmatrix('y')
# parameters initialization
X_train = X_train.reshape(-1, 3, 50, 50)
X_test = X_test.reshape(-1, 3, 50, 50)
W_conv1 = init_weights((4, 3, 5, 5))
b_conv1 = np.zeros((4,))
W_conv2 = init_weights((6, 4, 3, 3))
b_conv2 = np.zeros((6,))
W_fcn = init_weights((54, 70))
b_fcn = np.zeros((70,))
W_fcn2 = init_weights((70, 43))
b_fcn2 = np.zeros((43,))
# convolution and pooling
maxpool_shape = (2, 2)
p_drop_input = 0.8
conv_layer1 = rectify(conv2d(X_train, W_conv1, border_mode='full'))
subsampling_layer1 = pool_2d(conv_layer1, maxpool_shape, ignore_border=True)
out_layer1 = subsampling_layer1
out_layer1 = dropout(subsampling_layer1, p_drop_input)
p_drop_hidden = 0.6
conv_layer2 = rectify(conv2d(out_layer1, W_conv2, border_mode='valid'))
subsampling_layer2 = pool_2d(conv_layer2, maxpool_shape, ignore_border=True)
out_layer2 = dropout(subsampling_layer2, p_drop_hidden)
conv_out = T.flatten(out_layer2, outdim = 2)
# fully connected NN
hidden = rectify(T.dot(conv_out, W_fcn))
hidden = dropout(hidden, p_drop_hidden)
py_x = softmax(T.dot(hidden, W_fcn2))
y_x = T.argmax(py_x, axis=1)
# compute cost and update
cost = T.mean(T.nnet.categorical_crossentropy(py_x , Y))
params = [W_conv1, W_conv2, W_fcn, W_fcn2]
print cost
print params
updates = RMSprop(cost, params, lr=0.001)
And the error is that:
Traceback (most recent call last):
File "/PycharmProjects/CNN/CNN.py", line 180, in <module>
updates = RMSprop(cost, params, lr=0.001)
File "/PycharmProjects/CNN/CNN.py", line 116, in RMSprop
grads = T.grad(cost=cost, wrt=params)
File "/Library/Python/2.7/site-packages/theano/gradient.py", line 561, in grad
grad_dict, wrt, cost_name)
File "/Library/Python/2.7/site-packages/theano/gradient.py", line 1324, in
_populate_grad_dict
rval = [access_grad_cache(elem) for elem in wrt]
File "/Library/Python/2.7/site-packages/theano/gradient.py", line 1279, in
access_grad_cache
term = access_term_cache(node)[idx]
File "/Library/Python/2.7/site-packages/theano/gradient.py", line 1113, in
access_term_cache
input_grads = node.op.grad(inputs, new_output_grads)
File "/Library/Python/2.7/site-packages/theano/tensor/nnet/abstract_conv.py",
line 828, in grad
d_bottom = bottom.type.filter_variable(d_bottom)
File "/Library/Python/2.7/site-packages/theano/tensor/type.py", line 233, in
filter_variable
self=self))
TypeError: Cannot convert Type TensorType(float64, 4D) (of Variable
AbstractConv2d_gradInputs{border_mode='full', subsample=(1, 1),
filter_flip=True, imshp=(None, None, None, None), kshp=(None, None, None,
None)}.0) into Type TensorType(int64, 4D). You can try to manually convert
AbstractConv2d_gradInputs{border_mode='full', subsample=(1, 1),
filter_flip=True, imshp=(None, None, None, None), kshp=(None, None, None,
None)}.0 into a TensorType(int64, 4D).
Process finished with exit code 1
--
---
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 [email protected].
For more options, visit https://groups.google.com/d/optout.