Пользовательские параметры в кросс-энтропийной керасе - PullRequest
1 голос
/ 01 мая 2019

Мне нужно создать пользовательскую функцию категориальной кросс-энтропийной потери, в которой я должен сравнивать y_true и Q*y_pred вместо просто y_pred. Q - это матрица. Проблема в том, что размер партии не должен быть равен 1. Итак, есть проблема с размерами. Как построить функцию категориальной кросс-энтропийной потери, которая работает с batch_size=200?

Например, это пользовательская функция категориальной кросс-энтропийной потери, которая работает правильно, но для batch_size = 1. У меня есть 3 класса, поэтому форма y_pred равна (batch_size, 3, 1), а форма Q равна (3,3).
Я также попытался передать многомерный массив NumPy с помощью shape = (batch_size, 3, 3), но он не сработал.

Q=np.matrix([[0, 0.7,0.2], [0,0,0.8],[1,0.3,0]])

def alpha_loss(y_true, y_pred):         
    return K.categorical_crossentropy(y_true,K.dot(tf.convert_to_tensor(Q,dtype=tf.float32 ),K.reshape(y_pred,(3,1)) ))

1 Ответ

0 голосов
/ 01 мая 2019

Поскольку вы используете серверную часть TensorFlow, это может работать:

Q=np.matrix([[0, 0.7,0.2], [0,0,0.8],[1,0.3,0]])

def alpha_loss(y_true, y_pred):
   # Edit: from the comments below it appears that y_pred has dim (batch_size, 3), so reshape it to have (batch_size, 3, 1)
   y_pred = tf.expand_dims(y_pred, axis=-1)

   q_tf = tf.convert_to_tensor(Q,dtype=tf.float32)

   # Changing the shape of Q from (3,3) to (batch_size, 3, 3)
   q_expanded = tf.tile(tf.expand_dims(q_tf, axis=0), multiples=[tf.shape(y_pred)[0], 1,1])

   # Calculate the matrix multiplication of Q and y_pred, gives a tensor of shape (batch_size, 3, 1)
   qy_pred = tf.matmul(q_expanded, y_pred)

   return K.categorical_crossentropy(y_true, qy_pred)
...