Stage 4: 代码实现 (Implementation)
进入时手里有什么
- 通过评审的 Research Contract
- 通过评审的 实验计划
- Base paper 的 GitHub 仓库 URL
- GPU 预算约束
阶段目标
基于 base paper 的代码,实现我们的方法修改,产出可以直接在远程服务器上运行的训练代码。
具体步骤
mermaid
graph TD
A[克隆 base paper 代码] --> B[Planner: 制定实现计划]
B --> C[Coder: 逐模块实现]
C --> D[编排器: 审查研究意图]
D --> E{符合意图?}
E -->|是| F[本地测试]
E -->|否| C
F --> G{测试通过?}
G -->|是| H[Judge: 代码审查]
G -->|否| C
H --> I{Judge 判定}
I -->|approve| J[同步到服务器]
I -->|request-changes| C
J --> K[进入 Training 阶段]Step 1: 准备代码基础
执行者: Coder (Codex)
bash
# 克隆 base paper 代码
git clone https://github.com/xxx/fine-grained-dpl.git src/
cd src/
# 创建工作分支
git checkout -b feature/contrastive-decouple永远从 base paper 出发
不从零写代码。这保证了实验 setting 的一致性 — 数据加载、增强策略、评估方式都和 base paper 完全一致。
Step 2: 制定实现计划
执行者: Planner (Claude Opus)
Planner 分析 base paper 的代码结构,制定模块化的实现计划:
markdown
# Implementation Plan
## 需要修改的文件
1. `models/head.py` — 新增 ContrastiveHead 类
2. `train.py` — 集成对比损失
3. `config.py` — 添加新超参数
4. `eval.py` — 添加 FLOPs 测量
## 不修改的文件(保持和 base paper 一致)
- `models/backbone.py` — ResNet-50 骨干网络
- `data/dataset.py` — 数据加载和增强
- `data/transforms.py` — 数据变换
## 模块接口定义
### ContrastiveHead
- 输入: backbone feature (B, C, H, W)
- 输出: contrastive_loss (scalar)
- 参数: projection_dim=128, temperature=0.07Step 3: 逐模块实现
执行者: Coder (Codex)
Coder 按照实现计划,逐个模块实现。每个模块独立提交:
bash
# 模块 1: ContrastiveHead
echo "" | codex exec --full-auto -m gpt-5.4 \
"在 models/head.py 中实现 ContrastiveHead 类。
参考 models/baseline_head.py 的风格。
接口: 输入 (B,C,H,W), 输出 scalar loss。
包含 projection_dim 和 temperature 参数。"
# 模块 2: 训练循环集成
echo "" | codex exec --full-auto -m gpt-5.4 \
"修改 train.py,在训练循环中加入 ContrastiveHead。
对比损失权重为 config.contrastive_weight (默认 0.5)。
总损失 = cls_loss + contrastive_weight * contrastive_loss。"Step 4: 编排器审查
执行者: 编排器 (Claude Opus)
编排器审查 Coder 的实现是否符合研究意图。注意:编排器不审查代码质量(那是 Codex 自己的事),只审查"代码是否做了计划要它做的事"。
审查要点:
- 对比损失的实现是否和 idea 描述一致
- 推理时投影头是否真的被丢弃(验证 E2)
- 数据增强是否保持和 base paper 一致
Step 5: 本地测试
执行者: Coder (Codex)
不需要跑完整训练,只确认代码基本可用:
python
# 快速验证脚本
import torch
from models.backbone import ResNet50
from models.head import ContrastiveHead
# 模型可以初始化
model = ResNet50(pretrained=False)
head = ContrastiveHead(in_channels=2048)
# Forward 不报错
x = torch.randn(4, 3, 224, 224)
feat = model(x)
loss = head(feat, labels=torch.tensor([0, 1, 0, 1]))
print(f"Loss: {loss.item()}") # 应该是有限值
# 数据加载可以跑通
from data.dataset import CUBDataset
ds = CUBDataset(root="path", split="train")
print(f"Dataset size: {len(ds)}")Step 6: Judge 代码审查
执行者: Judge (Codex)
yaml
review: implementation-contrastive-decouple
files_reviewed:
- models/head.py
- train.py
- config.py
verdict: request-changes
comments:
- file: models/head.py
line: 45
severity: critical
issue: "对比损失缺少 stop_gradient,可能导致模式坍塌"
- file: train.py
line: 120
severity: minor
issue: "loss 权重硬编码为 0.5,应该从 config 读取"Step 7: 同步到服务器
代码审查通过后,同步到远程服务器:
bash
rsync -avz --delete --filter=':- .gitignore' \
--exclude='.git/' --exclude='wandb/' \
--exclude='output/' --exclude='outputs/' \
--exclude='models/' --exclude='*.pyc' \
~/Claude/Research/fine-grained-recognition/ \
ic2:/data/Jingxuan/fine-grained-recognition/各 Agent 职责
| Agent | 做什么 | 不做什么 |
|---|---|---|
| Planner | 制定实现计划、定义模块接口 | 不写代码 |
| Coder | 实现代码、本地测试 | 不修改研究设计 |
| 编排器 | 审查研究意图一致性 | 不审查代码质量 |
| Judge | 代码审查(质量和正确性) | 不参与实现 |
Gate 信息
| 属性 | 值 |
|---|---|
| 默认 Gate | auto-judge |
| 评审内容 | 代码审查 + 本地测试结果 |
| 通过条件 | Judge approve + 本地测试通过 |
| 最多修改轮数 | 3 |
错误处理 / 回退
| 情况 | 处理方式 |
|---|---|
| Base paper 代码跑不通 | 检查依赖版本、查看 GitHub Issues |
| Coder 实现偏离计划 | 编排器指出问题,Coder 重新实现 |
| 本地测试失败 | Coder 调试修复 |
| Judge 3 轮未通过 | 升级为 human gate |
| 实现过程发现设计缺陷 | 回退到 Design 阶段 |
回退不是失败
在实现过程中发现"这个设计在代码层面不可行"是完全正常的。这种发现要记录在 findings.md 中,然后回退到 Design 阶段修改计划。这比硬着头皮实现一个有缺陷的设计要好得多。
产出物
| 文件 | 内容 |
|---|---|
src/ | 修改后的代码(在 base paper 基础上) |
experiments/exp-*.yaml | 实验配置文件 |
| git commits | 每个模块的实现记录 |
findings.md 更新 | 实现过程中的发现 |
status.yaml 更新 | stage → implementation |