InvalidArgumentError:您必须使用dtype float和shape [1000,625]为占位符张量'Placeholder'提供值

时间:2016-06-27 14:07:26

标签: machine-learning neural-network tensorflow

尝试运行此代码时出现上述意外错误:

# -*- coding: utf-8 -*-
"""
Created on Fri Jun 24 10:38:04 2016

@author: andrea
"""

# pylint: disable=missing-docstring
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import time

from six.moves import xrange  # pylint: disable=redefined-builtin
import tensorflow as tf
from pylab import *
import argparse
import mlp

# Basic model parameters as external flags.
tf.app.flags.FLAGS = tf.python.platform.flags._FlagValues()
tf.app.flags._global_parser = argparse.ArgumentParser()
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 20, 'Number of steps to run trainer.')
flags.DEFINE_integer('batch_size', 1000, 'Batch size. Must divide evenly into the dataset sizes.')
flags.DEFINE_integer('num_samples', 100000, 'Total number of samples. Needed by the reader')
flags.DEFINE_string('training_set_file', 'godzilla_dataset_size625', 'Training set file')
flags.DEFINE_string('test_set_file', 'godzilla_testset_size625', 'Test set file')
flags.DEFINE_string('test_size', 1000, 'Test set size')


def placeholder_inputs(batch_size):

    images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, mlp.NUM_INPUT))
    labels_placeholder = tf.placeholder(tf.float32, shape=(batch_size, mlp.NUM_OUTPUT))
    return images_placeholder, labels_placeholder


def fill_feed_dict(data_set_file, images_pl, labels_pl):

    for l in range(int(FLAGS.num_samples/FLAGS.batch_size)):
        data_set = genfromtxt("../dataset/" + data_set_file, skip_header=l*FLAGS.batch_size, max_rows=FLAGS.batch_size)
        data_set = reshape(data_set, [FLAGS.batch_size, mlp.NUM_INPUT + mlp.NUM_OUTPUT])
        images = data_set[:, :mlp.NUM_INPUT]
        labels_feed = reshape(data_set[:, mlp.NUM_INPUT:], [FLAGS.batch_size, mlp.NUM_OUTPUT])
        images_feed = reshape(images, [FLAGS.batch_size, mlp.NUM_INPUT])

        feed_dict = {
            images_pl: images_feed,
            labels_pl: labels_feed,
        }

        yield feed_dict

def reader(data_set_file, images_pl, labels_pl):

    data_set = loadtxt("../dataset/" + data_set_file)
    images = data_set[:, :mlp.NUM_INPUT]
    labels_feed = reshape(data_set[:, mlp.NUM_INPUT:], [data_set.shape[0], mlp.NUM_OUTPUT])
    images_feed = reshape(images, [data_set.shape[0], mlp.NUM_INPUT])

    feed_dict = {
        images_pl: images_feed,
        labels_pl: labels_feed,
    }

    return feed_dict, labels_pl


def run_training():

    tot_training_loss = []
    tot_test_loss = []
    tf.reset_default_graph()
    with tf.Graph().as_default() as g:
        images_placeholder, labels_placeholder = placeholder_inputs(FLAGS.batch_size)    
        test_images_pl, test_labels_pl = placeholder_inputs(FLAGS.test_size)
        logits = mlp.inference(images_placeholder)      
        test_pred = mlp.inference(test_images_pl, reuse=True)
        loss = mlp.loss(logits, labels_placeholder)
        test_loss = mlp.loss(test_pred, test_labels_pl)
        train_op = mlp.training(loss, FLAGS.learning_rate)

        #summary_op = tf.merge_all_summaries()

        init = tf.initialize_all_variables()

        saver = tf.train.Saver()
        sess = tf.Session()
        #summary_writer = tf.train.SummaryWriter("./", sess.graph)

        sess.run(init)
        test_feed, test_labels_placeholder = reader(FLAGS.test_set_file, test_images_pl, test_labels_pl)

        # Start the training loop.
        for step in xrange(FLAGS.max_steps):
            start_time = time.time()
            feed_gen = fill_feed_dict(FLAGS.training_set_file, images_placeholder, labels_placeholder)
            i=1
            for feed_dict in feed_gen:
                _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)
                _, test_loss_val = sess.run([test_pred, test_loss], feed_dict=test_feed)
                tot_training_loss.append(loss_value)
                tot_test_loss.append(test_loss_val)
                #if i % 10 == 0:
                #print('%d minibatches analyzed...'%i)
                i+=1

            if step % 1 == 0:        
                duration = time.time() - start_time
                print('Epoch %d (%.3f sec):\n training loss = %f \n test loss = %f ' % (step, duration, loss_value, test_loss_val))

        predictions = sess.run(test_pred, feed_dict=test_feed)
        savetxt("predictions", predictions)
        savetxt("training_loss", tot_training_loss)
        savetxt("test_loss", tot_test_loss)
        plot(tot_training_loss)    
        plot(tot_test_loss)
        figure()
        scatter(test_feed[test_labels_placeholder], predictions)

  #plot([.4, .6], [.4, .6])

run_training()


#if __name__ == '__main__':
#  tf.app.run()

这是mlp:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import math

import tensorflow as tf

NUM_OUTPUT = 1
NUM_INPUT = 625
NUM_HIDDEN = 5

