Report/11月8日本周科研工作进展.md

105 lines
4.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 11月8日本周科研工作进展
## 1.修改模型设计,对每个任务增加不同的独立参数空间
### 原设计:
![](./pic/des.png)
正如上图所示两个对比任务共享所有的参数但Info_NCE是直接计算两组编码器生成的特征的相似度而Proto_NCE是计算样本特征和原型特征特征簇的中心之间的相似度。同时在设置目的层面两个任务之间也有差异。Info_NCE是实例驱动的主要目的是实现对实例级物体的区分而Proto_NCE则是对原型级物体进行区分原型粒度越粗二者区别越大。
在SimCLR和moco_v2中都有一个创新即在编码器后不是简单地输出特征而是加入了一个非线性的投影头以提升训练效果。这个思路同样可以用到PCL中如果我们需要在对聚类前动量编码器提取到的特征做一些修正以让它们得到更有特点的原型同时不影响原模型的特征提取能力的话可以考虑在训练过程中增加针对任务的MLP以非共享的参数促进不同任务的进行。
### 新设计:
![](./pic/des2.png)
投影头a与a~均为一个128✖128的全连接层与relu层的设计投影头b在投影头a~的基础上额外增加了128✖128的全连接层以及一个relu层以提供对聚类任务的额外支持。
```python
self.encoder_q.fc = nn.Sequential(nn.Linear(dim_mlp, dim_mlp), nn.ReLU(), self.encoder_q.fc)
self.encoder_k.fc = nn.Sequential(nn.Linear(dim_mlp, dim_mlp), nn.ReLU(), self.encoder_k.fc)
self.v = nn.Sequential(nn.Linear(128, 128), nn.ReLU())
...
if cluster_result is not None:
k = self.v(k)
```
#### 效果:
训练速度降低尤其是acc_inst在warmup阶段可能与启用了**颜色抖动**的数据增强效果有关,正在排查。
#### 可能的改进:
设置更多的warmup轮数以在编码器有一定特征提取能力的基础上再进行投影头的训练以避免训练无法找到方向。
## 2.改进训练细节
### 1.改用混合精度autocast增大batch_size
#### 理由:
提升训练速度部分论文指出较大的batch_size能提升训练效果和稳定loss**Training Deep Neural Networks with Large Mini-Batches**、**ResNet strikes back: An improved training procedure in timm**
#### 问题:
计算特征出现内存不足报错。
#### 修改:
修改compute_features逐批计算特征并保存每批次保存一个文件以避免内存溢出。
```python
# 遍历数据加载器中的每个批次
for i, (images, index) in enumerate(tqdm(eval_loader)):
with torch.no_grad():
images = images.cuda(non_blocking=True)
feat = model(images, is_eval=True)
# 将每个批次的特征保存到文件中
feature_filename = os.path.join(feature_save_dir, f'batch_{i}_features.pt')
torch.save(feat.cpu(), feature_filename)
del feat # 计算完后释放内存
```
#### 效果:
训练速度提升。
### 2.改用lamb优化器取代SGD
#### 理由:
lamb优化器有着自动调整学习率的能力对于更高的epoch效果更好
#### 问题:
出现acc_inst异常升高甚至在较低epoch下达到100的情况同时出现**loss:nan**。排查可能为梯度爆炸。
#### 解决办法:
使用梯度裁剪的方式避免梯度爆炸:
```python
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
```
#### 效果:
仍存在acc_inst异常升高和lossnan的问题暂时放弃lamb改用SGD优化器+cos学习率下降模式后续考虑lamb或者adam优化器。
# 下周任务
#### 1.优化投影头结构与训练流程,提升训练效果
### 目前思路
## 1.InfoNCE阶段
stage1训练两个mlp都没有的模型 0-19epoch
stage2编码器q、k都增加一个mlp层a/b冻结编码器参数专心调整mlp 20-24epoch
## 2.ProtoNCE阶段
stage3解冻编码器参数冻结mlp参数进行原型训练 25-74epoch
stage4解冻mlp参数冻结编码器参数专心调整mlp。 75-79epoch
stage5解冻mlp参数进行完整训练。 80-150epoch
#### 2.进行实验,修改可能的错误