在Tensorflow中损失函数是如何工作的?如何从批次中计算它们?

2024-05-20 16:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我对tensorflow有很多实际操作经验,最近我一直在尝试实现一个自定义损失函数。因为我一直在努力解决这个问题,所以我尝试实现一个简单的平均绝对误差(MAE)损失。这是我的职责:

@tf.function
def my_mae(y_true, y_pred):
    return tf.reduce_mean(tf.abs(tf.subtract(y_true, y_pred)), axis=-1)

编译

现在,对我来说,这看起来相当准确,但我用以下参数编译了我的模型:

model.compile(loss=my_mae,
              optimizer='adam',
              metrics=['mae', 'mse'])

我从model.fit开始训练。问题是,在拟合函数的日志中,我可以看到我的MAE和MAE度量有不同的值:

Epoch 1/100
483/483 [==============================] - 1s 3ms/step - loss: 3.7004 - mae: 0.7226 - mse: 0.8044 - val_loss: 3.2607 - val_mae: 0.5098 - val_mse: 0.4458
Epoch 2/100
483/483 [==============================] - 1s 3ms/step - loss: 3.4139 - mae: 0.6550 - mse: 0.6687 - val_loss: 3.0994 - val_mae: 0.4907 - val_mse: 0.4207

我做错什么了吗?tensorflow在做我不知道的事情吗

更多的实验

我还试着将损失除以一个大数字,看看发生了什么,就像下面这段话:

@tf.function
def my_mae(y_true, y_pred):
    return tf.reduce_mean(tf.abs(tf.subtract(y_true, y_pred)), axis=-1) / 1000

但我得到了完全相同的起始损失值:

Epoch 1/100
483/483 [==============================] - 1s 3ms/step - loss: 3.8101 - mae: 0.7587 - mse: 0.8851 - val_loss: 3.3032 - val_mae: 0.5203 - val_mse: 0.4549
Epoch 2/100
483/483 [==============================] - 1s 3ms/step - loss: 3.4606 - mae: 0.6594 - mse: 0.6793 - val_loss: 3.1446 - val_mae: 0.4985 - val_mse: 0.4274

编辑:模型创建代码

def build_model(nhidden=5, nneurons=60, pdropout=.5,
                hidden_act='tanh', last_act='linear',
                loss='mae', regularizer=None, optimizer='adam',
                input_shape=None, weights=True):
    # Input: spectra (areas)
    x_input = Input(shape=input_shape)

    # Hidden layers
    hidden = x_input
    for i in range(nhidden):
        hidden = Dense(nneurons,
                       activation=hidden_act,
                       kernel_regularizer=regularizer,
                       name='dense{}'.format(i))(hidden)
        hidden = Dropout(pdropout)(hidden)

    # Last layer
    outputs = Dense(3, activation=last_act, name='denseout')(hidden)

    # Model
    model = Model(x_input, outputs)

    loss = my_mae
    model.compile(loss=my_mae,
                  optimizer=optimizer,
                  metrics=['mae', 'mse'])

    model.summary()

    return model

Tags: trueinputmodelmytfstepvalhidden
1条回答
网友
1楼 · 发布于 2024-05-20 16:06:36

正如您最终发现的,罪魁祸首是在您的模型中使用了正则化器:

hidden = Dense(nneurons,
               activation=hidden_act,
               kernel_regularizer=regularizer,   # <<<<<<<<<<
               name='dense{}'.format(i))(hidden)

正则化器向最终损失值添加一个额外的隐式损失,即正则化损失,它(通常)独立于传递的特定数据,并且完全基于所选的正则化标准

当您看到Keras中的输出时,loss值指的是总损失,计算为损失函数返回的值加上模型中定义的任何正则化损失

相关问题 更多 >