使用Keras进行多类别分类任务

在一个图像中对多个对象进行分类(不是检测!)是问题所在。我如何使用Keras来实现这一点?

例如,如果我有6个类别(狗、猫、鸟等),并且图像中有两个不同的对象(一只猫和一只鸟)。标签将是这种形式:[0,1,1,0,0,0]。推荐使用哪种指标、损失函数和优化器?我想使用CNN。


回答:

关键词是“多标签分类”。在输出层,你有多个神经元,每个神经元代表你的一个类别。

现在,你应该对每个神经元独立地使用二分类。所以,如果你有3个类别,你的网络输出可能是[0.1, 0.8, 0.99],这意味着以下内容:第一类别对你的图像的概率为10%是真的,第二类别为80%,最后一类别为99%。因此,网络决定对于单个输入图像同时有两个类别是真的!

将这实现到Keras/Tensorflow中非常简单。你可以使用binary_crossentropy作为你的损失函数,并在最后一层使用Sigmoid函数作为激活函数。因此,每个输出神经元的值将在区间(0, 1)内。作为指标,你可以使用准确率,它会告诉你有多少图像被正确分类(作为相对频率)。

请看以下示例:

from tensorflow.keras.layers import *from tensorflow.keras.activations import *from tensorflow.keras.models import *from tensorflow.keras.optimizers import *import numpy as np# 把你的数据放在这里:num_classes = 3 # 这里我假设有3个类别,例如狗、猫和鸟x_train = np.zeros((100, 128, 128, 3)) # 我只是使用零来简化示例y_train = np.zeros((100, num_classes))model = Sequential()# 把你的卷积层/卷积块放在这里:model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=(128, 128, 3)))model.add(Flatten())model.add(Dense(units=num_classes, activation='sigmoid'))    model.compile(        loss="binary_crossentropy",        optimizer=Adam(0.005),        metrics=["accuracy"])training_history = model.fit(x=x_train, y=y_train, epochs=5)

我使用的是Tensorflow 2.2.0。我希望这对你有帮助 🙂

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中创建了一个多类分类项目。该项目可以对…

发表回复

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