DenseNAS
DenseNAS copied to clipboard
有关代码的一些问题
您好,非常赞赏你们的工作,有两个地方不太理解,想请教一下。 1 论文中讲到需要有2 个更新的参数,一个是在head layer 里用于选择从前面哪个通道的block中接收输入,还有一个是 stack layer里操作的选择。但是在代码里,却有3个参数,分别是 betas, head_alphas, stack_alphas ,多出来了一个是有关本block输出可以去向哪些block的,这样设置的作用是什么? 2 数据集被分成了train和valid两个部分,在weights更新的步骤里用的是train数据,在arch更新的步骤里用的是valid数据,但是在infer时用的还是valid数据,这部分数据不应该已经被网络学习过了吗?是不是应该用其他的数据再去做infer? 这是我想不明白的2个问题,想请您帮忙解答一下,哪里理解地不对请您指正。
您好,感谢您关注我们的工作。
- betas用于决定本block输出可以去向哪些block,等价于“用来选择从前面哪个通道的block中接收输入”,输入输出维度的转化问题;head_alphas 和 stack_alphas分别用于决定head layer和stacking layer里的operation type
- 搜索时的val dataset是从原始training dataset中分出来,最终retrain衡量指标用的是原始val dataset,两者并不重合
感谢您的回复
还有一个小问题,您 search.py 搜出来的网络结果中inference部分会产生一个分类的准确率;按照您搜出来的这个网络架构重新训练分类网络也会得到一个分类准确率,这两个准确率有没有直接关系?
搜索空间中直接inference得到的accuracy和最终训练的accuracy有一定相关性,但是由于differentiable方法可以看作一个approximation的过程,这个相关性不一定会非常的一致。super network中网络的accuracy和最终训练的accuracy之间的ranking问题在one-shot NAS的方法中会经常被提到和研究,因为其经常依赖于采样精度进行网络导出,一些one-shot方法对ranking问题做出了相应改进和论证,可作参考。