【问题标题】:Converting numpy equation to Keras backend loss function equation将 numpy 方程转换为 Keras 后端损失函数方程
【发布时间】:2020-09-25 18:05:55
【问题描述】:

我正在研究生成音乐的模型。我所有的训练数据都使用相同的调和模式,C 大调。我有一个 numpy 数组 keyspace,其形状 (n,) 表示我键盘上的按键总数(以半音阶)。该数组中带有 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 后端函数,这意味着对其进行矢量化。有没有人看到这样做的好方法?任何指针都会非常有帮助!

【问题讨论】:

    标签: python arrays numpy tensorflow keras


    【解决方案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
    

    【讨论】:

    • 就是这么简单优雅!非常感谢!
    猜你喜欢
    • 2020-08-17
    • 2020-02-21
    • 1970-01-01
    • 2018-12-26
    • 2018-08-06
    • 2020-09-24
    • 2019-09-15
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多