Пытаясь запустить следующий базовый пример для выполнения условного вычисления, я получил следующее сообщение об ошибке:

'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
5
Anona112 14 Дек 2015 в 14:21

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
2
Anona112 14 Дек 2015 в 14:22

FYI . Я получил похожую ошибку, и моя была:

узел GradientDescent / update_input / ApplyGradientDescent был передан с плавающей точкой из _arg_input_0_1: 0, несовместимого с ожидаемым float_ref.

Это произошло потому, что где-то в моем дереве узлов у меня было tf.Variable вместо t.fplaceholder. После замены переменной на заполнитель все заработало.

2
codesmith 30 Ноя 2017 в 12:34

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.})
1
reubenjohn 25 Мар 2018 в 18:27

Изменение

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
0
yuhangjian 20 Дек 2018 в 10:50