InvalidArguementError 张量流

InvalidArguementError tensorflow

我对tensorflow比较陌生,正在研究关系分类。我将逐步列出我的问题,以便清楚,并希望有人能指出我的错误(我确定这一定是一个愚蠢的错误):

  1. 对于词嵌入层,我需要用一个大小超过 2GB 的张量来初始化一个 tf 变量。所以我按照提供的解决方案 更改了我的代码。

更改前的代码片段:

train.py

    if FLAGS.model_type == 'cnn':
        with tf.Graph().as_default():
        session_conf = tf.ConfigProto(
                           allow_soft_placement=FLAGS.allow_soft_placement,
                           log_device_placement=FLAGS.log_device_placement)
        sess = tf.Session(config=session_conf)
        with sess.as_default():
            cnn = textCNN(
                      sequence_length=x_trains[0].shape[1],
                      num_classes=num_classes,
                      vocab_size=len(word_embed_vecs),
                      embedding_size=FLAGS.embedding_dim,
                      dist_vocab_size=dist_vocab_size,
                      dist_size=FLAGS.pos_dim,
                      filter_sizes=list(map(int, 
                      FLAGS.filter_sizes.split(","))),
                      num_filters=FLAGS.num_filters,
                      l2_reg_lambda=FLAGS.l2_reg_lambda,
                      word_vecs=word_embed_vecs, #word_embed_vecs is of shape 
                                                 #(2451510, 300)
                      train_emb=FLAGS.train_emb)

text_cnn.py

    class textCNN(object):
    """
    A CNN for text classification.
    Uses an embedding layer, followed by a convolutional, max-pooling and 
    softmax layer.
    """
    def __init__(
      self, sequence_length, num_classes, vocab_size,
      embedding_size, dist_vocab_size, dist_size, filter_sizes, num_filters, 
      l2_reg_lambda=0.0, word_vecs=None, train_emb=True):

        # Placeholders for input, output and dropout
        self.input_x = tf.placeholder(tf.int32, [None, sequence_length], 
                           name="input_x")
        self.e1_dist = tf.placeholder(tf.int32, [None, sequence_length], 
                           name="e1_dist")
        self.e2_dist = tf.placeholder(tf.int32, [None, sequence_length], 
                           name="e2_dist")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], 
                           name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, 
                           name="dropout_keep_prob")
        l2_loss = tf.constant(0.0)

    # Embedding layer
    with tf.device('/gpu:0'), tf.name_scope("embedding"):
    #with tf.name_scope("embedding"):
        self.W = tf.Variable(
            trainable=train_emb,
            initial_value=tf.constant(word_vecs, dtype=tf.float32), name="W")
        self.embedded_chars = tf.nn.embedding_lookup(self.W, self.input_x)
        self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, 
                                           -1)

更改后的代码片段:

train.py

    if FLAGS.model_type == 'cnn':
        with tf.Graph().as_default():
        session_conf = tf.ConfigProto(
                           allow_soft_placement=FLAGS.allow_soft_placement,
                           log_device_placement=FLAGS.log_device_placement)
        sess = tf.Session(config=session_conf)
        with sess.as_default():
            cnn = textCNN(
                      sequence_length=x_trains[0].shape[1],
                      num_classes=num_classes,
                      vocab_size=len(word_embed_vecs),
                      embedding_size=FLAGS.embedding_dim,
                      dist_vocab_size=dist_vocab_size,
                      dist_size=FLAGS.pos_dim,
                      filter_sizes=list(map(int, 
                      FLAGS.filter_sizes.split(","))),
                      num_filters=FLAGS.num_filters,
                      l2_reg_lambda=FLAGS.l2_reg_lambda,
                      **# word_vecs=word_embed_vecs, #word_embed_vecs is of 
                                                  shape (2451510, 300)**
                      train_emb=FLAGS.train_emb)

    # Generate batches
    dev_f1s = []
    test_f1s = []
    for fi in range(len(x_trains)):
        sess.run(tf.global_variables_initializer())
        batches = data_helpers.batch_iter(
            list(zip(x_trains[fi], train_e1_dists[fi], train_e2_dists[fi], 
            y_trains[fi])), FLAGS.batch_size, FLAGS.embedding_dim, 
            FLAGS.num_epochs)

        # Training loop. For each batch...
        evaluate_every = len(x_trains[fi]) / FLAGS.batch_size
        for batch in batches:
            x_batch, e1_dist, e2_dist, y_batch = zip(*batch)

            # Train
            feed_dict = {
                cnn.input_x: x_batch,
                cnn.e1_dist: e1_dist,
                cnn.e2_dist: e2_dist,
                cnn.input_y: y_batch,
                cnn.dropout_keep_prob: FLAGS.dropout_keep_prob,
                cnn.wordvecs: word_embed_vecs
            }
            _, step, summaries, loss, accuracy = sess.run(
                [train_op, global_step, train_summary_op, cnn.loss, 
                 cnn.accuracy], feed_dict)

