python - 如何通过单元测试检查梯度计算
问题描述
我正在尝试对自定义层进行单元测试。编写前馈测试非常简单,但我不知道如何实现梯度测试。
我发现 tensorflow 测试包中有一个名为的函数,compute_gradient
但我找不到任何有关如何使用它的资源。该文档基本上说它计算了我想要的梯度(雅可比矩阵),但是当我尝试使用它时,我得到了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 对象,但是由于我的图层中没有参数,所以我希望得到输入的误差值。如果我再次搞砸了,请纠正我。澄清一下,我的层只是在转换数据,因此它本身没有渐变,但必须正确地向后传播它们。
解决方案
检查是否启用了急切执行,如果没有在导入中尝试以下代码
import tensorflow as tf
tf.enable_eager_execution()
推荐阅读
- graphql - 带有 Amplify 的 GraphQL 为 React App 提供 401 Unauthorized(使用 Cognito 添加 Auth 之前和之后)
- laravel - 在删除父记录 Laravel 时更新然后删除子表的值
- svn - 使用 tortoise svn 防止提交和忽略本地更改
- postgresql - go-pg UnionAll - 限制整个表达式
- c - 如何在 C 中初始化结构数组?
- flutter - Flutter 本地通知 int id 参数
- mysql - 选择列表不在 Group By 子句中并包含非聚合列
- javascript - 我如何用 for() 编写
- google-apps-script - INDEX-MATCH 公式在 Google 表格中返回相同的值
- css - 如何画出类似梯形的卡片?