我正在Tensorflow 2.0中实现本文https://arxiv.org/pdf/1803.06329.pdf,该论文提出了一种称为DSAC的模型。
该模型基本上是一个CNN,可输出4个贴图(即张量),用作活动轮廓模型的输入。损失函数是在地面真实情况和活动轮廓模型的输出之间进行计算的,即,它不是针对CNN的输出进行计算的。正如链接的科学论文所报道的那样,我已经实现了损失函数相对于每个输出张量的梯度的实现。
我要花几个小时才能解密tf.custom_gradient
装饰器的documentation。
具体来说,我无法得出结论是否是:“如果f使用变量(不属于输入的一部分)”。
在文档的同一部分中,我也不知道“哪里grad_xs与上面相同”,因为在本文档页面的其他任何地方都没有定义grad_xs
。
最后,我知道this tutorial的存在,但这与我正在研究的论文的情况太不同了,以帮助我理解应该如何实施。
到目前为止,我的实现看起来是这样的:
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4, epsilon=1e-6)
# cnn_model is a tf.keras.Model object
cnn_output = cnn_model.inference(batch_of_images) # cnn_output contains the 4 maps to be passed in the active contours model.
# Structured_loss_gradients is also a list of 4 elements of the same shape as the CNN outputs
structured_loss_gradients = my_gradients_computation([cnn_output[i] for i range(4)])
optimizer.apply_gradients(zip(structured_loss_gradients, cnn_model.trainable_variables))
最后一行给我以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: var and grad do not have the same shape[7,7,3,32] [2,800,800,1,1] [Op:ResourceApplyAdam]
简而言之,我有需要使用@tf.custom_gradient
装饰器的感觉,但是即使有所有文档,我也不了解该装饰器的工作原理。
附加说明:
(1)有一个TF 1.14 implementation of this pape r。不幸的是,该实现无法很好地扩展我拥有的数据量,因此我决定对其进行修改以在TF 2.0中运行。
(2)我一直在研究可以在该主题上找到的所有SO问题,这些问题都不在我想要实现的范围之内。