【问题标题】:Is it possible to remove categories in a pretrained tensorflow model?是否可以在预训练的张量流模型中删除类别?
【发布时间】:2018-09-18 19:17:51
【问题描述】:

我目前正在为我的人体检测应用程序使用 Tensorflow 对象检测 API。 我尝试在 API 本身中进行过滤,但它仍然有效,但我仍然没有受到它的影响,因为它很慢。所以我想知道我是否可以删除模型本身中的其他类别以使其更快。

如果不可能,由于我将使用两个摄像头,您能否给我其他建议以使 API 更快。在此先感谢,也请原谅我的英语:)

【问题讨论】:

    标签: python opencv tensorflow


    【解决方案1】:

    您的问题涉及使用神经网络预训练模型的几个主题。

    理论方法

    1. 通常,您始终可以通过移除 softmax 层中的相应神经元来中和类别,并仅使用矩阵的相关行计算新的 softmax 层。
      这种方法肯定会奏效(也许这就是您所说的过滤),但不会大大加快网络计算时间,因为大部分触发器(乘法和加法)都会保留。

    2. 与决策树类似,修剪是可能的,但可能会降低性能。我将解释修剪的含义,但请注意,您的类别的准确性可能会保持不变,因为您不仅要修剪,而且还要预测更少的类别。

    3. 将学习转移到您的问题上。请参阅斯坦福大学的计算机视觉课程here。大多数情况下,我看到效果良好的方法是保持卷积层不变,并准备一个包含您想要检测的对象的中等大小的数据集。

    如果您要求,我会添加更多的理论方法,但以上是我所知道的最常见和最准确的方法。

    实用方法

    1. 确保您是 serving 您的 tensorflow 模型,而不仅仅是使用推理 Python 代码。这可以显着提高性能。

    2. 您可以将网络的参数导出并加载到更快的框架中,例如CNTKCaffe。这些框架在 C++/CSharp 中工作,并且可以更快地进行推理。 确保正确加载权重,一些框架在保存/加载时使用不同的张量维度顺序(类似小/大端的问题)

    3. 如果您的应用程序对多个图像执行推理,您可以通过多个 GPU 分配计算。 **这也可以在 tensorflow 中完成,请参阅Using GPUs

    修剪神经网络

    也许这是使大型网络适应简单任务的最有趣的方法。可以看新手指南here

    修剪意味着您从网络中删除参数,特别是决策树/神经网络 (resp) 中的整个节点/神经元。要在对象检测中做到这一点,您可以执行以下操作(最简单的方法):

    1. 从全连接层中随机修剪神经元。
    2. 仅在您想要检测的对象上以低学习率再训练一个(或更多)epoch。
    3. (可选)多次执行上述验证并选择最佳网络。

    上述过程是最基本的过程,但您可以找到大量建议算法这样做的论文。例如 Automated Pruning for Deep Neural Network CompressionAn iterative pruning algorithm for feedforward neural networks

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2020-02-05
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多