【发布时间】:2023-03-28 11:48:02
【问题描述】:
我在 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 开始培训。问题是,在 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 是在做一些我不知道的事情吗?
更多实验
我还尝试将损失除以一些大数字,看看发生了什么,就像在这个 sn-p 中一样:
@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
【问题讨论】:
-
更改损失函数后得到相同值的事实有点奇怪。你能确保你在一个干净的 python 环境中运行它并且它使用了正确的函数吗?您还可以尝试返回一个常量值以使值输出可预测,并查看是否有任何不同。最后一件事是将您的实现与 Keras 的实现进行比较,该实现位于 here
-
你好 GPhilo。我在虚拟环境中运行它,一切都应该是干净的(如果这是你的意思)。另外,我尝试将损失函数更改为
return 1,但仍然没有任何变化。我将发布整个模型创建代码,以便在那里可能会发现一些奇怪的东西。 -
对不起,我的意思是一个干净的解释器(即,重新启动解释器后的新
python交互式会话,以确保函数my_mae确实是您显示的函数,而不是以前的拒绝执行)。更改为return 1并没有改变任何事情的事实让我想知道您的函数是否完全运行。模型创建代码本身并不重要,我所看到的对我来说是正确的.. -
我在 PyCharm 中工作,我很确定每次按“运行”时它都会重新初始化解释器和所有内容。我尝试了一些方法:我没有使用
build_model函数,而是创建了一个新的get_basic_model函数,我在其中对所有内容(架构、神经元等)进行了硬编码,并且在那里一切正常。这意味着当我调用构建模型时会发生一些事情。如果我发现错误,我会及时通知您。 -
是的,我早该想到的!让我发布一个快速答案,以便我可以正确格式化所有内容。
标签: python tensorflow loss-function