之前有几次尝试过用另外一种框架重写模型,包括caffe->tf,pytorch<-->tf
如果作者有release code和pretrained model weight,那其实很简单,就是用新框架重写一下模型结构,然后转化一下权重,重新load就完事了,需要注意几点:
1. 不同框架可能同一种op的实现方式略有差异,但是基本上不会影响最后的整体结果(细微的差异肯定是有的):比如当input feature map的size是偶数,stride=2的时候,总有一行边界无法计算,这事tf和pytorch的CONV的处理方式会略有差异,tf是用左上角部分,pytorch是用右下角部分(当然一开始为了简单起见,可以挑选一个合适的input image size,让中间层的feature map size都是奇数,这样就会不会有这个问题了)
2. 重写模型的时候,最好按照原始code中模型的构建顺序来写,这样load参数的时候,就不需要考虑2个不同框架之间variable的mapping,
3. 当然对于TF-Pytorch转换,TF中的ckpt文件用saver.restore读出来的权重是乱序的,这时候可以先跑下tf的inference model,然后tf.global_variables()得到的就是和Pytorch一样的variable顺序了,就可以构造权重的mapping关系了
4. 重写的目的就是要:每层的输出尽可能一致。所以如果最终inference的结果与原始code不一致,就要单独的考察每层的输出。(甚至有时候需要把出错层的权重拿出来,单独构造一层做对比)
5. 一开始可以构造简单的输入case,比如全0的矩阵
6. 注意BN层4个变量的对应关系(tf计算bn的时候,注释variance虽然没有写根号,但是实际运算会开根号)
如果能转换正确,后面只需要写下loss function和dataloader就能自己train起来了。