首页 文章

自定义损失的Keras Lambda图层

提问于
浏览
3

我正在尝试实现一个将产生自定义损失函数的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函数应该返回什么 . 它是每个样品总成本的张量,还是仅仅是批次的总成本?

几天来,我一直在反对这一点 . 非常感谢任何帮助 .

1 回答

  • 3

    Keras中的张量通常具有至少2个维度,批量和神经元/单元/节点/ ...维度 . 因此,以批量大小64训练的具有128个单元的致密层将产生具有形状 (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))
    

相关问题