(本文架构如下)
背景知识
网络架构与训练过程
作者卖点
损失函数
解决的问题及存在的不足
代码流程及关键组件
改动实验
相关工作(之后要补Re-ID的时候再来)
一.背景知识:
1.self-paced learning(自步学习):
即先学简单的,再学难的。
二.网络架构与训练过程:
网络架构:
- 用有标签数据首先训练一个模型。
- 无标签数据经模型会有伪标签,还能选出可靠数据集。
- 用可靠数据集再从头训练模型,存起来。
- 下一次,无标签数据再取上一次存起来的模型继续聚类。
所以,其实就一个模型。只不过每次训练数据都会升级就是了。
训练过程:
step1:ImageNet上预训练的ResNet
step2:用不相关的有标签数据对网络进行初始化
step3:将无标签的数据喂给网络,进行聚类。(聚类到底是怎样的,如何初始化聚类中心)(觉得这个初始点的选择应该很重要吧)
step4:选择离中心最近的几个点,加入“可靠训练集”。训练集的标签即为k-means的k。
step5:将“可靠训练集”的数据喂给网络再次训练。因为模型会越来越好,所以接近聚类中心的样本会随着epoch增加,即本文的卖点之一。(为避免陷入局部最优,先从“可靠度”最高的样本训练起)
step6:以上3,4,5环节周而复始。直到每次选择的个数稳定。
三.作者卖点:
PUL(progressive unsupervised learning):
可靠样本的数目会随着模型的质量增加。
四.损失函数:
: 图片数量
: 聚类中心的个数
: 是否选择该样本,
: 标签,
: CNN模型的参数
: 分类器的参数
: 聚类的中心
: 选择“可靠”的门槛
: 损失函数
1. :类似均方差损失。使特征离聚类中心越来越近。
2. :使标签样本近一步离聚类中心越来越近。加第二项是因为,若没有会使得
趋向0。
确保每一类至少有一个可靠样本。
.
3. :普通的交叉熵损失。
五.解决的问题及可以再思考的地方:
1.解决的问题:
(1)用无标签数据(或 其他域有标签数据及无标签数据)训练模型。
(2)把K-means和CNN结合,减轻了cluster太过noisy的问题。
(3)用自步学习更加流畅地完成模型训练。(这个是个很好的点,ECN 近邻的地方没准还可以照着改一下)
2.可以再思考的地方:
pass
六.代码流程及关键组件:
(一)baseline的train文件
- 设置设备,设置session, 设置加载模型
- baseline上加一个全链接层
- 设置每一层都是不冻结的
- 处理图片
- batch_size数据增强
- 设置训练和评估的常规。并行地一批一批地训练。保存模型。
(二)baseline的evaluate文件
- 提取特征
- 计算相似度,设置session
- 加载模型(所有epoch后,第40个模型),计算mAP,CMC
(三) PUL无监督文件
- (不再重复)设置session, 数据增强,用GPU计算相似度
- 取每一个eopch训练完的模型,提取特征,聚类
- 算欧式距离,选最小,取中心。
- 选出可靠图片。给无标签数据加标签
- 再从第一个模型开始加载,利用刚才的伪标签做分类任务
(四)PUL半监督文件
- 和无监督差不多,不同就在于,将有标签的数据和伪标签的放在一起,用以训练。
七.改动实验:
(一)对于数据的理解:
-
#如果 Keras 用下面这句话,你是打印不出来它的,会打印出类的信息 img=image.load_img(0s.path.join(TRAIN,img),target_size=[224,224]) #这里有一个点就是 图片原本是100×251的,但是这里作者强行把它变成了一个方形 难道是为了方便运算? 而且空白的地方貌似没有补零,补其他的内容不会有影响吗
-
#该类有一个 .size成员变量,注意不是.size()
-
#如果要对其进行处理的话(如升降维,通道处理等),需变为array img=image.img_to_array(img) #打印一下就会知道,它是一个三维的东西,最里面三个通道,再一层为行,最外面是列 #如此,就可知道图像处理成数字的样子
-
#这个有一个升维的处理。 第一个参数表示在最外面升了一维 img=np.epend_dims(img,axis=0) #打印以下即可看到是一个四维的东西。
-
#最后要对图像进行处理 img=preprocess_input(img) #之后会再输出一个类 #如果打印其成员变量就会输出一个整数值,这个值的内容刚好是将所有的维数都展开了, #所以,我们就知道前面升维的意义何在了。不升维外面就会没有包的东西。 #但是最后打印images的时候为啥又变成四维的了 >_<
(二)batch_size的实验的影响探究
诶~ 预计这个实验要跑完需要40hours,咱们就不跑了,放到其他快一点的实验上来做昂。只是跑起来了。