【问题标题】:Interclass and Intraclass classification structure of CNNCNN的类间和类内分类结构
【发布时间】:2019-08-30 06:40:09
【问题描述】:

我正在研究一个 CNN 的类间和类内分类问题,例如首先有两个类 Cat 和 Dog,而不是 Cat 中有一个分类三个不同品种的猫,而 Dog 中有 5 个不同的品种小狗。

我还没有尝试过编码,只是在研究可​​行性,如果可行的话。 我的问题是这种问题的可行设计是什么。 我正在考虑为训练设计第一个 CNN-1 网络,它将区分猫和狗并收集所有训练图像的图像数据。猫狗分离后,CNN-2 和 CNN-3 将针对每个品种的狗和猫进一步训练这些图像。我只是不确定在这种情况下测试将如何进行。

【问题讨论】:

  • 如果CNN-1的预测不正确,后面的CNN-2、CNN-3也会不正确。我不确定预测的预测会产生什么好的结果。
  • 这种情况有什么可能的解决方案吗?有任何已发表的作品吗?

标签: matlab deep-learning computer-vision conv-neural-network


【解决方案1】:

我之前在 Python 中遇到过类似的问题。希望这对您有所帮助,如果您正在使用,您可以在 Matlab 中提出一个替代实现。

说了这么多,我最终选择了一个模型来进行所有预测。出于您的目的,您可以有一个用于狗与猫的二进制输出,另一个用于狗品种的多类输出,以及另一个用于猫品种的多类输出。

使用 Tensorflow,我为不相关的类创建了一个掩码。例如,如果图像是一只猫,那么所有的狗品种都是不相关的,它们不应该影响该示例的模型训练。这需要一个自定义的 TF 数据集(将掩码的 0 转换为 -1)和一个自定义的损失函数,当该示例存在掩码时返回 0 错误。

最后是训练过程。 具体到您的问题,您必须创建自定义精度函数,以按照您的要求处理掩码值,否则这部分过程应该是标准的。最佳做法是在训练数据中均匀分布类,但它们都可以一起训练。

如果您在 Google 上搜索“多任务训练”,您可以找到解决此问题的其他资源。

如果您有兴趣,这里有一些代码片段:

对于隐藏不相关标签的自定义 TF 数据集...

# Replace 0's with -1 for mask when there aren't any labels
def produce_mask(features):
    for filt, tensor in features.items():
        if "target" in filt:
            condition = tf.equal(tf.math.reduce_sum(tensor), 0)
            features[filt] = tf.where(condition, tf.ones_like(tensor) * -1, tensor)
    return features


def create_dataset(filepath, batch_size=10):
    ...

    # **** This is where the mask was applied to the dataset
    dataset = dataset.map(produce_mask, num_parallel_calls=cpu_count())

    ...

    return parsed_features

自定义损失函数。我使用的是二元交叉熵,因为我的问题是多标签。您可能希望将其调整为分类交叉熵。

# Custom loss function
def masked_binary_crossentropy(y_true, y_pred):
    mask = backend.cast(backend.not_equal(y_true, -1), backend.floatx())
    return backend.binary_crossentropy(y_true * mask, y_pred * mask)

然后是自定义准确度指标。我使用的是 top-k 精度,您可能需要根据您的目的进行修改,但这会给您一个大致的想法。将其与损失函数进行比较时,该函数不会将所有值都转换为 0,否则会过度夸大准确性,而是将这些值完全过滤掉。之所以可行,是因为输出是单独测量的,因此每个输出(二进制、猫品种、狗品种)都会有不同的准确度度量,仅过滤到相关示例。

backend 是 keras 后端。

def top_5_acc(y_true, y_pred, k=5):
    mask = backend.cast(backend.not_equal(y_true, -1), tf.bool)
    mask = tf.math.reduce_any(mask, axis=1)
    masked_true = tf.boolean_mask(y_true, mask)
    masked_pred = tf.boolean_mask(y_pred, mask)
    return top_k_categorical_accuracy(masked_true, masked_pred, k)

编辑

不,在我上面描述的场景中,只有一个模型,它是用所有数据一起训练的。单个模型有 3 个输出。掩码是其中的主要部分,因为它允许网络仅调整与示例相关的权重。如果图像是猫,那么狗品种预测不会导致损失。

【讨论】:

  • 感谢克里斯的回答。我唯一担心并试图找出解决方案的是培训部分。我们是否必须分别训练三个不同的 CNN 来对狗和猫进行分类。 CNN 的第 2 和第 3 届猫狗品种?
  • 所以它是一个单一的模型而不是树形模型?
  • 模型发表在任何期刊或会议上?
猜你喜欢
  • 2018-06-13
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2018-07-08
  • 2021-05-04
相关资源
最近更新 更多