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

Python 在Tensorflow中损失函数是如何工作的?如何从批次中计算它们?,python,tensorflow,loss-function,Python,Tensorflow,Loss Function,我对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.com

我对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
编辑:模型创建代码
正如您最终发现的,罪魁祸首是在您的模型中使用了正则化器:

hidden = Dense(nneurons,
               activation=hidden_act,
               kernel_regularizer=regularizer,   # <<<<<<<<<<
               name='dense{}'.format(i))(hidden)
hidden=密集(n欧元、,
激活=隐藏的行为,

kernel_regularizer=regularizer,#在更改损失函数后得到相同的值这一事实有点奇怪。您能确保在干净的python环境中运行它并且它使用了正确的函数吗?您还可以尝试返回一个常量值以使值输出可预测,并查看是否有任何不同。最后一个问题是将您的实现与Keras'进行比较,Keras'在Hello GPhilo中找到。我在虚拟环境中运行它,一切都应该是干净的(如果这是您的意思)。此外,我尝试将loss函数更改为
return 1
,但仍然没有任何更改。我将发布整个模型创建代码,以便在那里找到一些奇怪的东西。对不起,我是说一个干净的解释器(即,在限制解释器后,新的
python
交互式会话,以确保函数
my_mae
确实是您显示的函数,而不是先前执行的拒绝).更改为
return 1
不会改变任何东西,这让我怀疑您的函数是否运行了。模型创建代码本身并不重要,我看到的对我来说是正确的..我在PyCharm中工作,每次按“run”我都非常确定它重新初始化了解释器和所有的东西。我尝试了一些东西:我没有使用这个
build\u model
函数,而是创建了一个新的
get\u basic\u model
函数,在这里我硬编码了所有东西(架构、网络等)这意味着当我调用build model时会发生一些事情。如果我发现了错误,我会让你保持更新。是的,我应该想到这一点!让我发布一个快速的答案,这样我可以正确地格式化所有内容。
hidden = Dense(nneurons,
               activation=hidden_act,
               kernel_regularizer=regularizer,   # <<<<<<<<<<
               name='dense{}'.format(i))(hidden)