tensorflow 如何自定义损失函数

1.格式

def custom_loss(y_true, y_pred):
            
    # calculate loss, using y_pred
        
    return loss
  
model.compile(loss=custom_loss, optimizer='adam')
2.需要遵循的规则:
  1. 为了衡量损失,损失函数应该使用y_true,y_pred两个参数,这些参数在拟合数据时从模型本身传递。
  2. 在计算损失时损失函数必须使用y_pred值,如果不这样做,那么梯度表达式就不会被定义,就会出现错误
  3. 将自定义的损失函数加入model.compile以使用它
3.注意数据的维度
  1. y_pred,y_true的第一个维度应该和batchsize的维度一致。例如:如果使用32 大小的batch size拟合数据,网络有5个输出节点,y_pred的形状(shape)应为(32,5)
  2. 损失函数应始终返回长度为batch_size的向量
4. 例子

设计一个神经网络以解决回归任务,该神经网络输出长度为2的向量[x1,x2]。


model = keras.models.Sequential()

model.add(Dense(50, input_shape=(5,), activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='relu'))

model.add(Dense(2, activation='linear'))

假定值x2x1更重要,并且您希望它确实接近目标值。 对于这种情况,可以创建一个自定义MSE(均方误差)损失函数,该函数将x2的预测误差大于x1

import keras.backend as K

def custom_mse(y_true, y_pred):
 
    # calculating squared difference between target and predicted values 
    loss = K.square(y_pred - y_true)  # (batch_size, 2)
    
    # multiplying the values with weights along batch dimension
    loss = loss * [0.3, 0.7]          # (batch_size, 2)
                
    # summing both loss values along batch dimension 
    loss = K.sum(loss, axis=1)        # (batch_size,)
    
    return loss

在这里,我将损失值与权重0.3和0.7相乘,从而给第二个值x2带来更大的损失。 实际中可以根据需要决定权重。
我还在代码片段中写下了变量的形状。 可以看到最终损失的形状为(batch_size,),表示每个数据点有一个损失值。

在model.compile中加入自定义损失函数

model.compile(loss=custom_mse, optimizer='adam')

你可能感兴趣的:(#,tensorflow实战,tensorflow,python,深度学习)