Tensorflow CNN错误:形状[-1,784]具有负尺寸?

时间:2017-07-12 13:43:19

标签: python-3.x tensorflow

我是Tensorflow的新手,并试图与CNN一起运行mnist数据集。我的网络构建如

  1. 2 Convolution + Max Pooling
  2. 完全连接的图层
  3. Softmax层 下面是我的模型的张量流代码。
  4. def weight_variable(shape):
        initial = tf.truncated_normal(shape, stddev=0.1)
        return tf.Variable(initial)
    
    def bias_variable(shape):
        initial = tf.constant(0.1, shape=shape)
        return tf.Variable(initial)
    
    def conv2d(x, W):
        return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    
    def max_pool_2x2(x):
        return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    
    
    mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
    sess = tf.InteractiveSession()
    x = tf.placeholder(tf.float32, [None, 784])
    y_ = tf.placeholder(tf.float32, [None, 10])
    x_image = tf.reshape(x, [-1 , 28, 28, 1])
    
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    
    W_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    
    keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.arg_max(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
    tf.global_variables_initializer().run()
    for i in range(20000):
        batch_xs, batch_ys = mnist.train.next_batch(50)
        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_xs, y_: batch_ys, keep_prob: 1.0})
            print('step {:d}, training accuracy {:g}'.format(i, train_accuracy))
        train_step.run(feed_dict={x: batch_xs, y_: batch_ys, keep_prob: 0.5})
    

    以下是堆栈信息:

    ---------------------------------------------------------------------------
    InvalidArgumentError                      Traceback (most recent call last)
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
       1138     try:
    -> 1139       return fn(*args)
       1140     except errors.OpError as e:
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run_fn(session, feed_dict, 
    
    fetch_list, target_list, options, run_metadata)
       1120                                  feed_dict, fetch_list, target_list,
    -> 1121                                  status, run_metadata)
       1122 
    
    /home/lv/anaconda3/lib/python3.6/contextlib.py in __exit__(self, type, value, traceback)
         88             try:
    ---> 89                 next(self.gen)
         90             except StopIteration:
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py in 
    
    raise_exception_on_not_ok_status()
        465           compat.as_text(pywrap_tensorflow.TF_Message(status)),
    --> 466           pywrap_tensorflow.TF_GetCode(status))
        467   finally:
    
    InvalidArgumentError: Shape [-1,784] has negative dimensions
         [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[?,784], 
    
    _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
    
    During handling of the above exception, another exception occurred:
    
    InvalidArgumentError                      Traceback (most recent call last)
    <ipython-input-32-d670cfa25269> in <module>()
          4 #        train_accuracy = accuracy.eval(feed_dict={x: batch_xs, y_: batch_ys, keep_prob: 1.0})
          5 #        print('step {:d}, training accuracy {:g}'.format(i, train_accuracy))
    ----> 6     train_step.run(feed_dict={x: batch_xs, y_: batch_ys, keep_prob: 0.5})
          7 
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in run(self, feed_dict, session)
       1704         none, the default session will be used.
       1705     """
    -> 1706     _run_using_default_session(self, feed_dict, self.graph, session)
       1707 
       1708 
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in _run_using_default_session
    
    (operation, feed_dict, graph, session)
       3961                        "the operation's graph is different from the session's "
       3962                        "graph.")
    -> 3963   session.run(operation, feed_dict)
       3964 
       3965 
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, 
    
    options, run_metadata)
        787     try:
        788       result = self._run(None, fetches, feed_dict, options_ptr,
    --> 789                          run_metadata_ptr)
        790       if run_metadata:
        791         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, 
    
    feed_dict, options, run_metadata)
        995     if final_fetches or final_targets:
        996       results = self._do_run(handle, final_targets, final_fetches,
    --> 997                              feed_dict_string, options, run_metadata)
        998     else:
        999       results = []
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_run(self, handle, target_list, 
    
    fetch_list, feed_dict, options, run_metadata)
       1130     if handle is None:
       1131       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
    -> 1132                            target_list, options, run_metadata)
       1133     else:
       1134       return self._do_call(_prun_fn, self._session, handle, feed_dict,
    
    /home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
       1150         except KeyError:
       1151           pass
    -> 1152       raise type(e)(node_def, op, message)
       1153 
       1154   def _extend_graph(self):
    
    InvalidArgumentError: Shape [-1,784] has negative dimensions
         [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[?,784], 
    
    _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
    
    Caused by op 'Placeholder', defined at:
      File "/home/lv/anaconda3/lib/python3.6/runpy.py", line 193, in _run_module_as_main
        "__main__", mod_spec)
      File "/home/lv/anaconda3/lib/python3.6/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py", line 3, in <module>
        app.launch_new_instance()
      File "/home/lv/anaconda3/lib/python3.6/site-packages/traitlets/config/application.py", line 658, in launch_instance
        app.start()
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 474, in start
        ioloop.IOLoop.instance().start()
      File "/home/lv/anaconda3/lib/python3.6/site-packages/zmq/eventloop/ioloop.py", line 177, in start
        super(ZMQIOLoop, self).start()
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tornado/ioloop.py", line 887, in start
        handler_func(fd_obj, events)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tornado/stack_context.py", line 275, in null_wrapper
        return fn(*args, **kwargs)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/zmq/eventloop/zmqstream.py", line 440, in _handle_events
        self._handle_recv()
      File "/home/lv/anaconda3/lib/python3.6/site-packages/zmq/eventloop/zmqstream.py", line 472, in _handle_recv
        self._run_callback(callback, msg)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/zmq/eventloop/zmqstream.py", line 414, in _run_callback
        callback(*args, **kwargs)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tornado/stack_context.py", line 275, in null_wrapper
        return fn(*args, **kwargs)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/kernelbase.py", line 276, in dispatcher
        return self.dispatch_shell(stream, msg)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/kernelbase.py", line 228, in dispatch_shell
        handler(stream, idents, msg)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/kernelbase.py", line 390, in execute_request
        user_expressions, allow_stdin)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/ipkernel.py", line 196, in do_execute
        res = shell.run_cell(code, store_history=store_history, silent=silent)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/ipykernel/zmqshell.py", line 501, in run_cell
        return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2717, in run_cell
        interactivity=interactivity, compiler=compiler, result=result)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2821, in run_ast_nodes
        if self.run_code(code, result):
      File "/home/lv/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2881, in run_code
        exec(code_obj, self.user_global_ns, self.user_ns)
      File "<ipython-input-5-c7318338c904>", line 1, in <module>
        x = tf.placeholder(tf.float32, [None, 784])
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 1530, in placeholder
        return gen_array_ops._placeholder(dtype=dtype, shape=shape, name=name)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1954, in 
    
    _placeholder
        name=name)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 767, in 
    
    apply_op
        op_def=op_def)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 2506, in create_op
        original_op=self._default_original_op, op_def=op_def)
      File "/home/lv/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1269, in __init__
        self._traceback = _extract_stack()
    
    InvalidArgumentError (see above for traceback): Shape [-1,784] has negative dimensions
         [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[?,784], 
    
    _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
    

    那么,问题是什么?有人能帮助我吗?很多。

2 个答案:

答案 0 :(得分:1)

sry,这是我的坏,我只是重新运行整个代码,它工作正常。= =啊哈,我记得我之前运行tf.global_variables_initializer().run()两次,这似乎是造成错误的原因,我猜。

答案 1 :(得分:0)

当您使用代码tensor.eval()时,某些宣传者不支持方法tf.placeholder()
如果您不使用这些张量.eval(),则不会出现错误。