Официальный пример ошибки градиента ZeroOut: AttributeError: у объекта 'list' нет атрибута 'eval' - PullRequest
0 голосов
/ 04 мая 2018

Я следовал официальному руководству на сайте tenorflow: https://www.tensorflow.org/extend/adding_an_op Также описано, как вызвать градиент примера ZeroOut в учебнике, который я хочу попробовать в этом фрагменте краткого кода ниже.

Я нашел код здесь: https://github.com/MatteoRagni/tf.ZeroOut.gpu

import numpy as np
import tensorflow as tf
from tensorflow.python.framework import ops
from tensorflow.python.ops import array_ops
from tensorflow.python.ops import sparse_ops
zero_out_module = tf.load_op_library('./libzeroout.so')
@ops.RegisterGradient("ZeroOut")
def _zero_out_grad(op, grad):
     to_zero = op.inputs[0]
     shape = array_ops.shape(to_zero)
     index = array_ops.zeros_like(shape)
     first_grad = array_ops.reshape(grad, [-1])[0]
     to_zero_grad = sparse_ops.sparse_to_dense([index], shape, first_grad, 0)
     return [to_zero_grad]  # List of one Tensor, since we have one input

t_in = tf.placeholder(tf.int32, [None,None])
ret = zero_out_module.zero_out(t_in)
grad = tf.gradients(ys=tf.reduce_sum(ret), xs=t_in)
with tf.Session(''):
    feed_dict = {t_in: [[1, 2], [3, 4]]}
    print "ret val: ", ret.eval(feed_dict=feed_dict)
    print "grad: ", grad
    print "grad: ", grad.eval(feed_dict=feed_dict)

Я получил эту ошибку ...

AttributeError: 'list' object has no attribute 'eval'

... но я могу сделать ret.eval ().

Почему я не могу вызвать grad.eval ()? Я хочу видеть эти значения внутри града тензора. Как отладить градиент?

1 Ответ

0 голосов
/ 04 мая 2018

Ответ на старый вопрос

Реализация

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)

Пожалуйста, не меняйте весь вопрос

...