Ответ на старый вопрос
Реализация
def _zero_out_grad(op, *grads):
topdiff = grads[0]
bottom = op.inputs[0]
shape = array_ops.shape(bottom)
index = array_ops.zeros_like(shape)
first_grad = array_ops.reshape(topdiff, [-1])[0]
to_zero_grad = sparse_ops.sparse_to_dense([index], shape, first_grad, 0)
return to_zero_grad
работает довольно хорошо здесь. Вы уверены, что "@ ops.RegisterGradient (" ZeroOut ")" выполняется до tf.Session()
?
Обычно
zero_out_module = tf.load_op_library('./libzeroout.so')
@ops.RegisterGradient("ZeroOut")
def _zero_out_grad(op, grad):
# ...
помещается в другой файл и просто импортируется. Полный рабочий пример даже с последней версией TensorFlow: здесь .
Ответ на полностью измененный вопрос
Ваша функция градиента возвращает список, а список Python не имеет 'eval ()'. Попробуйте либо:
grad = tf.gradients(ys=tf.reduce_sum(ret), xs=t_in)[0]
Или следуйте лучшей практике и используйте
grad = tf.gradients(ys=tf.reduce_sum(ret), xs=t_in)
with tf.Session() as sess:
sess.run(grad, feed_dict=feed_dict)
Пожалуйста, не меняйте весь вопрос