From ae6d101981a995fcb76e9f412d8394c152616201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=8A=B3=E5=B7=9E?= <744976956@qq.com> Date: Thu, 14 Nov 2024 22:12:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 11月15日本周科研工作进展.md | 112 ++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 11月15日本周科研工作进展.md diff --git a/11月15日本周科研工作进展.md b/11月15日本周科研工作进展.md new file mode 100644 index 0000000..187b1d8 --- /dev/null +++ b/11月15日本周科研工作进展.md @@ -0,0 +1,112 @@ +# 11月15日本周科研工作进展 + +## 1.对上周的设计进行修改,增加阶段训练法 + +```python +if stage_num == 1: + # 阶段1:仅训练q/k编码器,不使用MLP + pass +elif stage_num == 2: + # 阶段2:冻结q/k编码器,仅训练MLP层 + for param in self.encoder_q.parameters(): + param.requires_grad = False + for param in self.encoder_k.parameters(): + param.requires_grad = False + if self.a is not None: + for param in self.a.parameters(): + param.requires_grad = True + if self.b is not None: + for param in self.b.parameters(): + param.requires_grad = True +elif stage_num == 3: + # 进行完整训练 + for param in self.encoder_q.parameters(): + param.requires_grad = True + for param in self.encoder_k.parameters(): + param.requires_grad = True + if self.a is not None: + for param in self.a.parameters(): + param.requires_grad = True + if self.b is not None: + for param in self.b.parameters(): + param.requires_grad = True +elif stage_num == 4: + # 阶段4:解冻MLP层,冻结q/k编码器,仅训练MLP层 + for param in self.encoder_q.parameters(): + param.requires_grad = False + for param in self.encoder_k.parameters(): + param.requires_grad = False + if self.a is not None: + for param in self.a.parameters(): + param.requires_grad = True + if self.b is not None: + for param in self.b.parameters(): + param.requires_grad = True +elif stage_num == 5: + # 阶段5:解冻所有参数,进行全面训练 + for param in self.encoder_q.parameters(): + param.requires_grad = True + for param in self.encoder_k.parameters(): + param.requires_grad = True + if self.a is not None: + for param in self.a.parameters(): + param.requires_grad = True + if self.b is not None: + for param in self.b.parameters(): + param.requires_grad = True +``` + +#### 实验: + +实验中stage设置如下: + +```python +parser.add_argument('--stage1_epoch_num', default=20, type=int) +parser.add_argument('--stage2_epoch_num', default=5, type=int) +parser.add_argument('--stage3_epoch_num', default=50, type=int) +parser.add_argument('--stage4_epoch_num', default=5, type=int) +parser.add_argument('--stage5_epoch_num', default=70, type=int) +``` + +#### 效果: + +​ 目前未训练完整,只训练了53epoch,效果如下: + +![log5](/home/ringo/文档/PCL/experiment/log5.png) + +​ 由于增加了batchsize,显得训练速度相较于epoch较慢。但Loss在ProtoNCE阶段下降缓慢,考虑可能为学习率较低和梯度更新方式导致。Acc_inst正常更新,Acc_Proto更新较慢,怀疑以下问题: + +​ 1. 目前采用的最后一层结构为两层全连接加1层relu,考虑改变结构 + +​ 2. stage2更新MLP层时未更新到位,使得最后一层拖了后腿,考虑增加学习率多epoch训练 + +​ 3. 设计的最小聚类数过低,或者聚类翻倍数(1.7倍)不够正确 + + + +## 2.改进聚类 + +### 1.对最大聚类数和最小聚类数进行改进 + +#### 理由: + +​ 在聚类中,我们不希望聚类中样本数量有太大偏差,以确保聚类均匀稳定,但又不能设定一个过小的范围导致聚类无法收敛。 + +#### 修改: + +​ 以样本数/聚类数作为均值,将聚类中簇样本数视为正态分布,[0-均值]为-3标准差范围,将[-1标准差,1标准差]的68.3%概率的空间作为聚类数的限定空间,以保证输出的平稳,同时保证了一定冗余,以保证在最大迭代次数内能获得聚类结果。 + + + +# 下周任务 + +#### 1.优化投影头结构与训练流程,提升训练效果 + +##### 目前思路 + +​ 1.考虑将Relu层放到两个全连接层中间,以保证输出结构与原结构类似。 + +​ 2.增加不同stage的学习率策略 + +​ 3.设定更大的聚类数/设置多层聚类进行实验 +