gpt4 book ai didi

用于自定义损失的 Keras Lambda 层

转载 作者:行者123 更新时间:2023-12-04 23:47:50 25 4
gpt4 key购买 nike

我正在尝试实现一个将生成自定义损失函数的 Lambda 层。在图层中,我需要能够将批处理中的每个元素与批处理中的每个其他元素进行比较,以便计算成本。理想情况下,我希望代码看起来像这样:

for el_1 in zip(y_pred, y_true):
for el_2 in zip(y_pred, y_true):
if el_1[1] == el_2[1]:
# Perform a calculation
else:
# Perform a different calculation

当我实现这一点时,我得到:

TypeError: TensorType does not support iteration.

我正在使用 Keras 2.0.2 版和 Theano 0.9.0 版后端。我知道我需要使用 Keras 张量函数来执行此操作,但我无法弄清楚任何张量函数可以执行我想要的操作。

此外,我很难准确理解我的 Lambda 函数应该返回什么。它是每个样本总成本的张量,还是只是该批处理的总成本?

我已经为此苦苦思索了好几天。非常感谢任何帮助。

最佳答案

Keras 中的张量通常至少有 2 个维度,批处理和神经元/单元/节点/...维度。因此,一个包含 128 个单元的密集层以 64 的批量大小训练,将产生一个形状为 (64,128) 的张量。

您的 LambdaLayer 像任何其他层一样处理张量,将它插入之前的致密层之后将为您提供一个形状为 (64,128) 的张量进行处理。处理张量的工作方式类似于 numpy 数组(或任何其他矢量处理库)的计算方式:您指定一个操作来广播数据结构中的所有元素。

例如,您的自定义成本是批处理中每个值的差异,您可以这样实现:

cost_layer = LambdaLayer(lambda a,b: a - b)

- 操作在 ab 上广播,如果维度匹配,将返回合适的结果。要点是您实际上只能为每个值指定一个操作。如果您想执行更复杂的任务,例如基于您需要单个操作的值的计算,该操作需要两个操作并相应地应用正确的操作,即 switch操作。

K.switch 的语法是

K.switch(condition, then_expression, else_expression)

例如,如果您想在 a != b 时减去两个值,但在它们相等时将它们相加,您可以这样写:

import keras.backend as K
cost_layer = LambdaLayer(lambda a,b: K.switch(a != b, a - b, a + b))

关于用于自定义损失的 Keras Lambda 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43000629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com