Пытаясь запустить следующий базовый пример для выполнения условного вычисления, я получил следующее сообщение об ошибке:
'x' было передано float несовместимо с ожидаемым float_ref
Что такое тензор потока float_ref и как код должен быть изменен?
import tensorflow as tf
from tensorflow.python.ops.control_flow_ops import cond
a = tf.Variable(tf.constant(0.),name="a")
b = tf.Variable(tf.constant(0.),name="b")
x = tf.Variable(tf.constant(0.),name="x")
def add():
x.assign( a + b)
return x
def last():
return x
calculate= cond(x==0.,add,last)
with tf.Session() as s:
val = s.run([calculate], {a: 1., b: 2., x: 0.})
print(val) # 3
val=s.run([calculate],{a:4.,b:5.,x:val})
print(val) # 3
4 ответа
Это не объясняет, что такое float_ref, но устраняет проблемы:
1) переменные должны быть созданы в сеансе 2) назначение операции было не тем, что мы ожидали
Этот исправленный код работает:
def add():
print("add")
x = a + b
return x
def last():
print("last")
return x
with tf.Session() as s:
a = tf.Variable(tf.constant(0.),name="a")
b = tf.Variable(tf.constant(0.),name="b")
x = tf.constant(-1.)
calculate= cond(x.eval()==-1.,add,last)
val = s.run([calculate], {a: 1., b: 2.})
print(val) # 3
print(s.run([calculate],{a:3.,b:4.})) # 7
print(val) # 3
FYI . Я получил похожую ошибку, и моя была:
узел GradientDescent / update_input / ApplyGradientDescent был передан с плавающей точкой из _arg_input_0_1: 0, несовместимого с ожидаемым float_ref.
Это произошло потому, что где-то в моем дереве узлов у меня было tf.Variable
вместо t.fplaceholder
. После замены переменной на заполнитель все заработало.
float_ref
здесь относится к ссылке на число с плавающей точкой, т.е. ваша переменная с плавающей точкой Tensorflow x
.
Как объясняется здесь, вы сталкиваетесь с этой ошибкой, поскольку вы не можете одновременно назначать и передавать переменную в качестве feed_dict в том же сеансе, как вы делаете в этом утверждении:
val = s.run([calculate], {a: 1., b: 2., x: 0.})
Это становится более очевидным, когда вы решаете, что утверждение в конечном итоге:
val = s.run([x.assign( a + b)], {a: 1., b: 2., x: 0.})
Изменение
a = tf.Variable(tf.constant(0.),name="a")
b = tf.Variable(tf.constant(0.),name="b")
x = tf.Variable(tf.constant(0.),name="x")
def add():
x.assign( a + b)
return x
Чтобы :
a = tf.placeholder(dtype=tf.float32,name="a")
b = tf.placeholder(dtype=tf.float32,name="b")
x = tf.placeholder(dtype=tf.float32,name="x")
def add():
x= a + b
return x
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.