我正在研究一个模型来生成音乐。我所有的训练数据都使用相同的键和模式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后端函数,这意味着将其向量化。有没有人看到这样做的好方法?任何指针都将非常有帮助!
答案 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