如何通过单元测试检查梯度计算

时间:2019-10-06 04:46:38

标签: python unit-testing tensorflow gradient

我正在尝试对自定义图层进行单元测试。编写前馈测试非常简单,但是我不知道如何实现渐变测试。

我发现在tensorflow测试包中有一个名为compute_gradient的函数,但是我找不到有关如何使用它的任何资源。该文档基本上说它可以计算出我想要的梯度(jacobian矩阵),但是当我尝试使用它时,我得到了EagerTensor is not callable

这是我失败的代码:

class LayerGradientTest(tf.test.TestCase):
    def test_gradient(self):
        with self.test_session():
            input_tensor = [...]
            expected_output = [...]
            expected_gradients = [...]
            test_layer = MyLayer()
            output_tensor = test_layer(tf.Variable(input_tensor))
            grad_computed = tf.test.compute_gradient(output_tensor, expected_output)
            self.assertAllEqual(grad_computed, expected_gradients)

我希望测试在断言时通过或失败,但是我得到一个 TypeError: 'tensorflow.python.framework.ops.EagerTensor' object is not callable中的compute_gradient

编辑: 当然,渐变需要损失函数,我是个白痴……但是输出仍然是胡说八道。我现在使用以下代码:

function = tf.losses.mean_squared_error
grad_computed = tf.test.compute_gradient(function, [output_tensor, expected_output])

输入到我的图层的形状是(1、2、2、3)和(1、2、2、2),但是渐变是4个12x4矩阵的zip对象,但是由于我的图层中没有参数,期望在输入处获得错误值。如果我又搞砸了,请纠正我。为了澄清起见,我的图层只是在转换数据,因此它本身没有渐变,但必须正确地向后传播。

1 个答案:

答案 0 :(得分:0)

检查是否启用了急切执行,如果未尝试,请在导入中尝试以下代码

import tensorflow as tf
tf.enable_eager_execution()