text_cnn.py

    class textCNN(object):
    """
    A CNN for text classification.
    Uses an embedding layer, followed by a convolutional, max-pooling and 
    softmax layer.
    """
    def __init__(
      self, sequence_length, num_classes, vocab_size,
      embedding_size, dist_vocab_size, dist_size, filter_sizes, num_filters, 
      l2_reg_lambda=0.0, train_emb=True):

        # Placeholders for input, output and dropout
        self.input_x = tf.placeholder(tf.int32, [None, sequence_length], 
                           name="input_x")
        self.e1_dist = tf.placeholder(tf.int32, [None, sequence_length], 
                           name="e1_dist")
        self.e2_dist = tf.placeholder(tf.int32, [None, sequence_length], 
                           name="e2_dist")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], 
                           name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, 
                           name="dropout_keep_prob")
        self.wordvecs = tf.placeholder(tf.float32, shape = (2451510, 300), 
                           name = "wordvecs")
        l2_loss = tf.constant(0.0)

    # Embedding layer
    with tf.device('/gpu:0'), tf.name_scope("embedding"):
    #with tf.name_scope("embedding"):
        #self.W = tf.Variable(
        #    trainable=False,
        #    initial_value=tf.constant(word_vecs, dtype=tf.float32), 
        #                 name="W")
        self.WordVecs = tf.Variable(trainable = False, 
            initial_value=self.wordvecs, name="WordVecs")
        self.embedded_chars = tf.nn.embedding_lookup(self.WordVecs, 
            self.input_x)
        self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, 
                                           -1)

所以基本上我添加了一个嵌入向量形状的占位符,并在调用 sess.run 时将其传递到 feeddict 中。但是我收到了 InvalidArguementError。追溯详情如下:

    Traceback (most recent call last):
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/client/session.py", line 1323, in _do_call
      return fn(*args)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/client/session.py", line 1302, in _run_fn
      status, run_metadata)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/framework/errors_impl.py", line 473, in 
      __exit__
      c_api.TF_GetCode(self.status.status))
    tensorflow.python.framework.errors_impl.InvalidArgumentError: You must 
    feed a value for placeholder tensor 'wordvecs' with dtype float and shape 
    [2451510,300]
     [[Node: wordvecs = Placeholder[dtype=DT_FLOAT, shape=[2451510,300], 
    _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "train.py", line 470, in <module>
      tf.app.run()
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/platform/app.py", line 48, in run
      _sys.exit(main(_sys.argv[:1] + flags_passthrough))
    File "train.py", line 466, in main
      train()
    File "train.py", line 407, in train
      sess.run(tf.global_variables_initializer())
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/client/session.py", line 889, in run
      run_metadata_ptr)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/client/session.py", line 1120, in _run
      feed_dict_tensor, options, run_metadata)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/client/session.py", line 1317, in _do_run
      options, run_metadata)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/client/session.py", line 1336, in _do_call
      raise type(e)(node_def, op, message)
    tensorflow.python.framework.errors_impl.InvalidArgumentError: You must 
    feed a value for placeholder tensor 'wordvecs' with dtype float and shape 
    [2451510,300]
     [[Node: wordvecs = Placeholder[dtype=DT_FLOAT, shape=[2451510,300], 
      _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

    Caused by op 'wordvecs', defined at:
    File "train.py", line 470, in <module>
      tf.app.run()
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/platform/app.py", line 48, in run
      _sys.exit(main(_sys.argv[:1] + flags_passthrough))
    File "train.py", line 466, in main
      train()
    File "train.py", line 310, in train
      train_emb=FLAGS.train_emb)
    File "/home/mishra/Project/RelExtractKBP/text_cnn.py", line 20, in 
      __init__
     self.wordvecs = tf.placeholder(tf.float32, shape=(2451510, 300), 
      name="wordvecs")
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/ops/array_ops.py", line 1599, in placeholder
      return gen_array_ops._placeholder(dtype=dtype, shape=shape, name=name) 
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/ops/gen_array_ops.py", line 3091, in 
      _placeholder
      "Placeholder", dtype=dtype, shape=shape, name=name)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/framework/op_def_library.py", line 787, in 
      _apply_op_helper
      op_def=op_def)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/framework/ops.py", line 2956, in create_op
      op_def=op_def)
    File "/home/mishra/anaconda3/envs/tensorflow/lib/python3.6/site- 
      packages/tensorflow/python/framework/ops.py", line 1470, in __init__
      self._traceback = self._graph._extract_stack()  # pylint: 
      disable=protected-access

    InvalidArgumentError (see above for traceback): You must feed a value for 
    placeholder tensor 'wordvecs' with dtype float and shape [2451510,300]
     [[Node: wordvecs = Placeholder[dtype=DT_FLOAT, shape=[2451510,300], 
      _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

据我了解,如果我在调用 sess.run 时没有将值传递给占位符,则可能会发生此错误。但是,我不确定在调用 sess.run(tf.global_variables_initializer()) 时需要做什么,根据 Traceback.

会生成此错误

任何指点都会很有帮助。非常感谢。

需要提供占位符 wordvecs

这可以通过以下示例从 official documentation -

中的 tf.placeholder 示例重现
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)

with tf.Session() as sess:
  print(sess.run(y))  # ERROR: will fail because x was not 
fed.

rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array}))  # Will succeed.

错误出现在 sess.run(tf.global_variables_initializer()) 步,因为它试图初始化以下变量:

self.WordVecs = tf.Variable(trainable = False, 
        initial_value=self.wordvecs, name="WordVecs")

和它的initial_value指向一个尚未初始化的tf.Placeholder

self.wordvecs = tf.placeholder(tf.float32, shape = (2451510, 300), 
                       name = "wordvecs")