113 lines
3.8 KiB
Markdown
113 lines
3.8 KiB
Markdown
# 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](./pic/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.设定更大的聚类数/设置多层聚类进行实验
|
||
|