一行代码切换TensorFlow与PyTorch,模型训练也能用俩框架

              本文重点:一行代码切换TensorFlow与PyTorch,模型训练也能用俩框架

              你是否有时要用PyTorch,有时又要跑TensorFlow?这个项目就是你需要的,你可以在训练中同时使用两个框架,并端到端地转换模型。 也就是说TensorFlow写的计算图可以作为某个函数,直接应用到Torch的张量上,这操作也是很厉害了。 在早两天开源的TfPyTh中,不论是TensorFlow还是PyTorch计算图,它们都可以包装成一个可微函数,并在另一个框架中高效完成前向与反向传播。

              很显然,这样的框架交互,能节省很多重写代码的麻烦事。 github项目地址:BlackHC/TfPyTh目前GitHub上有很多优质的开源模型,它们大部分都是用PyTorch和TensorFlow写的。 如果我们想要在自己的项目中调用某个开源模型,那么它们最好都使用相同的框架,不同框架间的对接会带来各种问题。 当然要是不怕麻烦,也可以用不同的框架重写一遍。 以前TensorFlow和PyTorch经常会用来对比,讨论哪个才是更好的深度学习框架。 但是它们之间就不能友好相处么,模型在两者之间的相互迁移应该能带来更多的便利。

              在此之前,Facebook和微软就尝试过另一种方式,即神经网络交换格式ONNX。 直观而言,该工具定义了一种通用的计算图,不同深度学习框架构建的计算图都能转化为它。 虽然目前ONNX已经原生支持MXNet、PyTorch和Caffe2等大多数框架,但是像TensorFlow或Keras之类的只能通过第三方转换器转换为ONNX格式。

              而且比较重要的一点是,现阶段ONNX只支持推理,导入的模型都需要在原框架完成训练。 所以,想要加入其它框架的模型,还是得手动转写成相同框架,再执行训练。

              既然ONNX无法解决训练问题,那么就轮到TfPyTh这类项目出场了,它无需改写已有的代码就能在框架间自由转换。 具体而言,TfPyTh允许我们将TensorFlow计算图包装成一个可调用、可微分的简单函数,然后PyTorch就能直接调用它完成计算。

              反过来也是同样的,TensorFlow也能直接调用转换后的PyTorch计算图。

              因为转换后的模块是可微的,那么正向和反向传播都没什么问题。

              不过项目作者也表示该项目还不太完美,开源3天以来会有一些小的问题。

              例如张量必须通过CPU进行复制与路由,直到TensorFlow支持__cuda_array_interface相关功能才能解决。 目前TfPyTh主要支持三大方法:torch_from_tensorflow:创建一个PyTorch可微函数,并给定TensorFlow占位符输入计算张量输出;eager_tensorflow_from_torch:从PyTorch创建一个EagerTensorFlow函数;tensorflow_from_torch:从PyTorch创建一个TensorFlow运算子或张量。 如下所示为torch_from_tensorflow的使用案例,我们会用TensorFlow创建一个简单的静态计算图,然后传入PyTorch张量进行计算。

              importtensorflowastfimporttorchasthimportnumpyasnpimporttfpythsession=()defget_torch_function():a=(,name=a)b=(,name=b)c=3*a+4*b*bf=_from_tensorflow(session,[a,b],c).applyreturnff=get_torch_function()a=(1,dtype=,requires_grad=True)b=(3,dtype=,requires_grad=True)x=f(a,b)assertx==()((,),(3.,24.))我们可以发现,基本上TensorFlow完成的就是一般的运算,例如设置占位符和建立计算流程等。

              TF的静态计算图可以通过session传递到TfPyTh库中,然后就产生了一个新的可微函数。 后面我们可以将该函数用于模型的某个计算部分,再进行训练也就没什么问题了。