keras 没有为任何可变误差提供梯度

jhkqcmku  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(153)

我正在使用Keras函数API创建一个模型。
层体系结构如下:

n = tf.keras.layers.Dense(1)(input)

for i in tf.range(n):
    output = tf.keras.layers.Dense(4)(input)

然后,我将输出连接起来,并返回形状为[1,None,4]的Tensor,其中[1]是批维度,[None]是n,[4]是第二个密集层的输出。
我的损失函数包括比较预期输出的形状,以及比较输出。

loss = tf.convert_to_tensor(abs(tf.shape(logits)[1] - tf.shape(expected)[1])) * 100.

在自定义训练循环中运行此程序时,出现以下错误

ValueError: No gradients provided for any variable: (['while/dense/kernel:0', 
'while/dense/bias:0', 'while/while/dense_1/kernel:0', 'while/while/dense_1/bias:0'],).
Provided `grads_and_vars` is ((None, <tf.Variable 'while/dense/kernel:0' shape=(786432, 1)
zed5wv10

zed5wv101#

形状是不可微分的,你不能用基于梯度的学习来做这样的事情。像这样的问题需要用更强大的工具来解决,例如强化学习,其中人们认为n是一个动作,并为此获得策略梯度。
要记住的一条经验法则是,你不能真的在离散对象中使用backprop。你需要产生浮点数,因为渐变需要平滑函数。在你的例子中,n应该是一个整数(什么是浮点循环?)所以这应该是你的第一个警告信号。另一个是形状本身,它也是一个整数。一个目标可以是离散的,而不是预测。注意,即使在分类中,我们也不输出class,我们输出probability,因为概率是平滑的。
你可以通过假设N的最大值来构建你的模型,并将其更像一个分类,在那里你直接监督N,并使用某种形式的屏蔽来保留所有的结果。

相关问题