Converting numpy equation to Keras backend loss function equation

Viewed 36

I'm working on a model to generate music. All of my training data is in the same key and mode, C Major. I have a numpy array keyspace with shape (n,) that represents the total number of keys on my keyboard (in a chromatic scale). The slots in that array with a 1 are keys that are in C Major; the slots that have 0s are not in C Major.

The model predicts which keys should be pressed as an array y_pred. I want to add a term to my loss function that penalizes the model for pressing keys that aren't in C Major. That said, I don't want to penalize my model for failing to press keys in the keyspace (as not every beat uses every key in the scale!). In numpy, I can do this like so:

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

I'd now like to convert this to Keras backend functions, which means vectorizing this. Does anyone see a good way to do so? Any pointers would be very helpful!

1 Answers

Your code is basically:

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

Test:

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
Related