Python 关于使用张量流自定义对象检测增加类数/附加数据的微调模型的问题

Python 关于使用张量流自定义对象检测增加类数/附加数据的微调模型的问题,python,api,tensorflow,object,detection,Python,Api,Tensorflow,Object,Detection,使用Tensorflow的定制对象分类API w/SSD MobileNet V2 FPNLite 320x320作为基础,我能够训练我的模型,以便使用训练数据1(大约200张图像)成功检测类别A和B。这在只有A类和B类图像的测试集1上表现良好 我想向模型中添加几个类,所以我构建了一个单独的数据集TrainingData2(大约300幅图像)。该数据集包含B类和新的C、D和E类的标记数据。但是,它不包括A类的数据。根据该数据对模型进行训练后,它在仅包含B、C、D和E图像的测试集2上表现良好(尽管

使用Tensorflow的定制对象分类API w/SSD MobileNet V2 FPNLite 320x320作为基础,我能够训练我的模型,以便使用训练数据1(大约200张图像)成功检测类别A和B。这在只有A类和B类图像的测试集1上表现良好

我想向模型中添加几个类,所以我构建了一个单独的数据集TrainingData2(大约300幅图像)。该数据集包含B类和新的C、D和E类的标记数据。但是,它不包括A类的数据。根据该数据对模型进行训练后,它在仅包含B、C、D和E图像的测试集2上表现良好(尽管有额外数据,B上的准确度没有提高)

考虑到这一点,我在测试集1上再次检查了模型的准确性,正如我所假设的,模型根本不识别A类。在本例中,我假设我实际上没有改进模型,而是完全重新训练了模型

我的问题:假设我不能在一组完全独立的数据上优化模型,而如果我想在我的训练模型中添加更多的类,我必须结合训练集1和训练集2,并在整个数据上进行训练,我的假设是否正确


谢谢大家!

这主要取决于你的超参数,即你的学习速度和训练的历元数。较高的学习率将使模型更快地忘记旧数据。另外,确保不要过度拟合数据,还要有一个验证集。过度拟合训练数据的模型往往对权重(和数据)扰动非常敏感

TLDR。如果没有对所有数据进行训练,ML模型往往会忘记旧数据而代之以新数据。

有很多“活动部分”。我建议如下:

  • 将“SSD MobileNet V2 FPNLite 320x320”作为没有最后一个分类层的基本模型(加载模型时参数include_top=False),并使用命令basemodel.trainable=False冻结其参数

  • 使用命令prediction_layer=tf.keras.layers.densed(1)添加新的预测层,并制作其他所需的内容(详细信息在第页中逐步介绍)

  • 完成上述步骤后,验证您是否了解新网络的哪些参数(包括“旧”卷积部分和您自己的新预测层)是可训练的,哪些是不可训练的。如果需要,请更改超参数

    接下来,使用标准程序对网络进行培训

    根据你的想法直接使用最终的课程数量(25)。如果您还没有所有类的数据,请不要担心,为此生成一些随机图像,当然要考虑到结果对于没有适当数据的类是无效的

    为了简单起见,将数据(主要独立于课程数量)划分为培训和测试数据,而不是更复杂的第一手数据。当数据量增加时,统计数据将减少抽样问题。在培训时,监控数据量如何提高分类性能

    因此-简而言之-1)让网络-2)选择要训练的参数-3)使用一个数据集训练,4)使用另一个数据集测试

    最后,在标题和问题末尾直接回答问题:

    -根据经验,首先通过只训练网络的最后几层来利用basemodel的所有性能。在您确定用这种方法无法获得更多性能后,开始仔细调整卷积层的超参数


    -只有使用自己的新数据,才能完全优化模型;这是迁移学习的特殊好处和艺术

    感谢您的回答!我会记住这一点。我应该指定,但我的数据集实际上被分成了培训/验证集。很抱歉,我只想澄清最后一件事:我目前有5门课的数据,但我的最终目标是~25门课。我最好从一开始就将pipeline.config中的类数设置为25,并在获得数据集时将这些类的数据添加到数据集中,还是在添加相应数据时增加类数?再次感谢!我建议您在获得更多类时增加类的数量,因为当您获得更多数据时,您应该使用整个数据集从头开始重新培训。感谢您的快速响应!似乎我对如何调整模型有很大的误解。当添加新数据时,没有办法避免从头开始训练模型?从头开始我的意思是使用与训练第一个模型相同的程序(使用MobileNet作为基础)。由于您的数据集很小(这个问题可能更适合在另一个论坛上讨论,似乎是一个机器学习问题,而不是编程问题)