Как говорится в сообщении об ошибке, функция, которую вы пытаетесь свести к минимуму, недифференцируема.Нет просто способа, которым операция среза области соединяется с 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.Надеюсь, это прояснит ситуацию.