Keras 的多输出多分类问题



我有一个数据集,其中包含包含一/二/三/...卡。 由于我总共有 52 张不同的卡片,所以我有 52 个类 ->因此我的输出层中有 52 个神经元。

用每张图像一张卡训练网络适用于CNN。 一个标签如下所示:例如 [0,0,...,1,0,0]。 这是我的网络的最后一层,用于此任务:

model.add(layers.Dense(52, activation='softmax'))
optimizer = keras.optimizers.Adam(lr=0.00001) 
model.compile(loss='categorical_crossentropy',metrics=['accuracy'],optimizer=optimizer)

训练我的网络每个图像两张或更多张卡对我来说更具挑战性。 由于一个图像现在包含多个卡片,因此此图像的可能标签如下所示:[0,1,0,...,1,0,0]。 我会从相同的网络架构开始,但是: 我认为对于这个问题,我现在必须在最后一层使用 sigmoid 而不是 softmax(因为每个类都是独立的(。 对于损失,我只会使用类似mse = tf.keras.losses.MeanSquaredError()对于准确性,我不确定。

model.add(layers.Dense(52, activation='sigmoid'))
adam = keras.optimizers.Adam(lr=0.00001) 
model.compile(loss=mse ,metrics=['__?__'],optimizer=adam)

我对这些设置有多大错误?

我搜索了很多 - 但令人困惑的是我没有找到一些有用的评论。人们总是在使用 YOLO 时给出一些提示 - 但我不会检测物体 - 我只想分类:例如,在图片中有一个红心王牌和一个红心王 - 他们在哪里并不重要。

还有一个困惑:我多次表示CNN只能对单类问题进行分类-这是真的吗?我希望不是 - 但如果是,为什么以及如何仍然使用 keras 解决我的问题?

这是整个网络:

model = models.Sequential()
model.add(layers.Conv2D(32, (5, 5), activation='relu',input_shape=(500, 500, 3)))
model.add(BatchNormalization())
model.add(layers.MaxPooling2D((4, 4)))
model.add(layers.Conv2D(64, (5, 5), activation='relu'))
model.add(layers.MaxPooling2D((4, 4)))
model.add(BatchNormalization())
model.add(layers.Conv2D(64, (5, 5), activation='relu'))
model.add(layers.MaxPooling2D((3, 3)))
model.add(BatchNormalization())
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(52, activation='softmax'))

我多次表示CNN只能对单个类问题进行分类

这是错误的。使用CNN,您可以训练二元分类问题,多类问题以及多标签问题。实际上,多标签问题就是您正在寻找的。

多标签分类问题中,可以使用 [0,1,0,...,1,0,0] 作为目标输出。因此,对于单个输入样本,多个类可以同时为真!在这种情况下,训练有素的网络的输出可以是 [0.01, 0.99, 0.001, ..., 0.89, 0.001, 0.0001]。因此,您可以在一个网络中使用多个独立的二进制分类。

我将链接另一个非常相似的问题,我更详细地回答了这个问题。我已经解决了您可以使用的特定度量、激活和损失函数:

多标签分类

相关内容

  • 没有找到相关文章

最新更新