flownet2网络迁移笔记pytorch to mindspore(1)

flownet2网络是什么

flownet2网络是一个对光流进行深度学习的网络,flownet2实际上是在flownet的基础上对网络的结构和训练方法进行了优化。
flownet提出两种新的网络结构分别为flownetC和flownetS,其中flownetC以一对图片作为输入,先通过卷积提取一部分特征之后,然后通过correlation算子 比较两张图片中的特征。
flownet论文中分别对这两种网络结构进行训练,并且与baseline相比较,都有了较大的提升。
flownet2网络迁移笔记pytorch to mindspore(1)_第1张图片
flownet2在 flownet的基础上提出了三个新的优化方向:

  1. 网络训练时使用的数据集的顺序也会影响训练结果。使用flyingChairs作为初始训练集,训练Slong阶段,使用flyingthings3d作为Sfine阶段的训练数据集,并且在训练的过程中对学习率逐步减半,论文给出了以下最优训练步骤
    flownet2网络迁移笔记pytorch to mindspore(1)_第2张图片

  2. 使用堆叠网络的方式来优化训练结果,即不仅仅用单个的flownetC 或 flownetS 来训练,而是将这些网络堆叠起来,一个网络的训练结果输出作为下一个网络的输入使用,那这个中间需要做什么处理呢?论文提出新的warp算子用于融合前一个网络输出flow和初始输入image2,并由初始输入image1减去对应的warp的结果,得到Brightness Error, 并将这些一起作为下一个网络的输入。
    flownet2网络迁移笔记pytorch to mindspore(1)_第3张图片

  3. 新创建了一个网络用于学习图片中的小位移 – flownetSD

网络迁移难点

网络迁移过程使用nvidia官方发布的flownet2-pytorch作为参考flownet2-pytorch
网络分数据处理,网络对应算子迁移,loss,优化器等。

nvidia发布的代码已经封装的很完整了,使用的优化器和loss函数也都是常用的,通过参考mindspore提供教程和算子api对应,进行替换即可。

网络中除了基础的网络结构之外,除了基础的网络结构,比较麻烦的是需要将pytorch实现的自定义算子在mindspore中实现,pytorch中的自定义算子可以通过pip 的方式进行安装,所以可以放在项目中的子文件夹中,灵活性更强。而mindspore中的自定义算子需要写在源码中,并且mindspore中的算子结构与tf中的算子结构更相似。但是不管怎样,基本上都是由python 前端定义和 c++和cuda 算子后端逻辑实现共同组成。
具体如何实现,将在下一篇中详细介绍。

[1]: FlowNet: Learning Optical Flow with Convolutional Networks
[2]: FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks

你可能感兴趣的:(pytorch,深度学习)