1 回答
TA贡献1796条经验 获得超10个赞
上面的代码有几个问题,但最值得注意的一个是你没有返回lossfrom weighted_categorical_crossentropy。它应该看起来更像:
def weighted_categorical_crossentropy(self, weights):
weights = K.variable(weights)
def loss(y_true, y_pred):
y_pred /= K.sum(y_pred, axis=-1, keepdims=True)
y_pred = K.clip(y_pred, K.epsilon(), 1 - K.epsilon())
loss = y_true * K.log(y_pred) * weights
loss = -K.sum(loss, -1)
return loss
return loss # Return the callable function!
错误是ValueError: No gradients provided for any variable因为loss方法不返回任何东西,它返回None!如果您尝试使用 拟合方法loss=None,模型将无法计算梯度,因此会抛出相同的错误。
接下来是您return_sequences = True在非循环层之前的层中使用的 。这会导致Dense在形状错误的数据上调用该层,这仅适用于循环层。不要那样使用它。
如果您有充分的理由使用return_sequences = True,那么您必须添加Dense如下层:
model.add(keras.layers.TimeDistributed(keras.layers.Dense(...)))
这将导致该层在每个时间步上分别Dense作用于输出序列。这也意味着您的体形必须合适。y_true
您定义的自定义损失函数可能存在其他问题,但我无法推断出输入/输出形状,因此您必须运行它并添加看看它是否有效。可能会存在矩阵乘法形状不匹配的情况。
最后但并非最不重要的一点是,考虑使用子类 API。它能让你的操作更容易编写吗?
添加回答
举报