2016-07-15 101 views
0

嗨。我是Tensorflow的新手,并尝试使用CNN运行cifar10数据集。 我的网络与三层构成,例如错误:Tensorflow CNN尺寸

  1. 卷积+最大池
  2. 完全连接层
  3. SOFTMAX层

下面是模式的我tensorflow代码。

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 

输入图像具有[-1,32,32,3]的形状。(32 * 32像素,RGB)

由于最大池的过滤器是[1,2 ,2,1],步幅是[1,2,2,1],输出通道是5,

我认为最大池层和完全连接之间的权重形式(以下代码中的w2)层需要[5 * 16 * 16 * 3,125]。

(5:信道,16:32/2像素,3:RGB,125:输出神经元的#)

下面是参数的我的tensorflow代码。

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 

然而,它给我的错误,如下面。

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() 

我想问题是关于“W2”(最大池层和完全连接层之间重)的尺寸。另外,我无法理解6400是如何发生的。

如何修复错误?

请让我知道,如果信息很小。 谢谢!

回答

1

错误tensorflow.python.framework.errors.InvalidArgumentError: Input to reshape is a tensor with 6400 values, but the requested shape requires a multiple of 3840暗示的tf.reshape()行20中输入张量具有多个值,是不是3840

这是因为张l1没有功能model中定义的倍数(你可能已经使用它更早,它可能有6400个值)。您可能要设置l1=layer1。请注意张力l4也没有在函数model中定义。

请让我知道如果我的答案不能解决您的错误。