开始做新项目啦QAQ
一些背景知识
什么是无监督式,监督式学习?
在正文开始前,我想搞懂这个问题是非常重要的。在目前的机器学习领域,大概把训练(/学习)过程分为三类,一类是监督式学习,一类是半监督式学习,一类是无监督式学习。自学习目标分类器/检测器正是属于无监督式学习的范畴。半监督式学习在这里就不展开说了。下面大概说一下自己对剩下两种模式的理解:
监督式学习
顾名思义,就是人为提供数据与标定。比如在目标分类中,每张图片标定一个onehot编码/数字索引。在目标检测中每张图片提供一些bounding box坐标。以上的这些把数据人为标定上一定的值,输入网络,进行训练,从而拟合出一个合适的数据关于标定的“公式” 的思路,称为监督式学习。
无监督式学习
不提供标定好的数据,直接向网络输入数据,由网络根据输入数据,进行特征提取,从而输出结果。意义:有些数据人工无法标定;有些数据,人工标定的难度太高。
自学习目标分类器
在探究了自学习目标分类器后,我觉得它应该算是最简单的无监督式学习demo了。它的主题思想如下:
训练
将矩阵输入backbone后得到fmap,再将fmap做聚类。不过此处有个地方,我还是不太理解。就是在数据不确定的情况下,如何用手肘法确定合适的K值。(后面再仔细想想)
预测
经过聚类后,假设我们得到了n个类别。此时,便完成了学习的过程(特征提取并分类)。之后,我们便可以进入预测。假设此时有一个图像矩阵输入网络,得到了fmap。我们的目标是为了得到这个fmap的类别(即图像矩阵的类别)。而再上一步中,我们已经通过聚类获得了n个类别了。那么,判断这个fmap的类别也非常简单了。我们只需计算这个fmap和n个类别中心点的距离,找出距离最小值所对应的类别中心点索引,就可以实现对fmap类别的分类。
实操
嘴上说起来还是挺简单的QAQ,但是许多问题还是要实操下才行。这样才会暴露一些bug出来。明天早上再去研究研究,今天就先写这么多吧。
运行效果
一些重要的地方
K值如何确定?
经过,今早的思考。我认为,这个K值是无需像yolo里面的anchor聚类一样,通过手肘法找到K值。K值就是分类值(你希望把一个数据的特征,用多少个特征中心点表示(/概括))
backbone选择?
根据对以上原理的推敲,我们希望backbone输出是个fmap。故我们只需要找个合适的backbone,假如它的输出就是fmap的话,那再好不过了(比如mobilenet 的no include top)。如果他的输出不是fmap,我们只需要在顶层重新加个conv就行。
刚好最近对于无监督的目标检测没啥思路,所以打算下周一开始,花个1-3天左右,在pc上搭个自学习目标分类器看看。以便于自己更加深入了解整个搭建过程中的思路,收获一些灵感,为后面做无监督目标检测提供些灵感。