别着急,坐和放宽
项目做得越来越大之后,直接在原先代码上加入新功能是真的会引入越来越多的bug啊。今天一天内发现两个相似的bug,实在是太可恶了!
之前代码定义的模型中,nn.Conv2d
的 kernelsize 和 stride 一一对应。但是拓展后的模型有一层不符合之前写的对应规则,导致根据 kernelsize 给 stride 赋值的代码直接出了问题。
要不是今天突然写了个assert
判断 shape 估计这辈子都不会发现。
if kernel_size == 3:
padding = 1
stride = 1
elif kernel_size == 5:
padding = 2
stride = 2
else:
raise ValueError()
之间模型中的每一层卷积后面都跟着一个nn.ReLU
。但是为了适配新的分辨率要求,设计了一个转换层,它后面并没有nn.ReLU
,它的名称规则和之前的卷积相同。与此同时,在模拟计算时,之前写的判断规则直接出错了。o( ̄┰ ̄*)ゞ
-if quant.startswith('classifier_conv'):
+if quant.startswith('classifier_conv') and quant != 'classifier_conv_transfer':
x[x < 0] = 0
总之,今天发现的两个bug都是从原先代码迁移过来加了点东西,结果判断条件失误。这些问题似乎又没有办法避免,除非在一开始就设计一个可拓展性好的架构,但一开始怎么能意识到之后可能出现的问题呢?做科研又不是做产品,过一段时间就有新的想法,感觉就更不可能考虑那么多了。