【发布时间】:2019-09-10 00:06:44
【问题描述】:
我正在尝试在 keras 中创建一个包含许多操作的相当复杂的 lambda 层。在我实现它之后,我得到了一个ValueError: No gradients provided for any variable。
虽然我只使用 keras 操作来转换数据,(除了我使用 numpy 创建的常量,我后来添加到张量中)我知道必须有一些不可微分的操作。现在我想知道如何确定它是哪一个,以便找到解决方法。
我还不想发布任何代码,因为它是竞赛的一部分,我想自己解决这个问题。如果因此难以理解我的问题,请告诉我。但是,我可以列出我正在使用的所有功能:
from tensorflow.keras import backend as K
from tensorflow.python.keras.layers import Lambda
...
def my_lambda_function(x):
# uses:
K.batch_dot
K.cast
K.clip
K.concatenate
K.one_hot
K.reshape
K.sum
K.tile # only applied to a constant created in numpy
...
# using the function in a model like this:
my_lambda_layer = Lambda(my_lambda_function)
result_tensor = my_lambda_layer(some_input)
我认为 K.one_hot 可能有问题,但我想在尝试使其可微之前确定这一点
【问题讨论】:
-
信息不足,无法给出正确答案。您使用
one_hot的事实意味着您正在处理离散数据,而且这通常是不可区分的。 -
我正在创建一个层,该层基于最后一层的输出向量的位置应用一种诉诸向量。因此,我需要 one_hot 将输出向量映射到矩阵以将其与另一个相乘。不过,近似值会很好,因为离散化当然会杀死梯度。我想也许 tensorflow 可能会近似这些操作的梯度。
标签: python tensorflow keras keras-layer differentiation