TensorFlow损失函数:

  • ​MeanSquaredError()​
  • ​KLDivergence()​
  • ​CosineSimilarity()​
  • 等等

在TensorFlow中已经内置了很多常用的损失函数,可以满足我们的模型训练要求,但是有的时候我们自己特定的任务会有自己的损失函数,这样TensorFlow库中的函数就不会满足我们,我们就需要自己定义计算损失的方法。

在TensorFlow提供了两种方式自定义损失函数:

  • 自定义函数
  • Loss类子类化

下面我们以自定义MSE均方误差作为示例:

方式一:自定义函数

参数为真实值和预测值,函数体则为自定义的损失计算方法

# 方式一:自定义函数
def custom_mean_squared_error(y_true, y_pred):
return tf.math.reduce_mean(tf.square(y_true - y_pred))

方式二:Loss类子类化

该方法要分别实现​​__init__​​​和​​call​​方法,在初始化方法中可以自定义需要传入的参数,call的参数为真实值和预测值,函数体则为自定义的损失计算方法

# 方式二:Loss类子类化
class CustomMSE(keras.losses.Loss):
def __init__(self):
super(CustomMSE, self).__init__()

def call(self, y_true, y_pred):
mse = tf.math.reduce_mean(tf.square(y_true - y_pred))
return mse

完整代码:

"""
* Created with PyCharm
* 作者: 阿光
* 日期: 2022/1/2
* 时间: 15:57
* 描述:
"""
import numpy as np
import tensorflow as tf
from keras import Input, Model
from keras.layers import Dense
from tensorflow import keras

x = np.random.random((1000, 10))
y = np.random.random((1000, 1))


# 方式一:自定义函数
def custom_mean_squared_error(y_true, y_pred):
return tf.math.reduce_mean(tf.square(y_true - y_pred))


# 方式二:Loss类子类化
class CustomMSE(keras.losses.Loss):
def __init__(self):
super(CustomMSE, self).__init__()

def call(self, y_true, y_pred):
mse = tf.math.reduce_mean(tf.square(y_true - y_pred))
return mse


def get_model():
inputs = Input(shape=(10,))
outputs = Dense(1, activation='relu')(inputs)
model = Model(inputs, outputs)
model.compile(
optimizer='adam',
loss=custom_mean_squared_error,
# loss=CustomMSE(),
metrics=['mse']
)
return model


model = get_model()

model.fit(
x,
y,
epochs=5,
batch_size=32,
validation_split=0.2
)