如何在Fortran中使用神经网络(基于Pytorch或Tensorflow)?

5

Python 在神经网络开发和训练方面广受欢迎且效果优秀。然而许多科学代码是用 Fortran 语言编写的。我该如何在我的 Fortran 程序中调用已训练好的神经网络?


如果您有以自包含C++函数形式的网络,您可以像调用其他C++函数一样调用它。然而,为此制作教程太过宽泛。在C++ API中如何调用Tensorflow/Keras网络? - Vladimir F Героям слава
Vladimir,感谢您的回答。Pytorch网络可以保存为torchscript https://pytorch.org/docs/stable/jit.html 我在哪里可以找到有关如何在Fortran中使用torchscript的信息? - Arsen
你首先必须从C++中找出如何使用它。然后,你可以使用通用方法来从Fortran中调用C++。 - Vladimir F Героям слава
3个回答

1

这样做没有意义。您不是在Fortran中训练网络,而只是尝试从Fortran运行C++或Python代码。

您应该将训练/推理与Fortran代码分离。您可以在Fortran中进行编排。

  1. 在Python中创建模型
  2. 通过API公开您的模型,以便您可以通过http请求从Fortran访问它。

这样做,您可以向Fortran应用程序公开任何内容。


这是有道理的。渴望在C++或Fortran中使用训练好的模型完全是合法的。那HTTP与此有何关联?就像这个 https://dev59.com/SlcO5IYBdhLWcg3w-VxX 或者 https://dev59.com/HVoV5IYBdhLWcg3wEreD,一旦有了一个可用的C++函数,从Fortran调用它就只是例行公事。 - Vladimir F Героям слава
将ML代码从Fortran代码中解耦会更容易。您始终可以通过httpRequest进行耦合。除非在tensorflow / python中没有可用的Fortran库,否则我不会这样做(我已经做了很多Fortran,我认为那不是问题)。 - CrazyBrazilian
但为什么呢?如果你可以用C++做到,那么从Fortran调用C++函数只是一个技术细节。在Fortran中很少使用Http相关的内容,甚至语言本身也没有足够的支持,而与之不同的是调用C语言函数。 - Vladimir F Героям слава
@Arsen 很难说你知道什么,不知道什么。通常情况下,你肯定需要知道如何从Fortran中调用C。你是否了解 bind(C)iso_c_binding?如果不了解,你需要先学习它。网络上有许多教程和许多关于 [tag:fortran-iso-c-binding] 的问答。 - Vladimir F Героям слава
@Arsen 虽然不确定,但在这里 https://fortran-lang.discourse.group/ 发布问题可能会有用(希望有人熟悉pytorch + C++或Fortran的使用)。 - roygvib
显示剩余2条评论

1

英特尔编译器也可以使用。只需要下载cxx11 ABI(错误出现在pre-cxx11 ABI上)。 - Arsen
那么,你从Python调用了PyTorch,然后将其发送到Fortran,是这样吗?你是否尝试过GitHub上的Forpy项目?'https://github.com/ylikx/forpy' - ALIN
不,我从C++中调用了torchscript(PyTorch的C++后端),并将其传递给Fortran。 - Arsen

0
有点晚了,但是正如其他答案所暗示的,你可以使用Fortran通过Fortran C绑定调用使用TorchScript保存的PyTorch模型的libtorch。
这里有一个库,名为FTorch,已经打包了这段代码,并且提供了如何保存神经网络并编写Fortran代码调用它的示例:https://github.com/Cambridge-ICCS/FTorch 它可以在gnu和intel编译器上运行。
免责声明:我参与了这个库的编写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接