TensorFlow自定义损失函数

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
)

上一篇:tensorflow中 batch, shuffle, repeat


下一篇:深度学习 tesorflow2.0版本 入门第一章