如何在Keras中使用自定义损失函数

我最近了解到焦点损失函数,听说它主要用于处理不平衡数据集。所以我尝试在Cifar10数据集上使用我在网上找到的这个简单的焦点损失函数(适用于Keras)。

我不断遇到一个错误,错误信息我已经在最后提到了。我尝试了几种方法来解决它,但都没有成功。请帮我看一下,我非常感谢你的帮助。谢谢你!

焦点损失

输入数据

from keras.datasets import cifar10(xtrain,ytrain),(xtest,ytest) = cifar10.load_data()

神经网络

from keras.layers import Dense, Conv2D, Flatten, MaxPool2Dfrom keras.models import Sequentialfrom keras.optimizers import Adammodel = Sequential([      Conv2D(filters=64, kernel_size=(27,27), strides=(1,1), input_shape=(32,32,3),padding='same', activation='sigmoid'),      MaxPool2D(pool_size=(13,13), strides=(1,1), padding='valid'),      Conv2D(filters=32,  kernel_size=(11,11), strides=(1,1), padding='valid', activation='sigmoid'),      Flatten(),      Dense(units=600, activation='sigmoid'),      Dense(units=128, activation='sigmoid'),      Dense(units=10, activation='softmax')])

编译和拟合

model.compile(loss=FocalLoss, optimizer=Adam(learning_rate=0.0001), metrics=['accuracy'])model.fit(xtrain, ytrain, epochs=10, batch_size=120, validation_data=(xtest,ytest), verbose=2)

拟合时出现的错误

Epoch 1/10---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)<ipython-input-52-52246069690d> in <module>()----> 1 model.fit(xtrain, ytrain, epochs=10, batch_size=120, validation_data=(xtest,ytest), verbose=2)10 frames/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)    971           except Exception as e:  # pylint:disable=broad-except    972             if hasattr(e, "ag_error_metadata"):--> 973               raise e.ag_error_metadata.to_exception(e)    974             else:    975               raiseTypeError: in user code:    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:806 train_function  *        return step_function(self, iterator)    <ipython-input-50-e8cbeb45fe58>:12 FocalLoss  *        BCE = K.binary_crossentropy(targets, inputs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper  **        return target(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py:4829 binary_crossentropy        bce = target * math_ops.log(output + epsilon())    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:1141 binary_op_wrapper        raise e    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:1125 binary_op_wrapper        return func(x, y, name=name)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:1457 _mul_dispatch        return multiply(x, y, name=name)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper        return target(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:509 multiply        return gen_math_ops.mul(x, y, name=name)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gen_math_ops.py:6176 mul        "Mul", x=x, y=y, name=name)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:506 _apply_op_helper        inferred_from[input_arg.type_attr]))    TypeError: Input 'y' of 'Mul' Op has type float32 that does not match type uint8 of argument 'x'.

注意

xtrain和ytrain的dtype是相同的,即’uint8′


回答:

问题与你的目标类型有关,它们是int8类型,但你需要将它们转换为float32类型。我在损失函数内部进行了转换,并且移除了flatten部分,因为那是错误的

def FocalLoss(targets, inputs, alpha=ALPHA, gamma=GAMMA):            targets = K.cast(targets, 'float32')    BCE = K.binary_crossentropy(targets, inputs)    BCE_EXP = K.exp(-BCE)    focal_loss = K.mean(alpha * K.pow((1-BCE_EXP), gamma) * BCE)        return focal_loss

这里是运行的笔记本:https://colab.research.google.com/drive/1E89tggfCvifuoJRdGuXTHuBQPvXFCYN4?usp=sharing

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注