首页 > 解决方案 > 简单的封闭式自定义损失函数不起作用

问题描述

我试图实现自定义损失函数。所以我首先尝试通过直接封闭其中一个默认的 keras 损失函数来制作自定义函数。tf.keras.losses.categorical_crossentrophy

但它没有用。这怎么可能???我过去曾使用过自定义函数,而就在今天,这让我感到震惊。为什么它不起作用?我怎样才能使这个简单的功能起作用?

@tf.function
def sameloss(y_true, y_pred):
    output = tf.keras.losses.categorical_crossentropy(y_true, y_pred)
    return output

我编译它使用 model.compile(optimizer=tf.keras.optimizers.RMSprop(), loss=sameloss)

在训练过程中,损失只是停留在 10,并且没有移动。但是当我loss=tf.keras.losses.categorical_crossentropy在编译期间直接将损失设置为时,它运行良好并且损失飞到零。但是当我将它设置为包含在我的自定义sameloss函数中的相同损失函数时停止工作loss=sameloss

标签: pythontensorflowmachine-learningkeras

解决方案


我能够在 TF 2.4 中执行您的自定义损失函数,请参考如下所示的工作代码

import numpy as np
import tensorflow as tf
print(tf.__version__)

@tf.function
def sameloss(y_true, y_pred):
    output = tf.keras.losses.categorical_crossentropy(y_true, y_pred)
    return output

input = np.random.rand(1000,15)
labels = np.random.rand(1000,15)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(5))
model.add(tf.keras.layers.Dense(15))
model.compile(optimizer='RMSprop', loss=sameloss)

model.fit(input, labels, epochs=5)

输出:

2.4.1
Epoch 1/5
32/32 [==============================] - 0s 1ms/step - loss: 48.8549
Epoch 2/5
32/32 [==============================] - 0s 976us/step - loss: 43.7030
Epoch 3/5
32/32 [==============================] - 0s 1ms/step - loss: 39.2598
Epoch 4/5
32/32 [==============================] - 0s 1ms/step - loss: 37.5566
Epoch 5/5
32/32 [==============================] - 0s 1ms/step - loss: 34.7458
<tensorflow.python.keras.callbacks.History at 0x7f11f03b3fd0>

推荐阅读