[LAB 01 · 固定表示:标签预算与读出](/course/notebooks/4dd8605ed9904820919ea9e13d9e7d7c.html) # 不只看一条平均曲线 · 实现代码 [独立阅读](/course/notebook-blocks/2cef56135a514fec939187e24ec21bf6.html) 按问题继续 固定CNN与缓存特征、标签预算、kNN/linear和独立评价 展开完整实现代码 ``` pred_knn=fitted[('kNN',256)].predict(features[heldout]); pred_linear=fitted[('linear',256)].predict(features[heldout]) error_local=np.flatnonzero((pred_knn!=y[heldout])|(pred_linear!=y[heldout]))[:8] fig,axes=plt.subplots(2,4,figsize=(10,5.5)) for ax in axes.ravel():ax.axis('off') for ax,j in zip(axes.ravel(),error_local): i=heldout[j];ax.imshow(x[i,0],cmap='gray',vmin=0,vmax=1) ax.set_title(f'id {sample_ids[i]} · digit={digits[i]}, y={y[i]}\nkNN={pred_knn[j]}, linear={pred_linear[j]}',fontsize=9) savefig('04-readout-errors.png') agreement={'both_correct':int(((pred_knn==y[heldout])&(pred_linear==y[heldout])).sum()), 'knn_only_correct':int(((pred_knn==y[heldout])&(pred_linear!=y[heldout])).sum()), 'linear_only_correct':int(((pred_knn!=y[heldout])&(pred_linear==y[heldout])).sum()), 'both_wrong':int(((pred_knn!=y[heldout])&(pred_linear!=y[heldout])).sum())} assert sum(agreement.values())==len(heldout) (OUT/'error-groups.json').write_text(json.dumps(agreement,indent=2));print(agreement) ```