Keras CNN:图像的多标签分类

Posted

技术标签:

【中文标题】Keras CNN:图像的多标签分类【英文标题】:Keras CNN: Multi Label Classification of Images 【发布时间】:2021-11-18 23:22:18 【问题描述】:

我是深度学习的新手,在使用 keras 卷积神经网络执行多标签图像分类任务时遇到了一些问题。这些主要是指评估执行多标签分类任务的 keras 模型。我将对此进行一些结构化,以便首先获得更好的概述。

问题描述

基础数据集是来自不同类型的专辑封面图片。就我而言,这些是电子、摇滚、爵士、流行、嘻哈。所以我们有 5 个可能的类,它们不是互斥的。任务是预测给定专辑封面的可能类型。每个专辑封面的大小为 300 像素 x 300 像素。图像被加载到 tensorflow 数据集中,调整为 150px x 150px。

模型架构

模型的架构如下。

import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential

data_augmentation = keras.Sequential(
  [
    layers.experimental.preprocessing.RandomFlip("horizontal", 
                                                 input_shape=(img_height, 
                                                              img_width,
                                                              3)),
   layers.experimental.preprocessing.RandomFlip("vertical"),
    layers.experimental.preprocessing.RandomRotation(0.4),
   layers.experimental.preprocessing.RandomZoom(height_factor=(0.2, 0.6), width_factor=(0.2, 0.6))
  ]
)

def create_model(num_classes=5, augmentation_layers=None):
  model = Sequential()

  # We can pass a list of layers performing data augmentation here
  if augmentation_layers:
    # The first layer of the augmentation layers must define the input shape
    model.add(augmentation_layers)
    model.add(layers.experimental.preprocessing.Rescaling(1./255))
  else:
    model.add(layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)))

  model.add(layers.Conv2D(32, (3, 3), activation='relu'))
  model.add(layers.MaxPooling2D((2, 2)))
  model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  model.add(layers.MaxPooling2D((2, 2)))
  model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  model.add(layers.MaxPooling2D((2, 2)))
  model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  model.add(layers.MaxPooling2D((2, 2)))
  model.add(layers.Flatten())
  model.add(layers.Dense(512, activation='relu'))

  # Use sigmoid activation function. Basically we train binary classifiers for each class by specifiying binary crossentropy loss and sigmoid activation on the output layer.
  model.add(layers.Dense(num_classes, activation='sigmoid'))
  model.summary()

  return model

我在这里没有使用标准准确度等常用指标。在这个paper 中,我读到您无法使用通常的方法评估多标签分类模型。在第 7 章。评估指标中,我介绍了我用于此模型的汉明损失和调整后的准确度(精确匹配的变体)。

汉明损失已经由 tensorflow-addons (see here) 和我在此处找到的子集精度的实现 (see here) 提供。

from tensorflow_addons.metrics import HammingLoss

hamming_loss = HammingLoss(mode="multilabel", threshold=0.5)

def subset_accuracy(y_true, y_pred):
    # From https://***.com/questions/56739708/how-to-implement-exact-match-subset-accuracy-as-a-metric-for-keras

    threshold = tf.constant(.5, tf.float32)
    gtt_pred = tf.math.greater(y_pred, threshold)
    gtt_true = tf.math.greater(y_true, threshold)
    accuracy = tf.reduce_mean(tf.cast(tf.equal(gtt_pred, gtt_true), tf.float32), axis=-1)
    return accuracy

 # Create model
 model = create_model(num_classes=5, augmentation_layers=data_augmentation)

 # Compile model  
 model.compile(loss="binary_crossentropy", optimizer="adam", metrics=[subset_accuracy, hamming_loss])

 # Fit the model
 history = model.fit(training_dataset, epochs=epochs, validation_data=validation_dataset, callbacks=callbacks)

这个模型的问题

在训练模型时,subset_accuracy hamming_loss 有时会卡住,如下所示: 什么可能导致这种行为。老实说,我现在有点失落。这可能是垂死的relu问题的案例吗?或者是对所提到的指标的错误使用,还是这些指标的实施可能是错误的?

到目前为止,我尝试测试不同的优化器并降低学习率(例如从 0.01 到 0.001、0.0001 等),但这也无济于事。

也许有人有一个可以帮助我的想法。 提前致谢!

【问题讨论】:

【参考方案1】:

我认为您需要正确调整模型的超参数。为此,我建议尝试使用 Keras Tuner 库。 这需要一些时间来运行,但会为您获取正确的超参数集。

【讨论】:

谢谢,我会调查的。假设你在谈论这个tensorflow.org/tutorials/keras/keras_tuner? 是的,希望这会有所帮助

以上是关于Keras CNN:图像的多标签分类的主要内容,如果未能解决你的问题,请参考以下文章

Keras中具有二进制分类的多标签

Keras - 带权重的多标签分类

如何在 keras 中进行深度学习中的多标签分类?

使用 PyTorch 的多标签、多类图像分类器 (ConvNet)

多标签文本分类融合CNN-SAM与GAT的多标签文本分类模型

Keras 中具有类权重的多标签分类