学习了MatConvNet的STN的代码,
网络结构是这样的:
affinegrid和sampler都是没有要更新的weight的,
有ST的训练结果是这样:
没有ST的训练结果是这样:
下面是STN的U和V的对比:
网上有博客说误差流传到locNet就断了,我觉得不对,
我觉得,误差流从后面层流到前面层是说前面层的权值更新需要后面层的权值参与计算。求导就能看出来STN是两个流在反向传播的时候到U合并了:
V对Z的求导是需要LocNet里的权值参与计算的。
最后,我觉得STN和ResNet很像,网络在一个节点分叉,一条路保留前一层结果,一条路做变换,然后汇合。这个就像是memory把前一层结果原封不动记住,前一层经过变换得到新的结果,再和memory里的前一层结果做运算。
感觉STN真的很诡异,想让它是什么变换就是什么变换,就像真的猜对了神经网络是怎么想的、、、