我正在尝试实现一个将生成自定义损失函数的 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
Run Code Online (Sandbox Code Playgroud)
当我实现这一点时,我得到:
TypeError: TensorType does not support iteration.
Run Code Online (Sandbox Code Playgroud)
我使用的是 Keras 2.0.2 版和 Theano 0.9.0 版后端。我知道我需要使用 Keras 张量函数才能做到这一点,但我无法弄清楚任何可以做我想做的张量函数。
另外,我很难准确理解我的 Lambda 函数应该返回什么。它是每个样本的总成本的张量,还是只是批次的总成本?
几天来我一直在反对这一点。任何帮助深表感谢。
Keras 中的张量通常至少有 2 个维度,batch 和神经元/单元/节点/...维度。因此,具有 128 个单元的密集层以 64 的批量大小进行训练,将产生具有 shape 的张量(64,128)。
您的LambdaLayer处理张量与任何其他层一样,在您之前的密集层之后将其插入将为您提供一个(64,128)可以处理的形状的张量。处理张量的工作方式类似于 numpy 数组的计算工作方式(或任何其他向量处理库):您指定一个操作来广播数据结构中的所有元素。
例如,您的自定义成本是批次中每个值的差异,您可以像这样实现它:
cost_layer = LambdaLayer(lambda a,b: a - b)
Run Code Online (Sandbox Code Playgroud)
该-操作被广播过a和b将返回提供了合适的结果的尺寸相匹配。要点是您实际上只能为每个值指定一个操作。如果您想执行更复杂的任务,例如基于值的计算,您需要进行两个操作并相应地应用正确的一个操作的单个操作,即switch操作。
的语法K.switch是
K.switch(condition, then_expression, else_expression)
Run Code Online (Sandbox Code Playgroud)
例如,如果您想在两个值a != b相等时相减,但在它们相等时相加,您可以这样写:
import keras.backend as K
cost_layer = LambdaLayer(lambda a,b: K.switch(a != b, a - b, a + b))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2239 次 |
| 最近记录: |