Я определил пользовательскую функцию потерь для своей модели.
def get_loss(y_hat, y):
loss = tf.keras.losses.BinaryCrossentropy(y_hat,y) # cross entropy (but no logits)
y_hat = tf.math.sigmoid(y_hat)
tp = tf.math.reduce_sum(tf.multiply(y_hat, y),[1,2])
fn = tf.math.reduce_sum((y - tf.multiply(y_hat, y)),[1,2])
fp = tf.math.reduce_sum((y_hat -tf.multiply(y_hat,y)),[1,2])
loss = loss - ((2 * tp) / tf.math.reduce_sum((2 * tp + fp + fn + 1e-10))) # fscore
return loss
При подгонке моей модели к моим тренировочным данным я получаю следующую ошибку:
TypeError: Expected float32, got <tensorflow.python.keras.losses.BinaryCrossentropy object at 0x7feca46d0d30> of type 'BinaryCrossentropy' instead.
Как я могу это исправить? Я уже пытался использовать:
loss=tf.int32(tf.keras.losses.BinaryCrossentropy(y_hat,y)
но это выдает еще одну ошибку и, похоже, это не то решение, которое мне нужно
Вам нужно вызвать созданный объект, а не передавать ввод в качестве аргументов. Как таковой:
loss = tf.keras.losses.BinaryCrossentropy()(y_hat,y)
Обратите внимание на дополнительный набор скобок. Или сделайте это так:
loss = tf.keras.losses.binary_crossentropy(y_hat, y)