как перебирать и изменять значение переменной внутри цикла while в тензорном потоке - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь реализовать метод Галлея для решения квартичных уравнений в тензорном потоке, используя while_loop и переменные. По сути, мне нужно выполнить итерации несколько раз, но когда я использую эти переменные в тензорном потоке, он выглядит так, как будто ему присвоено значение переменной, больше не является переменной и теперь превращается в тензор. Как я могу изменить это так, чтобы переменная могла быть повторена внутри while_loop, принимая разные значения ?. спасибо за вашу помощь

import tensorflow as tf 

tol = tf.constant(0.001, dtype = tf.float32)
x = tf.constant(0.1, dtype = tf.float32)
Coef = tf.constant([1, 1, -1, 7, 2], dtype = tf.float32)
x_nueva = tf.Variable(0.0, name = 'x_nueva')
error = tf.Variable(1.0, name = 'error' )
init_op = tf.global_variables_initializer()
def halley(tol, x, Coef, error, x_nueva):
a0 = Coef[0]
a1 = Coef[1]
a2 = Coef[2]
a3 = Coef[3]
a4 = Coef[4]
x_nueva.assign(x + a0)
error.assign(tf.abs(x-x_nueva))
return error, x_nueva

def condicion(tol, x, Coef, error, x_nueva):
return tf.less(tol, error)

with tf.Session() as sess:
sess.run(init_op)
resultado = tf.while_loop(condicion, halley, [tol, x, Coef, error, x_nueva])
print(resultado[4].eval())

отображение tenorflow следующая ошибка, связанная с переменной "x_nueva":

У объекта 'Tensor' нет атрибута 'assign'

я догадываюсьпосле «tf.assing» «x_nueva» превращается в тензор, а не в переменную, но я не могу найти, как это исправить.

1 Ответ

0 голосов
/ 08 ноября 2019

Вам не нужны переменные для этого. В большинстве случаев (если не во всех) использование переменных в пределах tf.while_loop некорректно. Что вам нужно сделать, это вернуть на каждой итерации значения, которые будут использоваться для следующей. loop_vars должны быть только те, которые изменяются через итерации. В вашем случае вы можете реализовать метод Галлея следующим образом:

import tensorflow as tf 

tol = tf.constant(0.001, dtype = tf.float32)
x = tf.constant(0.1, dtype = tf.float32)
# Coefficients are assumed to be sorted from highest to lowest degree
coef = tf.constant([1, 1, -1, 7, 2], dtype = tf.float32)
error = tf.constant(1.0, dtype = tf.float32)

def halley(x, coef):
    # Size of coef must be statically known when using polyval
    coef = tf.unstack(coef)
    # Evaluate polynomial and derivatives
    f = tf.math.polyval(coef, x)
    coef1 = [c * (len(coef) - i) for i, c in enumerate(coef[:-1], 1)]
    f1 = tf.math.polyval(coef1, x)
    coef2 = [c * (len(coef1) - i) for i, c in enumerate(coef1[:-1], 1)]
    f2 = tf.math.polyval(coef2, x)
    # Compute new x and error
    x_nueva = x - (2 * f * f1) / (2 * f1 * f1 - f * f2)
    error = tf.abs(x - x_nueva)
    # Return values for next iteration
    return x_nueva, error

def condicion(tol, error):
    return tf.less(tol, error)

with tf.Session() as sess:
    resultado = tf.while_loop(
        lambda x, error: condicion(tol, error),
        lambda x, error: halley(x, coef),
        [x, error])
    res_x, res_error = sess.run(resultado)
    print(res_x)  # Final x value
    # -0.27295828
    print(res_error)  # Final error
    # 0.0
...