Почему этот фрагмент TensorFlow выдает ошибку при кормлении? - PullRequest
0 голосов
/ 17 декабря 2018

Код

#!/usr/bin/env python3
import tensorflow as tf
import numpy as np

def customOps(n):
  x = tf.placeholder(tf.float32)
  v1 = tf.reduce_sum(x,1)
  v2 = tf.reduce_sum(x,0)
  v = tf.nn.softmax(tf.concat([v1, v2], 0))
  index = np.argmax(v)
  if index > n/3:
    finalval = tf.norm(v1-v2, ord='euclidean')
  else:
    finalval = tf.norm(v1+v2, ord='euclidean')
  return finalval

if __name__ == '__main__':
  mat = np.asarray([[0, 1], [1, 0]], dtype = np.float32)
  n = mat.shape[0]

  finalVal = customOps(n)

  init = tf.global_variables_initializer()
  sess = tf.Session()
  sess.run(init)
  outVal = sess.run(finalVal, feed_dict={x:mat})
  print(outVal)
  sess.close()

Сгенерировано с ошибкой

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_5' with dtype float [[{{node Placeholder_5}} = Placeholder[dtype=DT_FLOAT, shape=<unknown>, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Ошибка сгенерирована в строке sess.run(init) в приведенном выше фрагменте.Я передаю массив типа float через feed_dict, и я не уверен, почему выдается ошибка.

Где ошибка и почему?

1 Ответ

0 голосов
/ 17 декабря 2018

Почему ошибка:

Поскольку вы запускали один и тот же фрагмент несколько раз на нечистом графике (т. Е. На вашем графике несколько копий сети).Причина, по которой я могу сказать, это _5 в конце имени узла в сообщении об ошибке.TF назначает имя по умолчанию всем тензорам в графе, используя инкрементные индексы, если имя уже занято.Placeholder_5 означает, что в том же графике есть как минимум 5 Placeholder экземпляров без назначенного имени по умолчанию, что, учитывая ваш код, должно быть невозможным, если вы не вызывали функцию несколько раз без очисткиграфик.

Как это исправить:

Запустить на чистом графике: поставьте tf.reset_default_graph() перед finalVal = customOps(n).

Примечание: Ваш кодимеет больше проблем, чем это (например, у вас есть x в основной ветке, но x является локальной переменной customOps), но причина вашей ошибки - та, которая указана выше.Ниже вы найдете проверенную и работающую версию своего кода, которая решает обе проблемы.

import tensorflow as tf
import numpy as np

def customOps(n):
  x = tf.placeholder(tf.float32)
  v1 = tf.reduce_sum(x,1)
  v2 = tf.reduce_sum(x,0)
  v = tf.nn.softmax(tf.concat([v1, v2], 0))
  index = np.argmax(v)
  if index > n/3:
    finalval = tf.norm(v1-v2, ord='euclidean')
  else:
    finalval = tf.norm(v1+v2, ord='euclidean')
  return x, finalval

if __name__ == '__main__':
  mat = np.asarray([[0, 1], [1, 0]], dtype = np.float32)
  n = mat.shape[0]

  tf.reset_default_graph()
  x, finalVal = customOps(n)

  init = tf.global_variables_initializer()
  sess = tf.Session()
  sess.run(init)
  outVal = sess.run(finalVal, feed_dict={x:mat})
  print(outVal)
  sess.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...