将numpy方程转换为Keras后端损失函数方程

时间:2020-06-06 15:25:13

标签: python arrays numpy tensorflow keras

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

模型预测应按数组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后端函数,这意味着将其向量化。有没有人看到这样做的好方法?任何指针都将非常有帮助!

1 个答案:

答案 0 :(得分:1)

您的代码基本上是:

((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