[LAB 02 · 参数迁移:冻结、局部与全量微调](/course/notebooks/4bd450d54870432db91c80a4df563b8e.html) # 1. 先写预测,再确定协议 · 实现代码 [独立阅读](/course/notebook-blocks/97b118d3eb0d429aaf8b3875bda3f348.html) 按问题继续 同源参数的冻结/局部/全量/scratch与BN模式辨析 展开完整实现代码 ``` TRAIN_LIMIT=256 DX=2 EPOCHS=4 BATCH_SIZE=64 LEARNING_RATE=0.002 SEED=20260917 with np.load(io.BytesIO(asset_bytes['target.npz']),allow_pickle=False) as z: target={k:z[k].copy() for k in z.files} provenance=json.loads(asset_bytes['target-provenance.json']) assert 16<=TRAIN_LIMIT<=256 and -4<=DX<=4 and EPOCHS>=1 x=torch.tensor(target['images'],dtype=torch.float32)/255 def shift_x(a,dx): b=torch.zeros_like(a) if dx>=0:b[:,:,:,dx:]=a[:,:,:,:a.shape[-1]-dx] else:b[:,:,:,:dx]=a[:,:,:,-dx:] return b x=shift_x(x,DX) y=torch.tensor((target['digit_labels']>=5).astype(np.int64)) train_idx=np.flatnonzero(target['split']==0)[:TRAIN_LIMIT] val_idx=np.flatnonzero(target['split']==1) heldout_idx=np.flatnonzero(target['split']==2) train_x,train_y=x[train_idx],y[train_idx] val_x,val_y=x[val_idx],y[val_idx] assert len(set(target['official_train_ids']))==640 assert not set(train_idx)&set(val_idx) and not set(train_idx)&set(heldout_idx) print('训练/验证/保留:',len(train_idx),len(val_idx),len(heldout_idx),'固定横移',DX) print('训练标签计数',torch.bincount(train_y,minlength=2).tolist(),'验证标签计数',torch.bincount(val_y,minlength=2).tolist()) fig,axes=plt.subplots(1,8,figsize=(12,2)) for i,ax in enumerate(axes): ax.imshow(train_x[i,0],cmap='gray',vmin=0,vmax=1);ax.set_title(f'digit {target["digit_labels"][train_idx[i]]}: y={train_y[i].item()}');ax.axis('off') plt.show() ```