def inference(images, reuse=None):
    with tf.variable_scope('hidden1', reuse=reuse):
        weights = tf.get_variable(name='weights', shape=[NUM_INPUT, NUM_HIDDEN], initializer=tf.contrib.layers.xavier_initializer())
        weight_decay = tf.mul(tf.nn.l2_loss(weights), 0.00001, name='weight_loss')
        tf.add_to_collection('losses', weight_decay)
        biases = tf.Variable(tf.constant(0.0, name='biases', shape=[NUM_HIDDEN]))
        hidden1_output = tf.nn.relu(tf.matmul(images, weights)+biases, name='hidden1')

    with tf.variable_scope('output', reuse=reuse):
        weights = tf.get_variable(name='weights', shape=[NUM_HIDDEN, NUM_OUTPUT], initializer=tf.contrib.layers.xavier_initializer())
        weight_decay = tf.mul(tf.nn.l2_loss(weights), 0.00001, name='weight_loss')
        tf.add_to_collection('losses', weight_decay)
        biases = tf.Variable(tf.constant(0.0, name='biases', shape=[NUM_OUTPUT]))
        output = tf.nn.relu(tf.matmul(hidden1_output, weights)+biases, name='output')

    return output

def loss(outputs, labels):

  rmse = tf.sqrt(tf.reduce_mean(tf.square(tf.sub(labels, outputs))), name="rmse")
  tf.add_to_collection('losses', rmse)
  return tf.add_n(tf.get_collection('losses'), name='total_loss')


def training(loss, learning_rate):

  tf.scalar_summary(loss.op.name, loss)
  optimizer = tf.train.GradientDescentOptimizer(learning_rate)
  global_step = tf.Variable(0, name='global_step', trainable=False)
  train_op = optimizer.minimize(loss, global_step=global_step)
  return train_op

这里的错误:

Traceback (most recent call last):

  File "<ipython-input-1-f16dfed3b99b>", line 1, in <module>
    runfile('/home/andrea/test/python/main_mlp_yield.py', wdir='/home/andrea/test/python')

  File "/usr/local/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)

  File "/usr/local/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 81, in execfile
    builtins.execfile(filename, *where)

  File "/home/andrea/test/python/main_mlp_yield.py", line 127, in <module>
    run_training()

  File "/home/andrea/test/python/main_mlp_yield.py", line 105, in run_training
    _, test_loss_val = sess.run([test_pred, test_loss], feed_dict=test_feed)

  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 372, in run
    run_metadata_ptr)

  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 636, in _run
    feed_dict_string, options, run_metadata)

  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 708, in _do_run
    target_list, options, run_metadata)

  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 728, in _do_call
    raise type(e)(node_def, op, message)

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [1000,625]
     [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[1000,625], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
Caused by op u'Placeholder', defined at:
  File "/usr/local/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/start_ipython_kernel.py", line 205, in <module>
    __ipythonkernel__.start()
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelapp.py", line 442, in start
    ioloop.IOLoop.instance().start()
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/ioloop.py", line 162, in start
    super(ZMQIOLoop, self).start()
  File "/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py", line 883, in start
    handler_func(fd_obj, events)
  File "/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py", line 440, in _handle_events
    self._handle_recv()
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py", line 472, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py", line 414, in _run_callback
    callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py", line 276, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py", line 228, in dispatch_shell
    handler(stream, idents, msg)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py", line 391, in execute_request
    user_expressions, allow_stdin)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/ipkernel.py", line 199, in do_execute
    shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2723, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2831, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2885, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-f16dfed3b99b>", line 1, in <module>
    runfile('/home/andrea/test/python/main_mlp_yield.py', wdir='/home/andrea/test/python')
  File "/usr/local/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)
  File "/usr/local/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 81, in execfile
    builtins.execfile(filename, *where)
  File "/home/andrea/test/python/main_mlp_yield.py", line 127, in <module>
    run_training()
  File "/home/andrea/test/python/main_mlp_yield.py", line 79, in run_training
    images_placeholder, labels_placeholder = placeholder_inputs(FLAGS.batch_size)
  File "/home/andrea/test/python/main_mlp_yield.py", line 37, in placeholder_inputs
    images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, mlp.NUM_INPUT))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/array_ops.py", line 895, in placeholder
    name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 1238, in _placeholder
    name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2260, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1230, in __init__
    self._traceback = _extract_stack()

我真的不明白为什么。在我看来,在使用它们之前,我正在为所有占位符提供食物。我还删除了“merge_all_summaries”,因为此问题类似于其他(thisthis),但它没有帮助

编辑:培训数据:100000个样本x 625个功能 测试数据:1000个样本x 625个功能 NUM。输出:1

1 个答案:

答案 0 :(得分:5)

我认为问题在于此代码:

def loss(outputs, labels):
  rmse = tf.sqrt(tf.reduce_mean(tf.square(tf.sub(labels, outputs))), name="rmse")
  tf.add_to_collection('losses', rmse)
  return tf.add_n(tf.get_collection('losses'), name='total_loss')

您将收集“损失”中的所有损失加起来,包括您的培训和测试损失。特别是在这段代码中:

loss = mlp.loss(logits, labels_placeholder)
test_loss = mlp.loss(test_pred, test_labels_pl)

对mlp.loss的第一次调用将为'损失'收集增加训练损失。对mlp.loss的第二次调用将在结果中包含这些值。因此,当您尝试计算test_loss时,Tensorflow会抱怨您没有提供所有输入(培训占位符)。

也许你的意思是这样的?

def loss(outputs, labels):
  rmse = tf.sqrt(tf.reduce_mean(tf.square(tf.sub(labels, outputs))), name="rmse")
  return rmse

我希望有所帮助!