我为我的模型定义了一个自定义损失函数。
def get_loss(y_hat, y):loss = tf.keras.losses.BinaryCrossentropy(y_hat,y) # 交叉熵(但不是逻辑回归)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))) # f分数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)