首页 > 解决方案 > 将 numpy 方程转换为 Keras 后端损失函数方程

问题描述

我正在研究生成音乐的模型。我所有的训练数据都使用相同的调和模式,C 大调。我有一个keyspace形状为 (n,) 的 numpy 数组,它代表我键盘上的按键总数(以半音阶)。该数组中带有 1 的槽是 C 大调中的键;有 0 的插槽不在 C 大调中。

该模型预测应按数组的形式按下哪些键y_pred。我想在我的损失函数中添加一个术语,以惩罚模型按下不在 C 大调中的键。也就是说,我不想因为我的模型未能在键空间中按下键而受到惩罚(因为不是每个节拍都使用音阶中的每个键!)。在 numpy 中,我可以这样做:

import numpy as np

keyspace = np.array( [0, 1, 0, 1, 0, 1] )
y_pred   = np.array( [1, 0, 0, 1, 0, 1] )

loss_term = 0
for idx, i in enumerate(y_pred):
  if i:
    if not keyspace[idx]:
      loss_term += 1

loss_term

我现在想将其转换为 Keras 后端函数,这意味着对其进行矢量化。有没有人看到这样做的好方法?任何指针都会非常有帮助!

标签: pythonarraysnumpytensorflowkeras

解决方案


您的代码基本上是:

((1-keyspace) * y_pred).sum()

测试:

def loop_loss(keyspace, y_pred):
    loss_term = 0
    for idx, i in enumerate(y_pred):
        if i and not keyspace[idx]:
            loss_term += 1
    return loss_term

keyspace, y_pred = np.random.choice([0,1], (2,10))

loop_loss(keyspace, y_pred) == ((1-keyspace) * y_pred).sum()
# True

推荐阅读