使用keras的多分类任务

Multiclassification task using keras

问题是对一张图像中的多个对象进行分类(不是检测!)。我怎样才能使用 keras 做到这一点。

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

关键字是“多标签class化”。 在输出层你有多个神经元,每个神经元代表你的 classes.

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

将其实现到 Keras/Tensorflow 中非常容易。 您可以使用一些 binary_crossentropy 作为您的 损失函数 和 Sigmoid 函数作为最后一层中的 激活 。因此,对于每个输出神经元,您都将获得区间 (0, 1) 中的值。 作为 指标 ,您可以使用准确性,它告诉您有多少图像以正确的方式 class 化(作为相对频率)。

参见以下示例:

from tensorflow.keras.layers import *
from tensorflow.keras.activations import *
from tensorflow.keras.models import *
from tensorflow.keras.optimizers import *
import numpy as np

# put your data right here:
num_classes = 3 # here I'm assuming 3 classes, e.g. dog, cat and bird
x_train = np.zeros((100, 128, 128, 3)) # I'm just using zeros to simplify the example
y_train = np.zeros((100, num_classes))

model = Sequential()
# put your conv layer / conv blocks here:
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。 希望对您有所帮助:)