#tensorflow #minimize #minimization
#тензорный поток #минимизировать #минимизация
Вопрос:
Я пытаюсь реализовать функцию, которая минимизирует функцию, в которой параметры задаются элементами массива. Я попробовал пример кода:
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:
~Anaconda3libsite-packagestensorflowpythontrainingoptimizer.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:
Как указано в сообщении об ошибке, функция, которую вы пытаетесь минимизировать, недифференцируема. Операция среза области просто не может быть связана с 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)
но это привяжет его значение к исходной переменной, поэтому вам все равно нужно будет добавить его в final op (в данном случае reduce_sum
), чтобы сделать его дифференцируемым. Это потому, что если вы приведете его к int и передадите как индекс, он перестанет быть дифференцируемым. Для того, чтобы это изменить, вам необходимо установить связь между исходным значением и f_x. Надеюсь, это прояснит ситуацию.
Комментарии:
1. Спасибо за ваш ответ. но если я позволю коду выполняться, индекс вообще не изменится, обучается только e . я что-то пропустил?