[LAB 02 · 参数迁移:冻结、局部与全量微调](/course/notebooks/4bd450d54870432db91c80a4df563b8e.html) # 3. 运行比较:用验证集选每组的停点 · 实现代码 [独立阅读](/course/notebook-blocks/57c45842cea34b3f94d8cebb61d29d93.html) 按问题继续 同源参数的冻结/局部/全量/scratch与BN模式辨析 展开完整实现代码 ``` @torch.no_grad() def evaluate_binary(model,xx,yy): model.eval();scores=model(xx) return {'ce':float(F.cross_entropy(scores,yy)), 'accuracy':float((scores.argmax(1)==yy).float().mean())} torch.use_deterministic_algorithms(True) generator=torch.Generator().manual_seed(SEED+2) orders=[torch.randperm(len(train_y),generator=generator) for _ in range(EPOCHS)] models={};records={} for mode in MODES: model=make_target_model(mode) frozen_before={n:p.detach().clone() for n,p in model.named_parameters() if not p.requires_grad} optimizer=torch.optim.Adam([p for p in model.parameters() if p.requires_grad],lr=LEARNING_RATE) best_ce=float('inf');history=[];start=time.perf_counter() for epoch,order in enumerate(orders,1): model.train() for ids in order.split(BATCH_SIZE): optimizer.zero_grad();loss=F.cross_entropy(model(train_x[ids]),train_y[ids]);loss.backward();optimizer.step() tr=evaluate_binary(model,train_x,train_y);va=evaluate_binary(model,val_x,val_y) history.append({'epoch':epoch,'train_ce':tr['ce'],'val_ce':va['ce'],'val_accuracy':va['accuracy']}) if va['ce']