Error: Tensorflow CNN dimension

旧城冷巷雨未停 提交于 2019-12-25 08:09:11

问题


Hi. I'm new to Tensorflow and trying to run cifar10 dataset with CNN. My Network is constructed with three layers such as

  1. Convolution + Max Pooling
  2. Fully Connected Layer
  3. Softmax Layer

Below is my tensorflow code of the model.

15 def model(X, w, w2, w_o, p_keep_conv, p_keep_hidden):
16 
17     layer1 = tf.nn.relu(tf.nn.conv2d(X, w,strides=[1, 1, 1, 1], padding='SAME'))
18     layer1 = tf.nn.max_pool(l1, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
19 
20     layer1 = tf.reshape(l1,[-1,w2.get_shape().as_list()[0]])
21     layer1 = tf.nn.dropout(l1, p_keep_conv)
22 
23     layer2 = tf.nn.relu(tf.matmul(layer1, w2))
24     layer2 = tf.nn.dropout(l4, p_keep_hidden)
25 
26     pyx = tf.matmul(layer2, w_o)
27     return pyx
28 

The input image has [-1, 32, 32, 3] shape.(32*32 pixel, RGB)

Since the filter of max pooling is [1,2,2,1], the stride is [1,2,2,1] and the output channel is 5,

I think the form of weight (w2 in below code) between max pooling layer and fully connected layer need to be [5*16*16*3, 125].

(5: channels, 16: 32/2 pixel, 3: rgb, 125: # of output neuron)

Below is my tensorflow code of the parameters.

60 trX = trX.reshape(-1, 32, 32, 3)  # 32x32x3 input img
61 teX = teX.reshape(-1, 32, 32, 3)  # 32x32x3 input img
62 
63 X = tf.placeholder("float", [None, 32, 32, 3])
64 Y = tf.placeholder("float", [None, 10])
65 
66 w = init_weights([5, 5, 3, 5])
67 w2 = init_weights([5*16*16*3, 125])
68 w_o = init_weights([125, 10])
69 
70 p_keep_conv = tf.placeholder("float")
71 p_keep_hidden = tf.placeholder("float")
72 
73 py_x = model(X, w, w2, w_o, p_keep_conv, p_keep_hidden)
74 
75 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y))
76 #train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)
77 train_op = tf.train.AdamOptimizer(1e-4).minimize(cost)
78 predict_op = tf.argmax(py_x, 1)
79 

However it show me an error like below.

Traceback (most recent call last):

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 715, in _do_call

return fn(*args)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 697, in _run_fn

status, run_metadata)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/contextlib.py", line 66, in __exit__

next(self.gen)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/framework/errors.py", line 450, in raise_exception_on_not_ok_status

pywrap_tensorflow.TF_GetCode(status))

tensorflow.python.framework.errors.InvalidArgumentError: Input to reshape is a tensor with 6400 values, but the requested shape requires a multiple of 3840

[[Node: Reshape = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool, Reshape/shape)]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "convCifar.py", line 99, in <module>

p_keep_conv: 0.8, p_keep_hidden: 0.5})

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 372, in run

run_metadata_ptr)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 636, in _run

feed_dict_string, options, run_metadata)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 708, in _do_run

target_list, options, run_metadata)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 728, in _do_call

raise type(e)(node_def, op, message)

tensorflow.python.framework.errors.InvalidArgumentError: Input to reshape is a tensor with 6400 values, but the requested shape requires a multiple of 3840

[[Node: Reshape = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool, Reshape/shape)]]

Caused by op 'Reshape', defined at:

File "convCifar.py", line 82, in <module>

py_x = model(X, w, w4, w_o, p_keep_conv, p_keep_hidden)

File "convCifar.py", line 27, in model

l1 = tf.reshape(l1,[-1,w4.get_shape().as_list()[0]])

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1383, in reshape

name=name)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op

op_def=op_def)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/framework/ops.py", line 2260, in create_op

original_op=self._default_original_op, op_def=op_def)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/framework/ops.py", line 1230, in __init__

self._traceback = _extract_stack()

I think the problem is about the dimension of "w2"(weight between max pooling layer and fully connected layer). Also, I can not understand How the 6400 can be occurred.

How can fix the error?

Please let me know if the information is small. Thank you!


回答1:


The error tensorflow.python.framework.errors.InvalidArgumentError: Input to reshape is a tensor with 6400 values, but the requested shape requires a multiple of 3840 suggests that the input tensor of tf.reshape() in line 20 has a number of values that is not a multiple of 3840.

That's because tensor l1 isn't defined within function model (you might have used it earlier and it might have 6400 values). You probably want to set l1=layer1. Note that tensor l4 isn't defined in function model either.

Please, let me know if my answer doesn't solve your error.



来源:https://stackoverflow.com/questions/38397258/error-tensorflow-cnn-dimension

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