Tensorflow минимизировать целые числа - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь реализовать функцию, которая минимизирует функцию, параметры которой задаются элементами массива. Я попробовал пример кода:

z = tf.Variable(6., trainable=True)

A=np.linspace(-1,1,50)
data_tf = tf.convert_to_tensor(A, np.float32)

f_x = data_tf[tf.cast(tf.clip_by_value(z,0,25),tf.int32)]

loss = f_x
opt = tf.train.GradientDescentOptimizer(1).minimize(f_x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(100):
        print(sess.run([z,loss]))
        sess.run(opt)

Это дает мне ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-35-278fa6e8507a> in <module>()
14 
15 loss = f_x
---> 16 opt = tf.train.GradientDescentOptimizer(1).minimize(f_x)
17 
18 with tf.Session() as sess:

~\Anaconda3\lib\site-packages\tensorflow\python\training\optimizer.py in 
minimize(self, loss, global_step, var_list, gate_gradients, 
aggregation_method, colocate_gradients_with_ops, name, grad_loss)
405           “No gradients provided for any variable, check your graph for 
ops”
406           “ that do not support gradients, between variables %s and loss 
%s.” %
--> 407           ([str(v) for _, v in grads_and_vars], loss))
408 
409     return self.apply_gradients(grads_and_vars, global_step=global_step,

ValueError: No gradients provided for any variable, check your graph for ops 
that 
do not support gradients, between variables ["<tf.Variable 'Variable:0' 
shape=() 
dtype=float32_ref>",

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 19 марта 2019

Как говорится в сообщении об ошибке, функция, которую вы пытаетесь свести к минимуму, недифференцируема.Нет просто способа, которым операция среза области соединяется с tf.Variable, который вы определили.Однако этот пример будет работать

z = tf.Variable(6., trainable=True)
e = tf.Variable(0., trainable=True)

A = np.linspace(-1, 1, 50)
data_tf = tf.convert_to_tensor(A, np.float32)

idx = tf.cast(tf.clip_by_value(z,0,25),tf.int32)
f_x = tf.slice(data_tf, [idx],[1]) 

f_x = tf.reduce_sum(f_x - e)

loss = f_x
opt = tf.train.GradientDescentOptimizer(1).minimize(f_x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(100):
        sess.run(opt)
        print(sess.run([z,loss]))

Редактировать: Вы можете добавить копию z, например,

zz = tf.identity(z)

, но она свяжет свое значение с исходной переменной, так что вывсе еще нужно добавить его в финальной операции (в данном случае reduce_sum), чтобы сделать его дифференцируемым.Это потому, что если вы приведете его к int и передадите в качестве индекса, он перестанет быть дифференцируемым.Чтобы это изменить, вам нужно установить связь между исходным значением и f_x.Надеюсь, это прояснит ситуацию.

...