深度学习——Re-ID——读,运行Unsupervised-Person-Re-identification-Clustering-and-Fine-tuning

(本文架构如下)

背景知识

网络架构与训练过程

作者卖点

损失函数

解决的问题及存在的不足

代码流程及关键组件

改动实验

相关工作(之后要补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):

                         可靠样本的数目会随着模型的质量增加。

                

 


四.损失函数:

N:  图片数量

K:  聚类中心的个数

V:   是否选择该样本,v_i\epsilon 0,1

Y:  标签,y_i\epsilon 1,...,k

\phi (.;\theta ):  CNN模型的参数

w:  分类器的参数

c_k:  聚类的中心

\lambda:  选择“可靠”的门槛

L:  损失函数

 

1.    :类似均方差损失。使特征离聚类中心越来越近。

2. :使标签样本近一步离聚类中心越来越近。加第二项是因为,若没有会使得v_i 趋向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,咱们就不跑了,放到其他快一点的实验上来做昂。只是跑起来了。


 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值